You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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生命周期钩子,在新实例启动后触发部署流程:
    1. 在ASG中创建生命周期钩子,指定钩子名称、生命周期转换为EC2_INSTANCE_LAUNCHING,目标操作选择“继续”或调用Lambda函数。
    2. 编写Lambda函数,调用CodeDeploy的create-deployment API,将新实例ID指定为部署目标,直接部署当前的最新版本包。
    3. 确保Lambda拥有codedeploy:CreateDeployment、autoscaling:CompleteLifecycleAction等必要权限。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 23:03:26