《S3 云存储:Python 操作 MinIO/AWS S3 的实战》
·
以下是一篇关于Python操作MinIO/AWS S3的实战指南,包含完整代码示例和关键概念说明:
Python操作MinIO/AWS S3实战指南
MinIO是与AWS S3兼容的开源对象存储服务,两者API高度一致。本文通过Python的boto3库演示核心操作:
1. 安装与环境配置
pip install boto3
2. 客户端初始化
import boto3
from botocore.client import Config
# 连接MinIO (本地部署)
s3 = boto3.client('s3',
endpoint_url='http://localhost:9000',
aws_access_key_id='YOUR_ACCESS_KEY',
aws_secret_access_key='YOUR_SECRET_KEY',
config=Config(signature_version='s3v4')
)
# 连接AWS S3 (云端)
s3_cloud = boto3.client('s3',
aws_access_key_id='AWS_ACCESS_KEY',
aws_secret_access_key='AWS_SECRET_KEY',
region_name='us-east-1'
)
3. 核心操作示例
创建存储桶
bucket_name = "my-documents"
s3.create_bucket(Bucket=bucket_name)
上传文件
s3.upload_file(
Filename="local_file.pdf", # 本地路径
Bucket=bucket_name,
Key="project/docs/file.pdf" # 存储路径
)
下载文件
s3.download_file(
Bucket=bucket_name,
Key="project/docs/file.pdf",
Filename="downloaded_file.pdf"
)
列出存储桶内容
response = s3.list_objects_v2(Bucket=bucket_name)
for obj in response.get('Contents', []):
print(f"对象名: {obj['Key']}, 大小: {obj['Size']}字节")
生成预签名URL(临时访问)
url = s3.generate_presigned_url(
'get_object',
Params={'Bucket': bucket_name, 'Key': 'project/docs/file.pdf'},
ExpiresIn=3600 # 1小时有效
)
print("临时下载链接:", url)
删除对象
s3.delete_object(Bucket=bucket_name, Key="project/docs/file.pdf")
关键注意事项
-
权限控制
- MinIO:通过
mc admin policy设置访问策略 - AWS S3:使用IAM策略管理权限
- MinIO:通过
-
数据安全
# 启用传输加密 s3.upload_file(..., ExtraArgs={'ServerSideEncryption': 'AES256'}) -
大文件分片上传
with open("large_file.iso", "rb") as f: s3.upload_fileobj(f, bucket_name, "backups/large_file.iso") -
错误处理
from botocore.exceptions import ClientError try: response = s3.head_object(Bucket=bucket_name, Key="file.txt") print("文件存在") except ClientError as e: if e.response['Error']['Code'] == '404': print("文件不存在")
场景应用建议
-
备份系统
定时上传压缩后的数据库备份:import datetime timestamp = datetime.datetime.now().strftime("%Y%m%d-%H%M") s3.upload_file(f"db_backup_{timestamp}.zip", bucket_name, "backups/") -
Web应用资源托管
直接存储用户上传的图片/视频:# Flask接收上传示例 from flask import request file = request.files['user_file'] s3.upload_fileobj(file, bucket_name, f"user_uploads/{file.filename}") -
数据分析管道
作为数据湖存储原始数据:import pandas as pd df = pd.read_csv("s3://my-bucket/raw_data.csv") # 直接读取
完整代码示例见:[GitHub仓库链接]
注:实际使用时需替换密钥信息,敏感凭证建议使用环境变量管理:
import os aws_access_key = os.environ['AWS_ACCESS_KEY']
此方案适用于:
- 自建存储服务(MinIO)
- 公有云存储(AWS S3)
- 混合云部署场景
更多推荐


所有评论(0)