使用CloudFormation访问S3桶模板遇权限被拒,请求排查建议
让我帮你排查下这个CloudFormation访问S3模板时的权限问题,我之前也碰到过类似情况,大概率是这几个容易忽略的配置点没做好:
可能的遗漏配置排查
1. S3存储桶的阻止公共访问设置
很多人容易踩这个坑:就算你配置了正确的桶策略,如果桶的「阻止公共访问」(Block Public Access)里的关键选项处于开启状态,会直接覆盖桶策略的允许规则。你需要:
- 进入S3桶的权限页面,找到「阻止公共访问」设置
- 确保
阻止所有公共访问没有勾选,或者至少关闭覆盖公共桶策略这个选项(如果你的桶策略是专门允许CloudFormation访问的话)
2. CloudFormation服务角色的权限
别搞混了:你创建桶和上传模板用的是用户凭证,但CloudFormation本身是用服务角色(或默认临时凭证)去访问S3的,不是用你操作的用户权限。你需要:
- 确认启动CloudFormation栈时指定的服务角色(如果有的话)是否拥有
s3:GetObject权限,且资源范围覆盖你的S3桶和模板文件 - 如果没指定服务角色,CloudFormation会使用调用它的用户权限,但要注意:用户权限必须明确允许访问该S3对象,而不仅仅是桶级权限
3. S3对象的ACL权限
你上传模板文件时,默认的对象ACL可能是「私有」(只有上传者能访问),哪怕桶策略开了权限,对象级的ACL也会限制访问。解决方法:
- 上传文件时,设置对象ACL为
bucket-owner-full-control,比如用AWS CLI上传时加参数:aws s3 cp your-template.yaml s3://your-bucket/ --acl bucket-owner-full-control - 或者上传后手动修改对象权限,给CloudFormation使用的角色/用户添加「读取」权限
4. 桶策略的正确性检查
不少人写桶策略时会犯主体错配或资源范围不对的问题。这里给你一个允许CloudFormation服务角色访问的示例模板:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的AWS账号ID:role/你的CloudFormation服务角色名" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的桶名/*" } ] }
如果是允许调用CloudFormation的用户访问,把Principal里的ARN换成用户的ARN即可。
5. 跨区域或签名版本问题
如果你的S3桶在特殊区域(比如AWS中国区),CloudFormation需要使用V4签名才能正常访问。你可以:
- 确保CloudFormation栈所在区域和S3桶区域一致,避免跨区域访问的签名问题
- 如果用AWS CLI上传模板,执行
aws configure set s3.signature_version s3v4强制使用V4签名
快速测试方法
你可以先用CloudFormation使用的角色/用户执行CLI命令测试权限:
aws s3 cp s3://你的桶名/模板文件名 .
如果这个命令返回「Access denied」,说明问题出在权限配置上;如果能正常下载,再去排查CloudFormation的栈配置(比如模板路径是否写错)。
内容的提问来源于stack exchange,提问作者Amarjeet Kaur
相关产品推荐
相关产品推荐

