AWS S3启用Object Lock时PutObject报AccessDenied问题求助
问题描述
尝试在AWS S3中启用Object Lock功能,发现无法通过GUI操作,需通过CLI上传对象时启用。执行以下命令时出现AccessDenied错误:
aws s3api put-object --bucket <my Bucketlist name> --key test-1 --body test-1 --object-lock-mode GOVERNANCE --object-lock-retain-until-date 2025-06-12
错误信息:
An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
已启用公共ACL策略,配置的权限策略如下:
{ "Version": "2012-10-17", "Id": "ExamplePolicy01", "Statement": [ { "Sid": "ExampleStatement01", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::********:root" }, "Action": "*", "Resource": [ "arn:aws:s3:::<my Bucketlist name>", "arn:aws:s3:::<my Bucketlist name>/*" ] } ] }
解决方案
1. 确认S3桶已启用Object Lock
Object Lock功能必须先在桶级别启用,才能为单个对象设置锁定规则。如果桶未开启该功能,上传对象时指定Object Lock参数会直接报错。
检查当前桶的Object Lock配置:
aws s3api get-bucket-object-lock-configuration --bucket <your-bucket-name>
如果返回NoSuchObjectLockConfiguration,说明桶未启用Object Lock,执行以下命令开启:
aws s3api put-bucket-object-lock-configuration --bucket <your-bucket-name> --object-lock-configuration '{"ObjectLockEnabled": "Enabled"}'
2. 验证CLI使用的IAM身份
你的权限策略仅允许账户root用户执行所有操作,但当前CLI可能使用的是其他IAM用户/角色,而非root身份。
检查当前CLI的身份:
aws sts get-caller-identity
如果返回的不是root用户(arn格式为arn:aws:iam::account-id:root),需要:
- 切换到root身份执行命令(不推荐生产环境使用)
- 为当前使用的IAM用户/角色添加包含
s3:PutObject和s3:PutObjectRetention权限的策略
3. 检查桶的Block Public Access设置
虽然你启用了公共ACL,但如果桶的Block Public Access中开启了Block public access to buckets and objects granted through any access control lists (ACLs),会导致公共ACL失效。不过此设置通常不影响root用户的操作,但仍建议确认:
- 进入S3桶控制台,查看「权限」标签下的「Block Public Access」配置
- 确保没有完全阻止所有公共访问(如果你的业务不需要公共访问,保持默认阻止即可,但root用户操作不受影响)
4. 确认对象的Object Lock参数格式
--object-lock-retain-until-date参数需要符合ISO 8601格式,你使用的2025-06-12是合法格式,但如果时区有问题,可尝试加上时间,例如2025-06-12T23:59:59Z。
内容的提问来源于stack exchange,提问作者Houman Alavehzadeh

