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
相关产品推荐
相关产品推荐

