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
常见报错与解决¶
| 报错 | 原因 | 解决方法 |
|---|---|---|
NoCredentialsError | AWS 凭证未配置 | 运行 aws configure 或设置环境变量 |
AccessDenied | IAM 权限不足 | 检查 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/