AWS EC2生命周期钩子:首次重启后触发LAUNCHED状态与CodeDeploy部署
解决Auto Scaling Group实例首次重启后触发CodeDeploy部署的问题
核心方案:分阶段UserData脚本+ASG健康检查适配
步骤1:拆分UserData为首次启动与重启后执行逻辑
通过本地标记文件区分实例首次启动和重启后的状态,让重启操作仅在首次启动时执行,后续初始化在重启完成后运行:
#!/bin/bash # 检查是否为重启后的首次运行 if [ -f /var/tmp/first_boot_flag ]; then # 重启后执行:完成剩余初始化 yum install -y required-packages systemctl enable --now target-service # 删除标记文件,避免重复执行 rm -f /var/tmp/first_boot_flag else # 首次启动执行:修改内核、安装基础依赖 echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf sysctl -p yum install -y base-packages # 创建标记文件 touch /var/tmp/first_boot_flag # 触发实例重启 reboot fi
步骤2:调整ASG健康检查规则
- 延长ASG的健康检查宽限期(建议设置为10-15分钟),覆盖实例重启和初始化的耗时,避免ASG在重启过程中误判实例不健康。
- 若使用ELB关联ASG,将ELB健康检查配置为检测实例上的关键服务端口或健康接口,确保只有当重启后的初始化完成、服务就绪时,实例才被标记为
InService。
步骤3:利用CodeDeploy与ASG的关联逻辑触发部署
CodeDeploy部署组关联ASG时,默认会在实例被ASG标记为InService后自动触发部署。通过上述步骤,实例仅在重启完成、初始化完毕后才会进入InService状态,自然就能实现“重启后再触发部署”的需求。
内容的提问来源于stack exchange,提问作者smirnoff
相关产品推荐
相关产品推荐

