You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

CodePipeline部署Beanstalk版本不匹配致健康降级,如何修复?

问题描述

我搭建了一套简洁的CodePipeline配置(截图如下):
CodePipeline配置

该管道几乎无需额外配置,仅需设置构件名称、项目名称即可。每次通过git push触发部署时,Beanstalk的“Health”标签页都会出现错误,但部署的代码仍能正常运行。

完整错误信息如下:

Incorrect application version "code-pipeline-1527260772846-80f1d98eca5f35bcc778b85efec9c71499bafeac" (deployment 20). Expected version "code-pipeline-1527254940377-f7fbab90f239cbdc2f54518cd8408082432e8e79" (deployment 1).

简化后为:

Incorrect application version "code-pipeline-some-id" (deployment 20). Expected version "code-pipeline-some-other-id" (deployment 1).

我能看到应用的所有变更,但Beanstalk显示实例状态为“degraded”。若通过CLI执行eb deploy部署同一应用,则无任何警告或错误,所有状态均正常。我的整个AWS基础设施由Terraform管理,请问如何修改“application version”以让Beanstalk恢复正常状态?


解决方案

我碰到过不少类似的场景,这个问题本质是CodePipeline部署时,Elastic Beanstalk环境的预期应用版本实际部署版本没同步上,再加上Terraform管理资源时的配置冲突,就导致了健康状态降级但代码能正常运行的矛盾情况。下面是几个针对性的解决办法:

1. 检查CodePipeline的部署配置,别硬编码版本号

先确认你的CodePipeline部署阶段是不是正确关联了Beanstalk环境:

  • 确保Deploy动作选择的是「部署到现有环境」,且环境名称完全匹配
  • 别手动指定VersionLabel,让CodePipeline自动生成版本名——硬编码的话很容易和Beanstalk环境的预期版本冲突

如果是用Terraform定义CodePipeline的部署动作,要保证configuration块里只指定应用和环境名,不要加版本标签:

resource "aws_codepipeline_action" "beanstalk_deploy" {
  name             = "Deploy_to_Beanstalk"
  category         = "Deploy"
  owner            = "AWS"
  provider         = "ElasticBeanstalk"
  version          = "1"
  input_artifacts  = [aws_codepipeline_artifact.build_output.name]

  configuration = {
    ApplicationName = aws_elastic_beanstalk_application.app.name
    EnvironmentName = aws_elastic_beanstalk_environment.env.name
    # 这里不要加VersionLabel,交给CodePipeline自动生成
  }
}

2. 手动同步Beanstalk环境的版本(快速修复)

如果现在环境已经处于降级状态,可以用CLI强制把环境的预期版本更新为CodePipeline刚部署的那个版本:

# 用eb cli的话更直观
eb deploy --version code-pipeline-1527260772846-80f1d98eca5f35bcc778b85efec9c71499bafeac

# 或者用aws cli
aws elasticbeanstalk update-environment --environment-name YOUR_ENV_NAME --version-label code-pipeline-1527260772846-80f1d98eca5f35bcc778b85efec9c71499bafeac

执行完之后,Beanstalk会重新校验版本匹配性,健康状态很快就会恢复正常。

3. 修正Terraform的Beanstalk环境配置

如果你的Terraform代码里硬编码了Beanstalk环境的version_label,那肯定会和CodePipeline生成的版本冲突——因为Terraform会一直试图把环境拉回你指定的固定版本。

打开你的aws_elastic_beanstalk_environment资源配置,移除硬编码的version_label字段:

resource "aws_elastic_beanstalk_environment" "env" {
  name                = "your-env-name"
  application         = aws_elastic_beanstalk_application.app.name
  solution_stack_name = "64bit Amazon Linux 2 v3.4.6 running Node.js 16"

  # 删掉这行硬编码的版本,让环境自动跟随最新部署的版本
  # version_label = "fixed-version-1.0"
}

之后执行terraform apply更新配置,这样后续CodePipeline部署新版本时,Beanstalk环境会自动同步预期版本,不会再出现版本不匹配的错误。

4. 清理冗余的旧版本(可选优化)

如果你的Beanstalk应用里堆积了大量旧的应用版本,可能会导致元数据混乱,偶尔触发这类同步问题。可以定期清理掉不再需要的版本:

aws elasticbeanstalk delete-application-version --application-name YOUR_APP_NAME --version-label OLD_VERSION_LABEL --delete-source-bundle

内容的提问来源于stack exchange,提问作者antpaw

火山引擎 最新活动