You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:27:46