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

Terraform部署AWS Elastic Beanstalk时应用版本未自动部署问题

解决Terraform部署AWS Elastic Beanstalk时应用版本未自动部署的问题

问题场景

使用Terraform创建AWS Elastic Beanstalk应用时,其余资源均部署正常,但应用版本未自动部署至环境;通过AWS控制台手动部署该版本可正常运行,应用版本存储在经KMS加密的S3桶中。

核心原因与解决方案

1. 未在Beanstalk环境中指定应用版本

你的aws_elastic_beanstalk_environment资源未配置version_label参数,导致Terraform创建环境时不会自动关联已创建的应用版本,这是核心问题。

修改方法:在环境资源中添加version_label,关联你的应用版本资源:

resource "aws_elastic_beanstalk_environment" "beanstalk_env" {
  depends_on = [
    aws_db_instance.education,
    aws_elastic_beanstalk_application_version.beanstalk_app_version
  ]
  name                = "test-environment"
  application         = "app-test"
  solution_stack_name = "64bit Amazon Linux 2023 v4.0.0 running Corretto 17"
  tier                = "WebServer"
  # 添加此行,指定要部署的应用版本
  version_label       = aws_elastic_beanstalk_application_version.beanstalk_app_version.name

  # 以下原有setting配置保持不变
  setting {
    namespace = "aws:ec2:vpc"
    name      = "VPCId"
    value     = data.aws_vpc.default_vpc.id
  }

  # ... 其余setting配置省略 ...
}

2. 确保Elastic Beanstalk服务角色拥有KMS密钥权限

由于应用版本存储在KMS加密的S3桶中,Elastic Beanstalk的服务角色(默认名称为aws-elasticbeanstalk-service-role)需要具备KMS密钥的解密权限,否则无法读取S3中的应用包。

配置KMS密钥策略:
给加密S3桶的KMS密钥添加以下权限语句,允许Beanstalk服务访问:

{
  "Effect": "Allow",
  "Principal": {
    "Service": "elasticbeanstalk.amazonaws.com"
  },
  "Action": [
    "kms:Decrypt",
    "kms:DescribeKey"
  ],
  "Resource": "*"
}

如果用Terraform管理KMS密钥策略,可通过aws_kms_key_policy资源配置:

resource "aws_kms_key_policy" "beanstalk_kms_access" {
  key_id = aws_kms_key.your_s3_encryption_key.id
  policy = jsonencode({
    Version = "2012-10-17"
    Id      = "beanstalk-kms-access"
    Statement = [
      # 保留原有密钥策略语句,新增以下内容
      {
        Sid       = "AllowElasticBeanstalkDecrypt"
        Effect    = "Allow"
        Principal = {
          Service = "elasticbeanstalk.amazonaws.com"
        }
        Action = [
          "kms:Decrypt",
          "kms:DescribeKey"
        ]
        Resource = "*"
      }
    ]
  })
}

3. 验证EC2实例角色权限(可选)

虽然手动部署正常,仍需确认aws-elasticbeanstalk-ec2-role具备以下权限:

  • s3:GetObject:针对应用包所在的S3对象
  • kms:Decrypt:针对加密该S3对象的KMS密钥

验证修改

执行terraform apply重新部署,Beanstalk环境将自动关联并部署指定的应用版本,无需手动操作。

环境控制台初始状态:
环境控制台初始状态
手动部署后状态:
手动部署后状态
手动部署后应用正常运行:
应用正常运行状态

内容的提问来源于stack exchange,提问作者Mateusz Górski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:25:32