AWS ECS Fargate容器调试_aws ecs 如果在容器里重启task-程序员宅基地

技术标签: 容器  serverless  aws  AWS  docker  云计算  

简介

在“创建 ECS Fargate”一文中我们介绍了 ECS Fargate,一种无服务器模式的服务。

因为没有下一层服务器,所以既节省了资源(成本)又减化了维护工作量。

但方便的同时也会带来一些问题,在实践中我们碰到最多的就是如何调试的问题。

比如安装在一台 linux 服务器的 tomcat 服务器,如果我们想改 tomcat 的配置,只要登录 linux 服务器,进入 tomcat 安装目录,修改 conf 文件再重启 tomcat 就可以了。

再比如安装在一台 linux 服务器的 nginx 服务器,如果我想修改路由的转发路径,只要登录 linux 服务器,进入 nginx 安装目录,修改 conf 文件再重启 nginx 就可以了。

如果需要调试的应用是运行在 k8s 上,则我们可以登录 k8s 所在的服务器,然后用 kubectl exec 命令进入容器内部进行调试。

这三例子的共同点是我们首先都要登录应用或者其容器所在的服务器,然后进行修改重启的操作。

现在 ECS Fargate 中并没有下层服务器,如何进行类似的调试呢?

我们可以给容器增加 open-ssh 模块,然后利用 ssh 直接远程登录到容器内部,然后就可以进行调试工作。

本文利用“创建 ECS Fargate”中创建的 Fargate 集群,先创建一对 RSA KEY,然后以 httpd 官方镜像为基础增加 openssl 软件,最后在创建 Fargate task 时通过环境变量引入 Public key。这样在 task 运行后就可以通过 ssh 登录进入容器内部进行调试。

目录

  • 环境(配置)
  • 实战步骤
    1. 创建 Key pair
    2. 创建新镜像
    3. 创建新 task 版本
    4. 更新 service
    5. 检查结果
  • 引申
  • 资源下载
  • 后记

环境(配置)

  • AWS 中国或 Global 帐号,可在官网申请,一年内使用指定资源免费
  • AWS cli, 本文在 win10 + terminal 下使用 aws cli
  • openssl, 本文在 win10 + terminal 下使用 openssl

实战步骤

1. 创建 Key pair

RSA 加密算法是一种非对称加密算法。在公开密钥加密和电子商业中 RSA 被广泛使用,另外在 linux 系统维护中也经常使用这种技术。

我们只需要把 RAS Key pair 中的公钥(Public key)放到所要登录的服务器中后,就能用私钥(Private Key)进行免密码登录。

可以使用 ssh-keygen 命令生成 RAS Key pair,也可以利用在线网站生成,后者更简单。这里我们用命令的形式。

在装有 openssl 的 terminal 或者 linux 上运行下列命令

ssh-keygen -b 1024 -t rsa

说明:

  • b 指定生成 1024 位 key
  • t 指定 RSA 加密算法

运行结果
图 1

说明:

只需要输入保存路径和名子即可,后面直接回车。

id_rsa_test.pub 生成的公钥
图 2

最后一部分红框部分是运行 ssh-keygen 命令所在的服务器和用户名,这部分连同前面的一个空格是不需要的。

id_rsa_test 生成的私钥

图 3

生成好 Key pair,接下来我们创建新版本的 task

2. 创建新镜像

本文利用“AWS Fargate OpenID SSO 集成实现”中创建的目录和文件

└── Fargate_SSO
    ├── conf
    │   ├── htaccess
    │   ├── httpd.conf
    │   └── oidc.conf
    ├── Dockerfile
    ├── entrypoint.sh
    ├── libapache2-mod-auth-openidc_2.3.11-1.stretch+1_amd64.deb
    └── test.html

进入“Fargate_SSO”目录打开 Dockerfile,加入以下红框的内容

图 5

