深色模式
对象存储 OSS/S3
摘要:对象存储(AWS S3 / 阿里云 OSS / 腾讯云 COS 等)是云上最便宜、最耐用的存储,适合放备份、日志、静态资源。本文讲清桶的创建与权限设置、命令行上传下载,以及用生命周期规则自动省钱。
适用环境
bash
# 安装云 CLI 与 s3 相关工具(以 AWS CLI 为例)
aws --version
# 其它厂商:ossutil(阿里云)、coscli(腾讯云)、gsutil(GCP)
which rclone || sudo apt install -y rclone1
2
3
4
2
3
4
操作步骤
一、创建桶并锁死公共访问
bash
# 创建桶(桶名全球唯一)
aws s3api create-bucket --bucket my-backup-bucket-2026 \
--region ap-east-1 --create-bucket-configuration LocationConstraint=ap-east-1
# 开启服务端加密(默认加密)
aws s3api put-bucket-encryption --bucket my-backup-bucket-2026 \
--server-side-encryption-configuration \
'{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]}'
# 阻断所有公共访问(默认就该开)
aws s3api put-public-access-block --bucket my-backup-bucket-2026 \
--public-access-block-configuration \
"BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"
# 开启版本控制,防止误删与覆盖
aws s3api put-bucket-versioning --bucket my-backup-bucket-2026 \
--versioning-configuration Status=Enabled1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
危险
「公共读」是数据泄露的头号原因。除非是刻意对外发布的静态资源,否则桶和对象都不应设为公共可读。上线前用 aws s3api get-public-access-block 复查一遍。
二、上传与下载
bash
# 上传单个文件
aws s3 cp /data/backup/db-2026-10-09.sql.gz s3://my-backup-bucket-2026/db/
# 目录同步(只传变化的部分,备份首选)
aws s3 sync /data/backup s3://my-backup-bucket-2026/backup/ --delete
# 大文件分片并发上传(提高吞吐)
aws configure set default.s3.multipart_threshold 64MB
aws configure set default.s3.max_concurrency 20
aws s3 cp bigfile.tar s3://my-backup-bucket-2026/
# 下载
aws s3 cp s3://my-backup-bucket-2026/db/db-2026-10-09.sql.gz /tmp/
# 列出与统计
aws s3 ls s3://my-backup-bucket-2026/db/ --recursive --human-readable --summarize1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
三、权限:用角色与策略代替 AK
bash
# 给备份脚本用的最小策略:只允许 PutObject 到 backup/ 前缀
cat > backup-policy.json <<'EOF'
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": ["s3:PutObject"],
"Resource": "arn:aws:s3:::my-backup-bucket-2026/backup/*"
}]
}
EOF1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
把该策略挂到实例角色上,脚本无需任何 AK 即可上传。
四、临时访问:预签名 URL
需要给外部临时下载权限时,不要开放公共读,用有时效的链接:
bash
# 生成 1 小时后失效的下载链接
aws s3 presign s3://my-backup-bucket-2026/db/db-2026-10-09.sql.gz --expires-in 36001
2
2
五、生命周期规则:自动转低频、自动过期
bash
cat > lifecycle.json <<'EOF'
{
"Rules": [
{
"ID": "backup-tiering",
"Status": "Enabled",
"Filter": {"Prefix": "backup/"},
"Transitions": [
{"Days": 30, "StorageClass": "STANDARD_IA"},
{"Days": 90, "StorageClass": "GLACIER"}
],
"Expiration": {"Days": 365},
"NoncurrentVersionExpiration": {"NoncurrentDays": 30}
},
{
"ID": "cleanup-incomplete",
"Status": "Enabled",
"Filter": {},
"AbortIncompleteMultipartUpload": {"DaysAfterInitiation": 7}
}
]
}
EOF
aws s3api put-bucket-lifecycle-configuration --bucket my-backup-bucket-2026 \
--lifecycle-configuration file://lifecycle.json1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
注意
生命周期规则里「删除过期版本」要格外小心:一旦开启,即使有版本控制也无法找回被清理的历史版本。开启前先确认合规保留要求。
验证
- [ ]
aws s3api get-bucket-encryption显示默认加密已启用 - [ ]
aws s3api get-public-access-block四项均为true - [ ] 用无 AK 的实例角色执行一次上传成功:
aws s3 cp /etc/hostname s3://my-backup-bucket-2026/backup/test - [ ]
aws s3api get-bucket-lifecycle-configuration能查到刚配置的规则 - [ ] 预签名 URL 过期后访问返回拒绝
常见坑
- 直接给公共读:静态站点发布时顺手开了整个桶的公共读,备份文件一并暴露。
- 不清理未完成的分片上传:分片上传中断后残留的分片会一直计费,务必配
AbortIncompleteMultipartUpload。 - 用 sync 不带 --delete 反被误删:sync 默认不会删远端;加
--delete会删,先用--dryrun预演。 - 跨地域流量费:桶与机器跨地域会产生流量费,备份桶应与业务同地域。
- 把对象存储当文件系统挂载:大量小文件随机读写性能极差且费用高,那是块存储/文件存储的活。