在ECS EXEC特性出来之前,如果想docker exec到容器内部,需要:
docker exec这种方式对于Fargate不适用,如果想登录到Fargate上的容器就不好办。
ECS Exec是借助SSM来实现登录到容器内部,本节我们介绍登录到fargate的容器中。
SSM Session Manager plugin:在本地端要安装SSM Session Manager plugin for the AWS CLI , 参考 https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html#install-plugin-macos
在mac上安装:
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
unzip sessionmanager-bundle.zip
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
容器中要运行SSM代理, 代理会调用 SSM 服务来创建安全通道。 因此,ECS 任务需要具有适当的 IAM 权限,SSM 代理才能调用 SSM 服务。
SSM 代理并不作为单独的容器 sidecar 运行,而是作为应用程序容器内的附加进程运行。
为ecsTaskRole加上SSM的相关权限:

并更新Dogs Task Defination,创建新的 revision:

task Role配置使用ecsTaskRole:

同时添加额外一个容器,为了后面测试登录到不同容器上:

创建新的Task Defination版本。
在demo-ecs集群上重新部署dogs服务:

使用最新的版本:

ECS会启用更新部署,部署完成后,还要开启enableExectueCommand:
aws ecs update-service --cluster demo-ecs --service dogs --region us-west-2 --enable-execute-command --force-new-deployment
--enable-execute-command参数是在task中开启ECS Exec功能。--force-new-deployment 是强制重新部署,让上面的参数生效更新完成后,复制出来一个task id:

检查task上有没有开启这个参数
aws ecs describe-tasks --cluster demo-ecs --tasks 01428743ca03474f94b90018e3294628 --region us-west-2
确认状态为true:

现在可以执行ecs exec登录到fargate:
aws ecs execute-command \
--region us-west-2 \
--cluster demo-ecs \
--task 01428743ca03474f94b90018e3294628 \
--container dogs \
--command "/bin/bash" \
--interactive

同样可以登录到jenkins:
aws ecs execute-command \
--region us-west-2 \
--cluster demo-ecs \
--task 01428743ca03474f94b90018e3294628 \
--container jenkins \
--command "/bin/bash" \
--interactive

在使用ECS Exec时,很容易在一开始遇到各种报错。推荐使用 https://github.com/aws-containers/amazon-ecs-exec-checker
这个工具。下载下来后,执行:
$ export AWS_REGION=us-west-2
$ ./check-ecs-exec.sh <YOUR_ECS_CLUSTER_NAME> <YOUR_ECS_TASK_ID>
如果扫描出来红色的,是一定要修复的:

可以参照github中的修复建议:

参考: