求助解决S3 PutObject操作Access Denied上传报错问题
本地通过Python/AWS CLI上传S3图片遇AccessDenied故障排查与解决
问题现象
上传图片至S3存储桶时触发权限错误,CLI与Python代码均返回相同报错:
An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
当前配置信息
- S3存储桶已解除所有公共访问限制
- S3 ACL处于默认启用状态
- S3 Bucket Policy配置:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::myid:user/myuser" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectAcl", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::mybucket/*", "arn:aws:s3:::mybucket" ] } ] }
- IAM用户已附加
AmazonS3FullAccess权限策略,且授权访问目标存储桶 - 已创建该IAM用户的访问密钥,并通过
aws configure完成本地CLI配置
执行的操作及报错
AWS CLI命令
$ aws s3 cp 0.jpg s3://mybucket/0.jpg $ aws s3 cp --acl public-read 0.jpg s3://mybucket/0.jpg # 报错:upload failed: 0.jpg to s3://mybucket/0.jpg An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
Python代码(boto3)
import os from config import aws_config import boto3 client = boto3.client('s3', aws_access_key_id=aws_config.ACCESS_KEY, aws_secret_access_key=aws_config.ACCESS_PW, region_name=aws_config.REGION ) file_name = './0.jpg' bucket = 'mybucket' key = '0.jpg' client.upload_file(file_name, bucket, key) # 报错:boto3.exceptions.S3UploadFailedError: Failed to upload ./0.jpg to mybucket/0.jpg: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
解决方法
1. 确认访问密钥与目标IAM用户匹配
执行aws sts get-caller-identity命令,检查返回的用户ARN是否与配置中指定的arn:aws:iam::myid:user/myuser一致。若不匹配,重新执行aws configure输入正确的访问密钥和密钥ID。
2. 检查存储桶版本控制状态
若存储桶开启了版本控制,PutObject操作会生成版本ID,此时需确保权限配置中包含s3:PutObjectVersion(及s3:PutObjectVersionAcl,若需设置ACL)权限,可在Bucket Policy或IAM策略中添加对应操作。
3. 排查IAM用户权限边界
进入IAM用户详情页,查看「权限边界」配置:若存在边界策略,需确认该策略允许s3:PutObject等相关操作;可暂时移除权限边界进行测试,验证是否为边界限制导致。
4. 检查存储桶默认加密权限
若存储桶开启了服务器端加密:
- 若使用SSE-KMS,需确保IAM用户拥有对应KMS密钥的
kms:GenerateDataKey和kms:Decrypt权限; - 若使用SSE-S3,确认IAM权限包含加密相关的S3操作(
AmazonS3FullAccess通常已覆盖,但需检查策略是否被其他配置覆盖)。
5. 验证Bucket Policy资源路径准确性
确认Bucket Policy中的存储桶名称与实际存储桶完全匹配(S3存储桶名称为小写且全局唯一,检查是否存在拼写错误)。
6. 排查组织级SCP限制
若AWS账号属于AWS Organization,需联系管理员检查服务控制策略(SCP),确认是否限制了目标账号的S3 PutObject操作。
内容的提问来源于stack exchange,提问作者taki0412
相关产品推荐
相关产品推荐

