调用PutObject遇AccessDenied错误,AWS S3上传权限配置求助
排查S3 PutObject AccessDenied问题(命令行可行但代码不行)
我来帮你捋捋这个问题——你已经开了桶的公共访问、配置了Bucket Policy,但命令行能上传文件,代码里却报AccessDenied,这种情况大多和代码使用的AWS身份、权限优先级有关,咱们一步步排查:
1. 先确认代码使用的IAM身份是否在Bucket Policy允许列表里
命令行能成功,说明你本地终端的AWS凭证(一般存在~/.aws/credentials)是属于user1或user2的,但代码运行的环境(比如IDE、服务器、容器)可能用了完全不同的身份:
- 先在代码运行的环境里执行命令:
看看返回的aws sts get-caller-identityArn是不是你Bucket Policy里的arn:aws:iam::id:user1或user2。如果不是,那代码用的身份根本不在允许范围内,肯定会报错。 - 回忆下boto3的凭证加载优先级:代码显式指定的密钥 > 环境变量(AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY) > ~/.aws/credentials > EC2实例角色,你命令行能用不代表代码会自动用同一个凭证。
2. 检查Bucket Policy的细节是否正确
仔细核对你写的Bucket Policy:
- 确认桶名是否正确:
arn:aws:s3:::bucket/*里的bucket要替换成你的真实桶名,比如arn:aws:s3:::my-test-bucket/*。 - 确认IAM用户的ARN是否正确:
arn:aws:iam::id:user1里的id是你的AWS账户ID(一串12位数字),不能随便写占位符。 - 另外,Bucket Policy里的
Sid不能重复,你两个Statement用了同一个"Sid": "SID",虽然不影响生效,但规范上要改成不同的(比如"Sid": "AllowUser1PutObject")。
3. 检查IAM用户自身的权限(关键!)
AWS的权限是Deny优先于Allow,而且Bucket Policy是桶级的权限,还需要IAM用户自身的策略允许对应的操作:
- 登录IAM控制台,找到user1和user2,检查他们的附加策略:
- 有没有拒绝
s3:PutObject的策略?如果有,直接覆盖Bucket Policy的Allow。 - 有没有允许
s3:PutObject到目标桶的策略?如果没有,给他们加一个这样的IAM策略:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:PutObject", "s3:PutObjectAcl"], "Resource": "arn:aws:s3:::bucket/*" } ] }
- 有没有拒绝
4. 检查代码的boto3初始化是否正确
你给的代码示例有语法错误,先修正:
- 正确的boto3资源初始化应该是:
或者用客户端更直接:import boto3 # 初始化资源 s3_resource = boto3.resource('s3') # 上传文件 s3_resource.meta.client.upload_file('file.csv', 'bucket', 'file.csv')s3_client = boto3.client('s3') s3_client.upload_file('file.csv', 'bucket', 'file.csv') - 可以先尝试在代码里显式指定user1的凭证(仅测试用,生产环境不要硬编码):
如果这样能成功,说明代码运行环境的凭证配置有问题,没有加载到正确的用户凭证。import boto3 s3 = boto3.resource('s3', aws_access_key_id='USER1_ACCESS_KEY', aws_secret_access_key='USER1_SECRET_KEY' ) s3.meta.client.upload_file('file.csv', 'bucket', 'file.csv')
5. 排查桶的加密设置(冷门但可能)
如果你的桶开启了KMS服务器端加密,那么即使有s3:PutObject权限,用户还需要KMS的相关权限:
- 去S3控制台的桶属性里,查看「默认加密」设置,如果是用AWS KMS密钥,需要给user1/user2加KMS权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["kms:GenerateDataKey", "kms:Decrypt"], "Resource": "arn:aws:kms:region:account-id:key/key-id" } ] }
内容的提问来源于stack exchange,提问作者novoalg
相关产品推荐
相关产品推荐