说明:

  • 第一部分加入了 openssh-server,procps 和 vim。openssh-server 是 ssh 连接必需的,procps 和 vim 是调试时常用的工具,后面两个不加也可以。
  • 第二部分是对 openssh-server 修正
  • 第三部分是加入 openssh-server 需要的控制文件 sshd_config,如果需要对 ssh 登录的默认端口 22 进行修改的话,要在此文件里修改。

打开 entrypoint.sh,在最后加入以下内容

# Create a folder to store user's SSH keys if it does not exist.
USER_SSH_KEYS_FOLDER=~/.ssh
[ ! -d "$USER_SSH_KEYS_FOLDER" ] && mkdir -p $USER_SSH_KEYS_FOLDER && chmod 700  $U
SER_SSH_KEYS_FOLDER && echo $SSH_PUBLIC_KEY > ${USER_SSH_KEYS_FOLDER}/authorized_ke
ys

# Copy contents from the `SSH_PUBLIC_KEY` environment variable
# to the `${USER_SSH_KEYS_FOLDER}/authorized_keys` file.
# The environment variable must be set when the container starts.

# Clear the `SSH_PUBLIC_KEY` environment variable.
unset SSH_PUBLIC_KEY

# Start the SSH daemon.
/usr/sbin/sshd -D

说明:

  • 第一部分把从环境变量取到的 Public Key 加入容器的 authorized_keys 文件中
  • 第二部分是以后台模式运行 sshd 进程

现在我们建新的镜像并推出镜像仓库

docker build --tag tansong0091/httpd-ssh:test-only .
docker push tansong0091/httpd-ssh:test-only

镜像准备就绪,然后我们建 task 的新版本

3. 创建新 task 版本

修改“AWS Fargate OpenID SSO 集成实现”文章中 tstest_task.json 文件。

