RustFS 使用 S3 Python SDK(Boto3)文档

一、概述

RustFS 是一款兼容 Amazon S3 协议的对象存储服务,支持通过 Python 的 Boto3 SDK 接入。

本教程将讲解如何使用 Python 与 RustFS 进行集成,并通过 Boto3 完成如下操作:

  • Bucket 创建/删除
  • 对象上传/下载/删除
  • 列举对象
  • 生成预签名 URL
  • 分片上传大文件

二、环境准备

2.1 RustFS 信息

假设 RustFS 部署如下:

复制代码
Endpoint: http://192.168.1.100:9000
AccessKey: rustfsadmin
SecretKey: rustfssecret

2.2 安装 Boto3

推荐使用 venv 虚拟环境:

复制代码
python3 -m venv venv
source venv/bin/activate
pip install boto3

Boto3 依赖 botocore,会自动安装。


三、连接 RustFS

复制代码
import boto3
from botocore.client import Config

s3 = boto3.client(
 's3',
 endpoint_url='http://192.168.1.100:9000',
 aws_access_key_id='rustfsadmin',
 aws_secret_access_key='rustfssecret',
 config=Config(signature_version='s3v4'),
 region_name='us-east-1'
)

endpoint_url:指向 RustFS ✅ signature_version='s3v4':RustFS 支持 v4 签名 ✅ region_name:RustFS 不校验 region,填写任意值即可


四、基础操作

4.1 创建 Bucket

复制代码
bucket_name = 'my-bucket'

try:
 s3.create_bucket(Bucket=bucket_name)
 print(f'Bucket {bucket_name} created.')
except s3.exceptions.BucketAlreadyOwnedByYou:
 print(f'Bucket {bucket_name} already exists.')

4.2 上传文件

复制代码
s3.upload_file('hello.txt', bucket_name, 'hello.txt')
print('File uploaded.')

4.3 下载文件

复制代码
s3.download_file(bucket_name, 'hello.txt', 'hello-downloaded.txt')
print('File downloaded.')

4.4 列出对象

复制代码
response = s3.list_objects_v2(Bucket=bucket_name)
for obj in response.get('Contents', []):
 print(f"- {obj['Key']} ({obj['Size']} bytes)")

4.5 删除对象与 Bucket

复制代码
s3.delete_object(Bucket=bucket_name, Key='hello.txt')
print('Object deleted.')

s3.delete_bucket(Bucket=bucket_name)
print('Bucket deleted.')

五、高级功能

5.1 生成预签名 URL

5.1.1 下载链接(GET)

复制代码
url = s3.generate_presigned_url(
 ClientMethod='get_object',
 Params={'Bucket': bucket_name, 'Key': 'hello.txt'},
 ExpiresIn=600 # 10 分钟有效期
)

print('Presigned GET URL:', url)

5.1.2 上传链接(PUT)

复制代码
url = s3.generate_presigned_url(
 ClientMethod='put_object',
 Params={'Bucket': bucket_name, 'Key': 'upload-by-url.txt'},
 ExpiresIn=600
)

print('Presigned PUT URL:', url)

你可以使用 curl 工具上传:

复制代码
curl -X PUT --upload-file hello.txt "http://..."

5.2 分片上传(Multipart Upload)

适合大于 10 MB 文件上传,可手动控制每个分片。

复制代码
import os

file_path = 'largefile.bin'
key = 'largefile.bin'
part_size = 5 * 1024 * 1024 # 5 MB

# 1. 启动上传
response = s3.create_multipart_upload(Bucket=bucket_name, Key=key)
upload_id = response['UploadId']
parts = []

try:
 with open(file_path, 'rb') as f:
 part_number = 1
 while True:
 data = f.read(part_size)
 if not data:
 break

 part = s3.upload_part(
 Bucket=bucket_name,
 Key=key,
 PartNumber=part_number,
 UploadId=upload_id,
 Body=data
 )

 parts.append({'ETag': part['ETag'], 'PartNumber': part_number})
 print(f'Uploaded part {part_number}')
 part_number += 1

 # 2. 完成上传
 s3.complete_multipart_upload(
 Bucket=bucket_name,
 Key=key,
 UploadId=upload_id,
 MultipartUpload={'Parts': parts}
 )
 print('Multipart upload complete.')

except Exception as e:
 # 中止上传
 s3.abort_multipart_upload(Bucket=bucket_name, Key=key, UploadId=upload_id)
 print('Multipart upload aborted due to error:', e)

六、常见问题排查

问题 原因 解决方法
SignatureDoesNotMatch 未使用 v4 签名 设置 signature_version='s3v4'
EndpointConnectionError RustFS 地址错误或服务未启动 检查 endpoint 与 RustFS 服务状态
AccessDenied 凭证错误或权限不足 检查 AccessKey/SecretKey 或桶策略
PermanentRedirect 未启用 path-style Boto3 默认使用 virtual-host,RustFS 仅支持 path-style,但设置 endpoint 可绕过

七、附录:快速上传/下载脚本模板

复制代码
def upload_file(local_path, bucket, object_key):
 s3.upload_file(local_path, bucket, object_key)
 print(f"Uploaded {local_path} to s3://{bucket}/{object_key}")

def download_file(bucket, object_key, local_path):
 s3.download_file(bucket, object_key, local_path)
 print(f"Downloaded s3://{bucket}/{object_key} to {local_path}")
相关推荐
Csvn12 小时前
🌟 LangChain 30 天保姆级教程 · Day 13|OutputParser 进阶!让 AI 输出自动转为结构化对象,并支持自动重试!
python·langchain
Wenweno0o12 小时前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
chenjingming66612 小时前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
cch891813 小时前
Python主流框架全解析
开发语言·python
不爱吃炸鸡柳13 小时前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发13 小时前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
Momentary_SixthSense13 小时前
设计模式之工厂模式
java·开发语言·设计模式
sg_knight13 小时前
设计模式实战:状态模式(State)
python·ui·设计模式·状态模式·state
好运的阿财13 小时前
process 工具与子agent管理机制详解
网络·人工智能·python·程序人生·ai编程
‎ദ്ദിᵔ.˛.ᵔ₎13 小时前
STL 栈 队列
开发语言·c++