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

使用boto3上传文件至CloudFlare R2遇Unauthorized错误求助

使用boto3上传CloudFlare R2时出现CreateMultipartUpload Unauthorized错误

问题背景

此前代码运行正常,近期突然出现认证错误,在Python 3.7、3.9、3.11环境中搭配对应版本boto3均复现问题。

代码示例

class CloudApi:

    def init( self, endpoint_url, access_key_id, secret_access_key, bucket_name ):
         self.endpoint_url = endpoint_url 
         self.access_key_id = access_key_id 
         self.secret_access_key = secret_access_key 
         self.bucket_name = bucket_name
    
    def boto3_client(self):
    
        s3 = boto3.client(
            service_name="s3",
            endpoint_url=self.endpoint_url,
            aws_access_key_id=self.access_key_id,
            aws_secret_access_key=self.secret_access_key,
        )
    
        return s3
    
    def upload_file(self, path_local, path_cloud):
        s3 = self.boto3_client()
        s3.upload_file(path_local, self.bucket_name, path_cloud)

r2 = CloudApi( endpoint_url="", access_key_id="", secret_access_key="", bucket_name="")

r2.upload_file(path_local='', path_cloud='')

报错信息

Traceback (most recent call last):
  File "~/cloud_utils.py", line 182, in <module>
    test.upload_file(path_file_local='~/test.json',
  File "~/cloud_utils.py", line 121, in upload_file
    create_multipart_upload_response = s3.create_multipart_upload(
                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "~/venv/lib/python3.11/site-packages/botocore/client.py", line 530, in _api_call
    return self._make_api_call(operation_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "~/venv/lib/python3.11/site-packages/botocore/client.py", line 964, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (Unauthorized) when calling the CreateMultipartUpload operation: Unauthorized

解决方案

1. 修复代码构造方法错误

你的CloudApi类初始化方法命名错误:Python类的构造方法必须是__init__(前后各两个下划线),原代码中的init不会自动执行,导致self的所有属性为空,直接引发认证失败。修正后的核心代码片段:

class CloudApi:
    def __init__(self, endpoint_url, access_key_id, secret_access_key, bucket_name):
        self.endpoint_url = endpoint_url 
        self.access_key_id = access_key_id 
        self.secret_access_key = secret_access_key 
        self.bucket_name = bucket_name

2. 验证R2 API密钥有效性

  • 登录CloudFlare控制台,进入R2存储 → 管理API令牌,确认当前使用的access_key_id和secret_access_key未被删除或撤销(R2密钥默认无过期时间,但可手动失效)。
  • 若密钥已失效,重新生成新的密钥对并替换代码中的参数。

3. 检查密钥权限策略

R2 API密钥绑定权限策略,需确保包含上传所需的全部权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:CreateMultipartUpload",
        "s3:PutObject",
        "s3:UploadPart",
        "s3:CompleteMultipartUpload",
        "s3:AbortMultipartUpload"
      ],
      "Resource": "arn:aws:s3:::你的桶名/*"
    }
  ]
}
  • 注意:资源路径需指定到对象级别(/*),仅桶级资源权限无法上传具体文件。

4. 确认Endpoint URL格式正确

R2的Endpoint URL必须为以下格式之一:

  • 官方默认格式:https://<你的CloudFlare账户ID>.r2.cloudflarestorage.com
  • 自定义域名格式:https://<你的自定义域名>
    确保代码中endpoint_url参数填写正确,无多余斜杠或拼写错误。

5. 排查桶的访问限制

  • 进入R2桶的设置 → 权限,确认桶未设置私有只读或IP白名单限制(若服务器IP近期变更,可能被拦截)。
  • 跨域配置(CORS)一般不影响服务端上传,但若有特殊规则可检查是否存在冲突。

6. 升级boto3/botocore版本

部分旧版本botocore对R2的签名算法支持存在问题,执行以下命令升级到最新兼容版本:

pip install --upgrade boto3 botocore

内容的提问来源于stack exchange,提问作者blake banker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:25:33