部署包含Elastic Beanstalk栈的AWS CloudFormation模板时遭遇S3权限不足错误,寻求解决方案
我之前在AWS组织子账户里部署EB栈时也遇到过完全一样的问题,核心原因是你用的AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy托管策略权限太有限,没有覆盖访问AWS管理的平台资产S3桶的需求。下面是具体的解决方法:
核心问题分析
报错里的elasticbeanstalk-platform-assets-eu-central-1桶是AWS官方维护的区域级公共桶,用来存储EB的平台镜像、模板等资源。你的EB服务角色(也就是BackendServiceRole)需要具备读取这个桶的权限才能完成环境部署,但AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy只包含了托管更新相关的权限,没有涵盖这部分S3访问权限。
解决方案1:添加自定义S3权限策略(推荐,遵循最小权限原则)
你可以给BackendServiceRole附加一个自定义策略,专门允许访问对应区域的平台资产桶。修改你的CloudFormation模板如下:
BackendServiceRole: Type: AWS::IAM::Role Properties: RoleName: !Sub '${GroupName}BackendServiceRole' AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: - elasticbeanstalk.amazonaws.com Action: - 'sts:AssumeRole' ManagedPolicyArns: - arn:aws:iam::aws:policy/AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy # 添加自定义策略,允许访问EB平台资产桶 Policies: - PolicyName: EBPlatformAssetsAccessPolicy PolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Action: - "s3:GetObject" - "s3:ListBucket" Resource: - "arn:aws:s3:::elasticbeanstalk-platform-assets-eu-central-1" - "arn:aws:s3:::elasticbeanstalk-platform-assets-eu-central-1/*"
这个策略仅允许读取目标区域的平台资产桶,符合安全领域的最小权限原则。
解决方案2:使用更全面的托管策略(适合测试场景)
如果是测试环境,不想自定义权限,可以直接替换托管策略为AWSElasticBeanstalkFullAccess,它包含了EB运行所需的所有权限,自然也能访问这些公共桶:
BackendServiceRole: Type: AWS::IAM::Role Properties: RoleName: !Sub '${GroupName}BackendServiceRole' AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: - elasticbeanstalk.amazonaws.com Action: - 'sts:AssumeRole' ManagedPolicyArns: - arn:aws:iam::aws:policy/AWSElasticBeanstalkFullAccess
注意:这个策略权限范围很广,生产环境不建议直接使用。
额外检查点:AWS组织SCP限制
如果上面的方法还是不行,要检查你所在的AWS组织是否有**服务控制策略(SCP)**限制了子账户访问外部S3桶。有些组织会默认阻止访问非本账户的S3桶,这时候需要在SCP里添加允许访问elasticbeanstalk-platform-assets-*系列桶的规则。
内容的提问来源于stack exchange,提问作者christianr

