已配置s3:PutObjectACL权限仍遇Access Denied,如何解决?
问题描述
Lambda函数调用boto3的put_object_acl API时,已配置包含s3:PutObjectAcl权限的IAM策略,但仍返回如下权限错误:
An error occurred (AccessDenied) when calling the PutObjectAcl operation: Access Denied
已配置的IAM权限策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::<my-bucket-name>", "arn:aws:s3:::<my-bucket-name/*" ], "Effect": "Allow" } ] }
排查与解决方法
- 修复资源ARN语法错误:策略里第二个资源ARN存在格式问题,
arn:aws:s3:::<my-bucket-name/*缺少闭合的双引号和右斜杠的闭合,正确写法应为arn:aws:s3:::<my-bucket-name>/*。这个语法错误会导致该资源匹配失效,Lambda拿不到对应对象的ACL修改权限。 - 检查S3桶策略限制:如果目标S3桶配置了桶策略,可能存在
Deny语句覆盖IAM权限的情况。核实桶策略中是否有针对该Lambda执行角色的拒绝规则,或者通用的拒绝ACL修改的规则。 - 验证对象所有权设置:如果S3桶启用了「Bucket owner enforced」类型的对象所有权控制,对象的ACL会被忽略,且只有桶所有者能修改对象权限。若Lambda执行角色不是桶所有者,调用
PutObjectAcl必然报错。这种情况要么调整桶的对象所有权设置,要么让Lambda使用桶所有者身份执行操作。 - 排查KMS加密权限:如果目标对象用KMS加密,Lambda执行角色还需要拥有
kms:GenerateDataKey和kms:Decrypt权限,否则修改ACL时会因无法访问加密对象触发权限错误。 - 确认目标对象存在:如果要修改ACL的对象不存在,S3也会返回
AccessDenied错误(错误信息有误导性)。先确认对象确实存在于指定桶中。
内容的提问来源于stack exchange,提问作者DilLip_Chowdary
相关产品推荐
相关产品推荐

