Lambda函数写入S3目录存储桶时遇Access Denied错误求助
解决Lambda写入S3时的AccessDenied错误
首先注意到错误提示是调用CreateSession操作时Access Denied,而非直接put_object失败,这说明问题可能不在Lambda执行角色的S3权限本身,需要从以下几个方向排查:
1. 检查S3桶策略是否存在拒绝规则
S3桶策略会直接覆盖IAM角色权限,哪怕Lambda角色有全S3权限,如果桶策略设置了拒绝写入的规则,依然会报错:
- 进入S3控制台,找到目标桶
pollytts--use1-az6--x-s3,查看权限标签下的桶策略。 - 确保没有类似以下的拒绝语句:
{ "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::pollytts--use1-az6--x-s3/*" } - 如果桶策略有条件限制(比如IP范围、加密方式),确认Lambda的执行环境符合条件(比如Lambda不在VPC时,公网IP是否在允许列表)。
2. 验证Lambda执行角色的权限范围
- 确认IAM角色的权限策略中,资源是否包含目标桶的对象路径,正确的资源配置应该是:
只写桶ARN(不带"Resource": [ "arn:aws:s3:::pollytts--use1-az6--x-s3", "arn:aws:s3:::pollytts--use1-az6--x-s3/*" ]/*)只能操作桶本身,无法写入对象。 - 检查角色是否有IAM权限边界,如果边界策略没有允许
s3:PutObject操作,即使附加了全S3权限也会被拒绝。进入IAM角色详情页,查看权限边界部分。
3. 排查S3访问控制列表(ACL)
- 查看桶的访问控制列表,确认桶所有者或Lambda角色对应的IAM实体拥有
写入权限。 - 如果桶是由其他AWS账户创建的,需要确认跨账户权限是否配置正确(比如桶所有者授权你的账户写入权限)。
4. 检查VPC相关配置(如果Lambda在VPC内)
如果Lambda部署在VPC中,需要:
- 确认已配置S3的VPC端点(Gateway类型),且端点策略允许
s3:PutObject操作。 - 检查Lambda所在的子网是否有路由表指向S3端点,没有的话Lambda无法访问S3。
- 确认安全组没有出站限制,允许访问S3。
5. 验证桶名和区域是否匹配
- 确认代码中的桶名
pollytts--use1-az6--x-s3完全正确,没有拼写错误。 - 检查Lambda的区域和S3桶的区域是否一致,虽然跨区域可以访问,但部分配置(比如VPC端点)可能限制同区域访问。
额外测试建议
可以在IAM控制台使用策略模拟器,模拟Lambda执行角色调用s3:PutObject操作,目标资源为arn:aws:s3:::pollytts--use1-az6--x-s3/test-file.txt,看是否允许访问。如果模拟器显示拒绝,会给出具体原因,帮助快速定位问题。
内容的提问来源于stack exchange,提问作者Talib Kareem
相关产品推荐
相关产品推荐

