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

调用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-identity
    
    看看返回的Arn是不是你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/*"
              }
          ]
      }
      
    只有Bucket Policy和IAM用户策略同时允许,权限才会生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:54:34