aws 剖析codedeploy 和 ec2 autoscaling 集成
参考资料
- Under the Hood: AWS CodeDeploy and Auto Scaling Integration
- Integrating CodeDeploy with Amazon EC2 Auto Scaling
- How lifecycle hooks work
- AppSpec ‘hooks’ section for an EC2/On-Premises deployment
生命周期钩子
在缩放期间,Auto Scaling 和 CodeDeploy 之间基于 Auto Scaling 生命周期钩子进行通信。Auto Scaling 生命周期钩子告诉 Auto Scaling 在实例即将更改为某些 Auto Scaling 生命周期状态时发送通知
CodeDeploy 只侦听有关已启动并即将处于 InService 状态的实例的通知。此时实例的状态处于,在实例完成启动引导但在负载均衡器上注册之前。Auto Scaling 在继续处理实例之前,需要等待 CodeDeploy 的成功响应。

CodeDeploy 执行的操作
创建和修改以ASG为目标的部署组时,CodeDeploy 执行以下操作
-
使用CodeDeploy服务角色获取访问部署组的权限
![在这里插入图片描述]()
-
在AutoScaling组中安装生命周期钩子,向Codedeploy拥有的队列发送通知。此处没有在management console找到设置位置,目测只能使用cli工具
aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-termination-hook \ --auto-scaling-group-name my-asg \ --lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING \ --notification-target-arn arn:aws:sns:region:123456789012:my-sns-topic \ --role-arn arn:aws:iam::123456789012:role/my-notification-role在Codedeploy中的部署组指定某个ASG之后,该ASG会自动创建相应的生命周期钩子,通知目标目测是Codedeploy官方所有的sqs
![在这里插入图片描述]()
-
将生命周期钩子的记录添加到部署组
在自动缩放过程中发生的事件
- Auto Scaling向EC2请求新实例
- EC2使用Auto Scaling的配置启动新实例
- Auto Scaling查看新实例,将其转为
Pending: Wait状态,并通知CodeDeploy(生命周期钩子将通知发送给SQS 队列) - CodeDeploy 接收来自 Auto Scaling 的实例启动通知
- CodeDeploy 验证实例和部署组的配置
- 如果正确通知到codedeploy,但是部署组没有目标,则不执行部署
- 如果codedeploy无法处理消息(例如没有权限),等到10分钟超时
- CodeDeploy创建新部署部署目标修订(revision),即最后一个成功部署的修订(由codedeploy维护)
- 部署运行时,向 Auto Scaling 发送心跳信号(每5分钟1次,表示实例处理中)
- 如果部署异常,CodeDeploy 将立即通知 Auto Scaling 放弃实例启动,自动缩放终止实例并使用新实例重新启动流程
完整流程如下图
最佳实践和注意
- 不要手动修改Auto Scaling钩子
- 密切监控部署过程,防止部署失败重启的死循环
- 部署执行和启动脚本(如用户数据、 cfn-init 等)之间没有顺序,除非严格控制实例启动之后的事件发生顺序,否则部署可能会失败
- 应避免将多个部署组与同一个自动缩放组关联。当自动伸缩使用与多个部署组相关联的多个钩子来扩展实例时,它会同时为所有钩子发送通知(无法控制部署发生的顺序)。如果任何部署失败,自动缩放将立即终止实例。当实例关闭时,正在运行的其他部署将开始失败,但它们可能需要一个小时的超时时间。宿主代理一次只处理一个部署命令
- 如果在部署过程中发生缩放事件,则新实例将使用最近部署的最新应用程序修订进行更新,而不是当前正在部署的应用程序修订,造成不一致
- CodeDeploy 有1小时的超时时间等待CodeDeploy 代理来响应待处理的部署



浙公网安备 33010602011771号