配置S3策略授权AWS组织子账户CloudFormation访问S3模板遇权限问题求助
解决组织内子账户CloudFormation访问S3模板的权限问题
问题根源
你当前的策略失效,核心原因是:跨账户场景下,子账户的CloudFormation并非直接以cloudformation.amazonaws.com服务主体发起请求,而是使用子账户内的IAM执行角色作为请求主体。此时aws:PrincipalIsAWSService条件无法匹配(因为主体是IAM角色而非服务本身),同时aws:PrincipalOrgID虽能匹配组织内账户的IAM主体,但和aws:PrincipalIsAWSService的逻辑与组合导致条件永远不满足。
修正后的S3桶策略
以下策略可实现组织内任意子账户的CloudFormation访问指定路径下的S3模板,无需逐个添加子账户:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-bucket/指定模板目录/*", // 替换为你要授权的具体模板路径 "Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-yyyyyyyyyy", // 替换为你的AWS组织ID "aws:CalledVia": "cloudformation.amazonaws.com" } } } ] }
关键逻辑说明
aws:CalledVia:验证请求是通过CloudFormation服务发起的,确保只有CloudFormation触发的访问才被允许,避免组织内其他非CloudFormation的请求获取文件。aws:PrincipalOrgID:限定请求主体属于你的AWS组织,自动覆盖所有新增的子账户,无需手动更新策略。- 资源路径:务必指定具体的模板目录(比如
my-bucket/templates/*),实现“部分模板”的只读授权,避免开放整个桶的访问权限。
额外验证点
- 确认子账户内的CloudFormation执行角色(或默认服务角色)已拥有
s3:GetObject权限(自定义角色需手动配置,默认角色通常自动具备)。 - 若S3桶开启了公共访问阻止,无需调整该设置——组织内账户的访问不属于公共访问范畴,不会被拦截。
内容的提问来源于stack exchange,提问作者Matt Bryson
相关产品推荐
相关产品推荐

