以下是一篇关于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")


关键注意事项

  1. 权限控制

    • MinIO:通过mc admin policy设置访问策略
    • AWS S3:使用IAM策略管理权限
  2. 数据安全

    # 启用传输加密
    s3.upload_file(..., ExtraArgs={'ServerSideEncryption': 'AES256'})
    

  3. 大文件分片上传

    with open("large_file.iso", "rb") as f:
        s3.upload_fileobj(f, bucket_name, "backups/large_file.iso")
    

  4. 错误处理

    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("文件不存在")
    


场景应用建议

  1. 备份系统
    定时上传压缩后的数据库备份:

    import datetime
    timestamp = datetime.datetime.now().strftime("%Y%m%d-%H%M")
    s3.upload_file(f"db_backup_{timestamp}.zip", bucket_name, "backups/")
    

  2. Web应用资源托管
    直接存储用户上传的图片/视频:

    # Flask接收上传示例
    from flask import request
    file = request.files['user_file']
    s3.upload_fileobj(file, bucket_name, f"user_uploads/{file.filename}")
    

  3. 数据分析管道
    作为数据湖存储原始数据:

    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)
  • 混合云部署场景
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