亚马逊AWS官方博客

如何利用Amazon ECS Exec 提高 Amazon ECS Troubleshooting 效率

前言

Amazon Elastic Container Service (Amazon ECS) 是一个完全托管的容器编排服务,可帮助您轻松部署、管理和扩展容器化的应用程序。它与 AWS 平台的其余部分深度集成,可提供安全、易于使用的解决方案。Amazon ECS内置了 AWS 配置和操作最佳实践,使得用户不必管理任何控制平面、节点或附加组件。

Amazon ECS 数据平面支持EC2 和Fargate两种模式,用户可以按需选择。

在Amazon ECS上,用户怎么做trouble shooting呢?

数据平面使用EC2的用户,大致可以通过如下步骤来登陆到container上:

  • 配置EC2的Security Group, SSH Key等,从而允许ssh登陆;
  • 根据ECS的Task定位具体在哪台EC2上;
  • SSH到EC2;
  • 执行 ‘docker exec’ remote到 container中进行trouble shooting

那数据平面使用Fargate,该如何登陆到container上呢?这个问题,在2021年5月份之后,有了答案: 就是Amazon ECS 发布的新的功能, Amazon ECS Exec。使用Amazon ECS Exec,不仅可以大幅降低EC2上登陆到container上的复杂度,也将登陆到Fargate上做troubleshooting变为了可能。

在本文中,将详细为您介绍演示如何利用Amazon ECS Exec在Fargate上进行trouble shooting。

Amazon ECS Exec原理解析

Amazon ECS Exec 的底层实现利用了 Amazon Web Services Systems Manager (SSM) 的SSM Session Manager, 通过Session Manager 在调试的客户端和Container之间建立了一个安全通道,来执行exec命令,如下图所示:

                         <-HOST->
                         
                         aws ecs run-task ------------------|
                                                            V
                                                       _____________
                                                       |           |
  ___customer_task___________    |---------------------| ECS Agent |
  | _______________________ |    |(1.mount)            |           |    
  | | customer container  | |    V                     -------------
  | | /exec-deps/    *<---|-|--/SSM Agent (Exec Agent)
  | |                *<---|-|--/session-worker & logger
  | |                *<---|-|--/certs
  | |                *<---|-|--/configuration
  | |                     | |
  | |/var/log/amazon/ssm/-|-|->/var/log/ecs/execAgent/<containerID>/
  | ----------------------- |
  ---------------------------

用户使用EC2的 Amazon vetted ECS optimized AMI 或者 Fargate,SSM Agent会自动被集成到Container中, 不需要用户做额外的工作,用户只需要关心自己的应用代码。 在SSM 建立安全通道之后,用户就可以通过ECS Exec执行交互式命令(类似于docker exec -it)。

如何使用 Amazon ECS Exec

目前,Amazon Web Services SDK, Amazon Web Services CLI 和 Amazon Web Services Copilot, Amazon Web Services CloudFormation 已支持Amazon ECS Exec的功能,控制台还没有支持。并且,Amazon Web Services ECS Exec还只支持 Linux container,Windows container还不支持。

如下以ECS Fargate 为例,使用Amazon Web Services CLI的方式来演示如何使用Amazon ECS Exec的功能:

环境准备

SSM Session Manager Plugin

如上文所讲,Amazon ECS Exec依赖于 Amazon Web Services Systems Manager (SSM) 的SSM Session Manager,所以需要安装 SSM Session Manager plugin for the Amazon Web Services CLI

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

安装完成之后,运行如下命令验证:

session-manager-plugin

其他OS安装可参考:官方Doc

Amazon Web Services CLI 版本

