亚马逊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命令,如下图所示:
用户使用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 环境安装如下:
安装完成之后,运行如下命令验证:
其他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:
在 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如下:
关键步骤示意图如下:
- 创建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 execute-command” Remote到Fargate
在完成上述动作之后,通过如下命令就可以remote到Container中:
尝试修改 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的功能,希望这个能够帮助到您。
参考资料
- https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.htm
- https://aws.amazon.com/cn/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/