aws 剖析codedeploy 和 ec2 autoscaling 集成

参考资料

生命周期钩子

在缩放期间,Auto Scaling 和 CodeDeploy 之间基于 Auto Scaling 生命周期钩子进行通信。Auto Scaling 生命周期钩子告诉 Auto Scaling 在实例即将更改为某些 Auto Scaling 生命周期状态时发送通知

CodeDeploy 只侦听有关已启动并即将处于 InService 状态的实例的通知。此时实例的状态处于,在实例完成启动引导但在负载均衡器上注册之前。Auto Scaling 在继续处理实例之前,需要等待 CodeDeploy 的成功响应。

The lifecycle of instances using lifecycle hooks

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 放弃实例启动,自动缩放终止实例并使用新实例重新启动流程

完整流程如下图

img

最佳实践和注意

  • 不要手动修改Auto Scaling钩子
  • 密切监控部署过程,防止部署失败重启的死循环
  • 部署执行和启动脚本(如用户数据、 cfn-init 等)之间没有顺序,除非严格控制实例启动之后的事件发生顺序,否则部署可能会失败
  • 应避免将多个部署组与同一个自动缩放组关联。当自动伸缩使用与多个部署组相关联的多个钩子来扩展实例时,它会同时为所有钩子发送通知(无法控制部署发生的顺序)。如果任何部署失败,自动缩放将立即终止实例。当实例关闭时,正在运行的其他部署将开始失败,但它们可能需要一个小时的超时时间宿主代理一次只处理一个部署命令
  • 如果在部署过程中发生缩放事件,则新实例将使用最近部署的最新应用程序修订进行更新,而不是当前正在部署的应用程序修订,造成不一致
  • CodeDeploy 有1小时的超时时间等待CodeDeploy 代理来响应待处理的部署
posted @ 2022-12-25 11:54  zhaojie10  阅读(6)  评论(0)    收藏  举报  来源