部署CloudFormation栈时遭遇S3 GetObject权限拒绝问题
解决方案:CloudFormation部署API Gateway时S3访问被拒绝的问题
Alright, let's break down why you're hitting that API: s3:GetObject Access Denied error and fix it step by step.
核心问题分析
你的桶策略目前只包含一条Deny规则,但AWS的权限模型默认是拒绝所有请求,除非显式授予允许权限。虽然你把apigateway.amazonaws.com排除在了Deny规则之外,但没有添加明确的Allow语句授权API Gateway服务执行s3:GetObject操作,这就是访问被拦截的根本原因。
另外,如果你的CloudFormation模板需要直接读取S3对象(比如把文件内容作为参数传入),那么CloudFormation的执行角色也需要访问桶的权限——这一点在你当前的策略里也没有覆盖到。
修正后的桶策略
下面是更新后的策略,它既保留了你的IP过滤限制,又显式允许了API Gateway和CloudFormation执行角色的合法访问:
{ "Version": "2012-10-17", "Statement": [ // 1. 显式允许API Gateway拉取Swagger定义文件 { "Sid": "AllowAPIGatewayGetObject", "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-code-dev/*" }, // 2. 允许CloudFormation执行角色访问(如果模板需要直接读取S3文件则保留) { "Sid": "AllowCloudFormationExecutionRole", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::YOUR_ACCOUNT_ID:role/YOUR_CLOUDFORMATION_EXECUTION_ROLE_ARN" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-code-dev/*" }, // 3. 保留IP过滤的Deny规则,拒绝不符合条件的请求 { "Sid": "IpFilter", "Effect": "Deny", "NotPrincipal": { "Service": [ "lambda.amazonaws.com", "apigateway.amazonaws.com" ], "AWS": "arn:aws:iam::YOUR_ACCOUNT_ID:role/YOUR_CLOUDFORMATION_EXECUTION_ROLE_ARN" }, "Action": "s3:*", "Resource": "arn:aws:s3:::my-code-dev/*", "Condition": { "NotIpAddress": { "aws:SourceIp": [ "192.168.1.0/24", // 替换成你的允许IP段 "203.0.113.0/24" ] } } } ] }
关键注意事项
- 策略版本:务必使用
2012-10-17(最新标准版本)代替2008-10-17,它支持更多条件键和更清晰的权限逻辑。 - 显式允许:
Allow语句优先级高于默认拒绝,确保API Gateway/CloudFormation的合法请求能被正常授权。 - CloudFormation角色:如果你的模板不需要直接读取S3文件(而是通过
BodyS3Location让API Gateway自行拉取),可以删掉第二条Allow语句。 - IP格式:确保
aws:SourceIp的值是有效的CIDR范围(比如用x.x.x.x/24表示子网,单IP需要用/32后缀)。
额外排查步骤
- 确认API Gateway的区域和S3桶的区域是否一致(跨区域访问虽然可行,但偶尔会出现意想不到的权限边缘情况)。
- 检查CloudFormation执行角色是否拥有API Gateway相关操作的权限,比如
apigateway:ImportRestApi或apigateway:CreateRestApi。 - 使用AWS Access Analyzer工具验证你的桶策略,它会标记出可能导致问题的权限冲突或遗漏。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

