关于AWS CodeDeploy向ASG新EC2实例部署旧版本应用的问题问询
AWS CodeDeploy部署期间ASG新实例拉取旧版本的解决方法
问题场景
当CodeDeploy部署正在执行时,Auto Scaling组(ASG)启动的新EC2实例获取的是应用旧版本,而非当前部署的最新版本,导致部署一致性问题,影响应用可靠性。
排查与解决步骤
1. 确认部署类型并调整(若需)
- 若当前使用In-place部署:这种模式仅更新现有实例,ASG扩容的新实例默认会从启动模板/配置的原始镜像或应用包拉取版本,不会自动加入正在进行的部署流程。
- 解决方案:切换为Blue/Green部署,该模式会先部署新版本到新实例组,验证后再切流量,ASG扩容的新实例会自动纳入新版本组;或者保留In-place部署,配合后续生命周期钩子实现新实例自动部署最新版本。
2. 配置ASG与CodeDeploy的自动集成
- 进入CodeDeploy部署组设置,确认已勾选Enable automatic deployment to instances added to the Auto Scaling group。此选项会让新加入ASG的实例自动部署该部署组的最新成功版本。
- 注意:若当前部署正在进行,新实例会等待当前部署完成后拉取最终的最新版本;若需要在部署过程中就让新实例获取正在部署的版本,需结合生命周期钩子。
3. 利用ASG生命周期钩子触发实时部署
- 添加
EC2_INSTANCE_LAUNCHING生命周期钩子,在新实例启动后触发部署流程:- 在ASG中创建生命周期钩子,指定钩子名称、生命周期转换为
EC2_INSTANCE_LAUNCHING,目标操作选择“继续”或调用Lambda函数。 - 编写Lambda函数,调用CodeDeploy的
create-deploymentAPI,将新实例ID指定为部署目标,直接部署当前的最新版本包。 - 确保Lambda拥有
codedeploy:CreateDeployment、autoscaling:CompleteLifecycleAction等必要权限。
- 在ASG中创建生命周期钩子,指定钩子名称、生命周期转换为
4. 修正启动模板/配置的应用来源
- 检查启动模板中的User Data或应用包路径,若硬编码了旧版本的S3路径,新实例会直接拉取旧版本。
- 修改User Data,在实例启动时主动调用CodeDeploy API拉取最新版本,示例脚本:
#!/bin/bash INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) aws deploy create-deployment \ --application-name 你的应用名称 \ --deployment-group-name 你的部署组名称 \ --instance-targets "[{\"InstanceId\":\"$INSTANCE_ID\"}]" - 确保实例拥有
codedeploy:CreateDeployment的IAM权限。
5. 验证CodeDeploy代理状态
- 在新实例上检查CodeDeploy代理运行状态:
service codedeploy-agent status - 查看代理日志排查通信或部署错误:
cat /var/log/aws/codedeploy-agent/codedeploy-agent.log - 若代理未运行,重启代理并设置开机自启:
service codedeploy-agent start systemctl enable codedeploy-agent
内容的提问来源于stack exchange,提问作者krishna vamsi
相关产品推荐
相关产品推荐

