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

求助解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:15:33