{

...
    "containerDefinitions": [
        {
            "name": "fargate-app1",
            "image": "tansong0091/httpd-ssh:test-only",
...

"environment": [
                {
                    "name": "SSH_PUBLIC_KEY",
                    "value": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC/alWrS+HH5KkPbso+Tsy+Z0WGTX5wvXvon5OacLMyOU3gj2mbbIifasXf/RadpuywuyW3uFirtRlPmSb5Q0PVLODku503Xettw+u6/Z22VV7F2ACgg4iHaCo2SR4L8saUrLLfcKXKr/WCn3w7uYcqGsXEcSFCCSZgn4BoZJqP4Q=="
                }
            ],
...

说明:

  • containerDefinitions 部分,把 image 改成新生成的镜像名称“tansong0091/httpd-ssh:test-only”。注意是全称,要包括 repository(tansong0091)这部分
  • environment,设置环境变量"SSH_PUBLIC_KEY",内容为上面产生的 Public Key,注意去掉最后用户名@服务器部分

然后运行新建 task 版本命令

aws ecs register-task-definition --cli-input-json file://tstest_task.json

提示:新建 task 的命令和新建 task 版本的命令是相同的,如果重复运行就会产生新的 task 版本。

运行结果

图 6

图 7

新建的 task 版本为“6”

4. 更新 service

修改“AWS Fargate OpenID SSO 集成实现”文章中 update-svc.json 文件,把 taskDefinition 中最后数字改成“6”。

{
    "cluster": "tstest",
    "service": "tstest-svc",
    "desiredCount": 1,
    "taskDefinition": "tstest-fargate-task:6",
...
    "forceNewDeployment": true,
...
}

保存文件并运行 update service 命令,更新镜像

aws ecs update-service --cli-input-json file://update-svc.json

新 task 启动中,再完全运行并通过 health check 后,老 task 才会停止,过一段时间后可以看到

图 8

点击上图中红框中的 task,进入 task 界面,记下 Public IP

图 9

5. 检查结果

找一台可以访问 internet 的电脑,创建私钥文件 id_rsa_test,并复制前面步骤中产生的 private key 到文件中。

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAIEAv2pVq0vhx+SpD27KPk7MvmdFhk1+cL176J+TmnCzMjlN4I9pm2yI
n2rF3/0WnabssLslt7hYq7UZT5km+UND1Szg5LudN13rbcPruv2dtlVexdgAoIOIh2gqNk
keC/LGlKyy33Clyq/1gp98O7mHKhrFxHEhQgkmYJ+AaGSaj+EAAAIIUWvlelFr5XoAAAAH
c3NoLXJzYQAAAIEAv2pVq0vhx+SpD27KPk7MvmdFhk1+cL176J+TmnCzMjlN4I9pm2yIn2
rF3/0WnabssLslt7hYq7UZT5km+UND1Szg5LudN13rbcPruv2dtlVexdgAoIOIh2gqNkke
C/LGlKyy33Clyq/1gp98O7mHKhrFxHEhQgkmYJ+AaGSaj+EAAAADAQABAAAAgFG0S9kQTN
GMMvWZbs5lyFNFtZF8Jops9yT2aIS1smevuiQuUv+6th6F7uyLFUo55DIT0Ce5km/In4Mw
dkhTg/IPWwGUtpQqE+KgOMR5HMNbPkZUg35hZ0Bb85Vxz7q8wtGhyuo1dULEl0P/winTBb
GirNjYbaT1T3vwtrvNCFSBAAAAQGuuXNgrzGlwuUBVA1h397U/YjxxZNzuunMb1o5dM0g2
TxCJSl5mXIbaag8DjUEPLiClVuaqa75FPZua7TGWqa0AAABBAOVaGSvSrnA1f0C49sv+07
WTZyydwAco5RJEoHA9XJUJ2motEno6dDLP/h3FVh4D30umCu3NBORVzboEwPUquZkAAABB
ANWn116XjcXUH+3H0Tn5Qn5lNT5EYFvRANb30gODIoW24qqo+npeTeNP3VtjF7Wd71jY7y
WF77JBCFMljarPRYkAAAAOdGFuc0BHRFNWR1FRMkUBAgMEBQ==
-----END OPENSSH PRIVATE KEY-----

提示:如果利用 windows terminal 或者 linux 测试,需要把文件的权限改成 400。chmod 400 id_rsa_test

运行如下命令测试登录

ssh -i id_rsa_test [email protected]

图 10

从上面可以看到我们已经登录到 aws 的容器中,之后就可以按常规方法进行调试。

引申

  1. 安全处理:实际环境中我们一般不会在 task 容器中启动 Public IP,而是只有 Private IP。这时我们需要在 AWS 上有一台处在相同 subnet 的 EC2 做为堡垒机,从堡垒机上进入容器内部。

  2. 其它镜像:不同镜像基于的系统版本不同,所以加入 openssh 软件时的命令略有不同。在资源下载中放了 httpd,tomcat,java 三个不同的 Dockerfile 以供参考。

  3. 多容器镜像:当一个 task 中存在多个容器时,我们需要给每个容器分配不同的 ssh 端口,这可以在生成镜像时,修改 sshd_config 文件内的 port 实现。

  4. 环境变量:实际中我们可以把 Public key 保存在 AWS System manager 的 Parameter Store 中,然后在创建 task 时用 secret 参数引入。

资源下载

相关文件可以在以下链接下载
https://github.com/tansong0091/realCrapForAWS/tree/main/debug_container
https://github.com/tansong0091/realCrapForAWS/tree/main/Fargate_SSO

后记

本文使用的技术也是在实践中总结出来的,在应用部署到 AWS Fargate 之前根本就没有这种需求,因为可以在服务器上方便的进入容器进行调试。

虽然也可以在本地调试好之后再部署到 AWS Fargate 上,但总会碰到本地运行成功,在 Fargate 运行失败的情况。这时最有效的方法就是在 Fargate 的容器内直接调试。

喜欢请点赞,欢迎转发
微信公众号“全是 AWS 干货”
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jonest/article/details/116043951

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签