Amazon Web Services CLI V1在1.19.28 之后增加了对ECS Exec的支持,V2在 2.1.31 之后增加了对ECS Exec的支持(详情参看[Amazon Web Services CLI Changelog](https://github.com/aws/aws-cli/blob/v2/CHANGELOG.rst) 所以,请确保Amazon Web Services CLI升级到了对应的版本。

Amazon ECS 版本

使用Amazon ECS Exec要求 Platform Version 1.4及以上,所以请确保升级到支持的版本;

如何使用Amazon ECS Exec

在本篇文章中,使用 Amazon ECS Get Started 中的 sample-app 来演示如何使用Amazon ECS Exec。

先通过控制台,在ECS中创建sample-app,模拟在ECS中运行的任务;

然后演示如何使用Amazon ECS Exec的功能来Remote到Container中进行troubleshooting。

创建sample-app

进入ECS 界面,点击 Get Started:

选择 sample-app, 点击 Next:

Load balancer type选择 Application Load Balancer, 点击 Next:

修改cluster name, 点击 Next:

在 Review界面确认信息无误后,点击 Create 按钮:

等待ECS Cluster和Service完成之后,点击 View Service,进入到ECS Cluster界面。

在浏览器中打开Task对应的Load Balancer的Public DNS 地址,进入如下界面(在北京/宁夏区域,需要完成ICP备案才能打开):

使用Amazon ECS Exec来进行Trouble shooting

接下来演示如何使用Amazon ECS Exec来remote到Container中,并修改网页展现的内容。

具体步骤如下:

修改 ECS Task IAM Role

Amazon ECS Exec 实现利用了SystemManager,所以在Task IAM Role中,为 SSM agent加入对应的权限。

sample-app 中的first-run-task-definition,默认没有指定Task role。

需要在IAM中新建对应的Policy 和 Role:

Policy 的JSON如下:

{
   "Version": "2012-10-17",
   "Statement": [
       {
       "Effect": "Allow",
       "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
       ],
      "Resource": "*"
      }
   ]
}

关键步骤示意图如下:

  • 创建amazon-ecs-exec-policy


  • 创建 amazon-ecs-exec-task-role



  • 修改 Task Definition中的Task Role


修改 Task Definition中的linuxParameters

本项为可选,但是强烈推荐。

用户使用ECS Exec 登陆到container之后,可能会运行一些危险的命令,比如终止容器的主进程。在主进程被中止之后,SSM Agent的子进程将会成为僵尸进程。将Task Definition中的initProcessEnabled 设置成 true之后,会启动 init process, 自动清理SSM agent的僵尸进程。

关键操作如下图:


启用 Amazon ECS Exec

做好上述配置,就可以启用 Amazon ECS Exec的功能了, 这个需要在Amazon Webservices CLI 来操作。

可以使用create-service, update-service, start-task, 或者 run-task 的命令,加上 –enable-execute-command 的参数。

Amazon ECS Exec不能对已经启动的Task开启,必须在新建时打开,或者通过更新来重启。 在sample-app中,已经启动了sample-app-service, 所以这里通过 update-service 来开启ECS Exec功能:

aws ecs update-service \
  --cluster ecs-exec-demo-cluster \
  --service sample-app-service \
  --task-definition first-run-task-definition \
  --enable-execute-command 

使用 “aws ecs execute-command” Remote到Fargate

在完成上述动作之后,通过如下命令就可以remote到Container中:

aws ecs execute-command --cluster cluster-name \
    --task task-id \
    --container container-name \
    --interactive \
    --command "/bin/sh"

具体操作如下图:

尝试修改 index.html的内容,把 Amazon ECS Sample App 替换为 Amazon ECS Exec Demo:

刷新页面,验证修改:

页面内容已经从验证成功Amazon ECS Sample App 变成 Amazon ECS Exec Demo, 验证成功。

总结

在使用ECS On Fargate时,如何能够Remote到Container中,一直是一个比较麻烦的问题,现在通过ECS Exec的新功能,终于可以方便,快捷的实现了。

在本文中,介绍了Amazon ECS Exec的原理,并利用Getting Started 的sample-app来演示了如何使用ECS Exec的功能。

通过ECS Exec remote到Container中,也是一项极具危险性的操作,ECS Exec 在设计之初,也非常贴心的考虑到了这些问题,可以通过IAM Policies来做访问限制,也可以通过CloudWatch等来做Audit,限于篇幅原因,在本文中就不再详细演示,感兴趣的可以自行查阅官方文档

特别要指出的是,Amazon Web Services所有公开的Region,包括北京/宁夏两个Region,都支持了ECS Exec的功能,希望这个能够帮助到您。

参考资料

本篇作者

韩医徽

AWS 解决方案架构师,负责 AWS 合作伙伴生态系统的云计算方案架构咨询和设计,同时致力于 AWS 云服务在国内的应用和推广。