发布于: Oct 30, 2022
Auto Scaling Group 独有的高弹性计算性能是如何帮助我们打造一个云应用管理系统的呢?本文将由表及里,由浅入深为您介绍这一实现过程。
当 EC2 Auto Scaling 将实例标记为终止时,生命周期挂钩将实例设置为“Terminating:Wait”状态,同时生成 CloudWatch 事件,Amazon EventBridge 获取事件后, 触发 SSM Automation 来对被 terminate 的 EC2 执行命令,生成一个文件并把文件压缩,然后上传到 S3 上。整体架构如下:

1.前提条件 – SSM 配置,本方案要求 EC2 Auto Scaling Group 使用的 EC2 能够被 Amazon Systems Manager 管理, 因而要求 SSM 代理被正确安装和配置。
- 确保 EC2 Auto Scaling Group 使用的 EC2 AMI 安装 SSM 代理, Amazon Linux 和 Amazon Linux 2 默认情况下已经安装了 SSM 代理。可以通过 ps -ef 命令去检查 SSM 代理是否运行。

- 在 IAM 里创建一个 policy, 拥有对目标 S3 桶的写入(PutObject)权限

- 创建一个 IAM 实例配置文件,拥有”AmazonSSMManagedInstanceCore” policy 和上一步骤里创建的 S3 写入的 policy


- 安全组允许 HTTPS(端口 443)出站流量

- 在 EC2 console 界面里, 创建启动模版, 启动模版里配置上面的 AMI, 实例配置文件和安全组。


- 从上面的 EC2 启动模版里创建一个 Auto Scaling Group
验证: 1.在 Amazon System Manager 界面里, 选择托管实例, 可以成功地看到 EC2 Auto Scaling Group 里的所有 EC2 实例。

2. 给 EC2 Auto Scaling Group 创建一个 Terminate 的 lifecycle Hook, 默认 timeout 是 3600s,可以根据需求调整这个值

3.在 IAM 里,创建一个 SSM Automation 的 role
- 选择创建 role, trusted entity 选择 Amazon System Manager Service

- 添加 AmazonSSMAutomationRole policy,并完成 SSM Automation Role 的创建

- 选择上一步创建好的 role, 添加一个 Inline policy, 附加 iam:PassRole,resource 选择新创建的 SSM Automation 的 role

- 最终创建的 SSM Automation role 包含 2 个 policy,整体配置如下

4.创建 SSM Automation 文档
进入 Amazon System Manager 界面, 选择文档,然后选择创建自动化。在编辑器窗口, 粘贴下面的内容。
schemaVersion: '0.3' assumeRole: '{{AutomationAssumeRole}}' parameters: AutomationAssumeRole: type: String default: '' InstanceId: type: String mainSteps: - name: runCommand action: 'aws:runCommand' isCritical: true isEnd: true inputs: InstanceIds: - '{{InstanceId}}' DocumentName: AWS-RunShellScript Parameters: commands: - touch /tmp/testforSSMAutomation.txt - ec2InstanceId=$(ec2-metadata -i | cut -d " " -f 2) - tar -cvf /tmp/data-$ec2InstanceId.tar /tmp/testforSSMAutomation.txt - 'aws s3 cp /tmp/data-$ec2InstanceId.tar s3://shiyang-test6'
5. 在 Amazon EventBridge 里创建规则, 服务选择创建的 Auto Scaling, Event 选择 EC2 instance-terminate Lifecycle Action。

6. 继续创建 SSM Automation 目标, 选择 Input Transformer, 配置如下:

之后选择 “Create a new role for this specific resource”.

到这里整体的方案就配置完了,接下来进入方案验证。
- 进入 EC2 界面,选择创建的 Auto Scaling 组, 然后手动调小所需容量,从而引起缩容

- EC2 终止并进入“Terminating:Wait”状态

- 登陆到“Terminating:Wait”状态的 EC2, 确认 SSM Automation 文档里的 2 条命令被成功执行。

- 登陆到 S3 界面,确认生成的文件已经上传

- 如果在生命周期挂钩设置的 Timeout 之前结束,使用 complete-lifecycle-action 命令或 CompleteLifecycleAction 完成操作, 让 EC2 从“Terminating:Wait”状态,进入”Terminating:Proceed”状态,最终被 Terminated。
aws autoscaling complete-lifecycle-action --lifecycle-hook-name asgNamexxx --auto-scaling-group-name asgname --lifecycle-action-result CONTINUE --instance-id i-xxx --region xxx
以上内容介绍了利用 Systems Manager(SSM) Automation 来实现在 EC2 被 terminate 之前执行命令或脚本,完成优雅退出的一个整体解决方案。该方案结合 EC2 Auto Scaling 生命周期挂钩,Amazon EventBridge 和 Systems Manager(SSM) Automation 服务,来完成对 EC2 终止前的相关操作,并把 log 压缩上传到 Amazon S3 服务。客户可以根据自己的场景,来替换执行的命令或脚本,从而实现相关的业务需求。
相关文章