如何用CloudFormation创建新Elastic Beanstalk应用并部署Java示例
Elastic Beanstalk CloudFormation模板问题解决方案
问题1:在同一模板中创建新应用并关联环境
之前的错误是因为AWS::ElasticBeanstalk::Environment引用的customerApp未在模板中定义,CloudFormation无法找到对应资源。要同时创建应用和环境,需在模板中按顺序定义应用、应用版本,再关联到环境,确保资源依赖关系正确。
修正后的核心资源示例
Resources: # 1. 创建Elastic Beanstalk应用 MyEBApplication: Type: AWS::ElasticBeanstalk::Application Properties: Description: 测试EB应用 # 2. 创建应用版本(关联上述应用) MyEBAppVersion: Type: AWS::ElasticBeanstalk::ApplicationVersion Properties: ApplicationName: !Ref MyEBApplication # 引用刚创建的应用,避免硬编码 Description: 测试应用版本 SourceBundle: # 后续替换为你自己的应用包存储路径 S3Bucket: !Sub "${AWS::AccountId}-my-eb-packages" S3Key: my-java-app.zip # 3. 创建环境(关联应用和应用版本) MyEBEnvironment: Type: AWS::ElasticBeanstalk::Environment Properties: ApplicationName: !Ref MyEBApplication # 关联创建的应用 ApplicationVersion: !Ref MyEBAppVersion # 指定要部署的应用版本 Description: Test PlatformArn: arn:aws:elasticbeanstalk:eu-west-1::platform/Tomcat 8.5 with Corretto 8 running on 64bit Amazon Linux 2/4.2.17 EnvironmentName: iw-test3 # 你的其他OptionSettings保持不变...
关键注意点
- 必须用
!Ref关联资源,不能硬编码应用名称,否则会再次出现"应用不存在"的错误 ApplicationVersion会自动依赖Application,CloudFormation会按顺序创建资源- 环境资源必须指定
ApplicationVersion,否则EB会尝试使用默认版本,可能导致部署失败
问题2:S3权限禁止错误
你遇到的Forbidden错误是因为elasticbeanstalk-samples-${AWS::Region}桶中的corretto.zip文件要么不存在,要么EB服务角色没有权限读取该桶内容。官方elasticbeanstalk-samples桶并非所有区域都有相同文件,且部分资源不公开可访问。
解决方案
方案1:使用自己的S3桶存储应用包
- 将Java应用包(或AWS官方Java示例包)上传到你自己AWS账号下的S3桶
- 在模板中更新
SourceBundle的S3Bucket和S3Key为自己的桶和文件路径 - 确保CloudFormation执行角色或EB服务角色拥有
s3:GetObject权限,允许读取该桶内容
方案2:使用公开的AWS示例应用包
如果想测试标准Java示例,可使用AWS公开的示例包:
SourceBundle: S3Bucket: aws-elasticbeanstalk-samples S3Key: java-sample.zip
该包公开可访问,EB服务角色可直接读取。
权限配置补充
若使用自己的S3桶,需给EB服务角色添加以下IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*" } ] }
内容的提问来源于stack exchange,提问作者yendrrek
相关产品推荐
相关产品推荐

