使用boto3上传文件至CloudFlare R2遇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
相关产品推荐
相关产品推荐

