跳转至

AWS S3 对象存储 — 云端无限容量的文件存储桶,按使用量付费


一句话说明

AWS S3(Simple Storage Service)是亚马逊的对象存储服务,把文件存成"桶(Bucket)里的对象",支持任意大小文件(最大 5TB),适合存储测序数据、分析结果、静态网站资源,2025年标准存储约 $0.023/GB/月。


安装与配置

# 安装 AWS CLI v2(命令行工具)
# Linux
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip && sudo ./aws/install

# macOS(用 Homebrew)
brew install awscli

# 验证安装
aws --version

# 配置身份(需要 IAM 用户的 Access Key)
aws configure
# 输入:
# AWS Access Key ID: AKIA...
# AWS Secret Access Key: xxx
# Default region name: ap-northeast-1  (东京,离中国近)
# Default output format: json

# 查看当前配置
aws configure list

核心用法

# ── 创建和管理桶 ──
aws s3 mb s3://my-biodata-bucket              # 创建桶(mb=make bucket)
aws s3 mb s3://my-biodata-bucket --region ap-northeast-1  # 指定区域

aws s3 ls                                      # 列出所有桶
aws s3 ls s3://my-biodata-bucket              # 列出桶内文件
aws s3 ls s3://my-biodata-bucket/results/ --recursive  # 递归列出

# ── 文件上传下载 ──
aws s3 cp local_file.fastq s3://my-biodata-bucket/raw/  # 上传单文件
aws s3 cp s3://my-biodata-bucket/results/report.html .  # 下载文件

# 同步目录(增量,只传变化的文件)
aws s3 sync ./results/ s3://my-biodata-bucket/results/  # 上传整个目录
aws s3 sync s3://my-biodata-bucket/results/ ./local-results/  # 下载到本地

# 加速上传大文件(自动多线程)
aws s3 cp large_file.bam s3://my-biodata-bucket/ \
  --sse AES256 \                              # 服务端加密
  --storage-class STANDARD_IA               # 不频繁访问存储类(便宜50%)

# ── 删除文件 ──
aws s3 rm s3://my-biodata-bucket/old-file.fastq
aws s3 rm s3://my-biodata-bucket/old-results/ --recursive  # 删除目录

# ── 生成预签名 URL(临时分享,无需登录)──
aws s3 presign s3://my-biodata-bucket/report.html --expires-in 3600  # 1小时有效

实战案例

# ── Python 操作 S3(boto3)──
import boto3                          # AWS Python SDK
from pathlib import Path

# 创建 S3 客户端(从环境变量或 ~/.aws/credentials 读取凭证)
s3 = boto3.client('s3', region_name='ap-northeast-1')

# ── 上传测序数据 ──
def upload_sequencing_data(local_path: str, bucket: str, s3_key: str):
    """上传本地文件到 S3"""
    file_size = Path(local_path).stat().st_size           # 获取文件大小
    print(f"正在上传 {local_path}{file_size / 1e9:.2f} GB)...")

    # 大文件自动分片上传(Multipart Upload)
    s3.upload_file(
        Filename=local_path,          # 本地文件路径
        Bucket=bucket,                # 目标桶名
        Key=s3_key,                   # S3 对象键名(相当于路径)
        ExtraArgs={
            'StorageClass': 'STANDARD_IA',  # 不频繁访问类型(省钱)
            'ServerSideEncryption': 'AES256', # 加密存储
            'Metadata': {             # 自定义元数据
                'sample-id': 'S001',
                'project': 't2d-gut-microbiome',
            }
        }
    )
    print("上传完成!")

# ── 批量下载结果文件 ──
def download_results(bucket: str, prefix: str, local_dir: str):
    """批量下载 S3 目录中的所有文件"""
    paginator = s3.get_paginator('list_objects_v2')      # 分页列出(处理>1000个文件)
    pages = paginator.paginate(Bucket=bucket, Prefix=prefix)

    for page in pages:
        for obj in page.get('Contents', []):
            s3_key = obj['Key']                          # 对象路径
            local_path = Path(local_dir) / Path(s3_key).name  # 本地保存路径
            print(f"下载 {s3_key}...")
            s3.download_file(bucket, s3_key, str(local_path))

# ── 生成预签名 URL(分享给合作者)──
def share_result(bucket: str, key: str, hours: int = 24) -> str:
    """生成临时下载链接"""
    url = s3.generate_presigned_url(
        'get_object',
        Params={'Bucket': bucket, 'Key': key},
        ExpiresIn=hours * 3600,       # 过期时间(秒)
    )
    print(f"分享链接({hours}小时有效): {url}")
    return url
# ── 设置生命周期策略(自动归档/删除旧数据)──
# lifecycle.json
cat > lifecycle.json << 'EOF'
{
  "Rules": [{
    "ID": "auto-archive-rule",
    "Status": "Enabled",
    "Filter": { "Prefix": "raw-data/" },
    "Transitions": [{
      "Days": 30,
      "StorageClass": "STANDARD_IA"    # 30天后转移到低频存储(便宜)
    }, {
      "Days": 90,
      "StorageClass": "GLACIER"        # 90天后转移到 Glacier(极低成本归档)
    }],
    "Expiration": { "Days": 365 }      # 365天后自动删除
  }]
}
EOF

aws s3api put-bucket-lifecycle-configuration \
  --bucket my-biodata-bucket \
  --lifecycle-configuration file://lifecycle.json

常见报错与解决

报错原因解决方法
NoCredentialsErrorAWS 凭证未配置运行 aws configure 或设置环境变量
AccessDeniedIAM 权限不足检查 IAM 策略,需要 s3:PutObject 等权限
BucketAlreadyExists桶名全球唯一冲突换一个更具体的桶名(加项目名/日期)
上传速度慢网络或单线程限制--sse 和分片,或用 s5cmd 工具
EntityTooLarge单次上传超5GB使用 Multipart Upload(boto3 自动处理)

速查表

# CLI 常用命令
aws s3 mb s3://bucket          # 创建桶
aws s3 ls [s3://bucket]        # 列出桶/对象
aws s3 cp src s3://bucket/key  # 上传
aws s3 cp s3://bucket/key dst  # 下载
aws s3 sync src s3://bucket/   # 同步上传
aws s3 rm s3://bucket/key      # 删除

# 存储类型(从贵到便宜)
STANDARD          # 标准,频繁访问
STANDARD_IA       # 低频访问(便宜40%)
GLACIER           # 归档,分钟级取回
GLACIER_IR        # 即时取回 Glacier
DEEP_ARCHIVE      # 深度归档,最便宜(取回需12小时)

# 官方文档:https://docs.aws.amazon.com/s3/
# 费用计算:https://aws.amazon.com/s3/pricing/