EC2 原生快照(EBS Snapshot)底层虽存储在 S3,但用户无法直接在 S3 控制台访问。若需将数据备份至自己可控的 S3 存储桶,主要有两种路径:一是文件级备份(灵活可见),二是使用快照导出功能(整机镜像)。
先说结论:原生 EBS 快照适合整机快速恢复,若需数据归档至特定 S3 桶以便长期存储或跨账号访问,建议根据需求选择方案。
- 文件备份:适合日志、数据库导出文件,数据在 S3 可见,成本低。
- 快照导出:适合整机块存储归档,通过 Export 任务将快照转为镜像文件存入 S3。
- 先准备:配置最小权限 IAM 策略,安装 AWS CLI,规划存储桶生命周期。
- 验收:检查 S3 桶内是否有新对象,或 EC2 控制台导出任务状态。
方案对比:文件复制 vs 快照导出
很多用户混淆了“EBS 快照”和“S3 存储桶备份”。EBS 快照是通过 EC2 API 管理的特殊对象,不能直接用 S3 API 下载。若需数据落地到 S3 桶:
- 文件备份(aws s3 cp):灵活,适合特定目录归档,但需自行保障数据一致性。
- 快照导出(export-snapshot):基于块存储,保障卷级别一致性,导出后为磁盘镜像文件,适合灾难恢复归档。
权限配置(最小权限原则)
避免使用 AmazonS3FullAccess。建议创建自定义 IAM 策略,仅允许对特定桶的写入及必要的 EC2 快照操作。以下策略示例允许向指定桶上传对象及创建/导出快照:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:PutObject", "s3:GetBucketLocation"],
"Resource": ["arn:aws:s3:::my-backup-bucket", "arn:aws:s3:::my-backup-bucket/*"]
},
{
"Effect": "Allow",
"Action": ["ec2:CreateSnapshot", "ec2:ExportSnapshot", "ec2:DescribeSnapshots"],
"Resource": "*"
}
]
}将该策略附加到 EC2 实例角色或执行备份的 IAM 用户。
实操步骤
1. 文件级备份(含数据库一致性保障)
直接备份运行中的数据库文件可能导致损坏。建议在备份前冻结文件系统或锁定数据库。
XFS 文件系统冻结:
# 冻结文件系统
xfs_freeze -s /mnt/data
# 执行备份
aws s3 cp /mnt/data s3://my-backup-bucket/data/ `--recursive`
# 解冻文件系统
xfs_freeze -u /mnt/dataMySQL 数据库锁定:
# 开启全局读锁
mysql -u root -p -e "FLUSH TABLES WITH READ LOCK"
# 执行备份(保持会话开启)
aws s3 cp /var/lib/mysql s3://my-backup-bucket/mysql/ `--recursive`
# 解锁
mysql -u root -p -e "UNLOCK TABLES"2. EBS 快照导出到 S3
若需将块存储快照导出为镜像文件至 S3:
# 先创建快照
aws ec2 create-snapshot `--volume-id` vol-1234567890abcdef0 `--description` "Pre-export Snapshot"
# 导出快照到 S3(假设快照 ID 为 snap-1234567890abcdef0)
aws ec2 export-snapshot `--snapshot-id` snap-1234567890abcdef0 `--s3-bucket` my-backup-bucket `--s3-prefix` exports/自动化配置
编写 Shell 脚本整合上述命令,并通过 Cron 定时执行。例如每天凌晨 2 点执行文件备份:
0 2 * * * /home/ec2-user/backup.sh >> /var/log/backup.log 2>&1若使用 EBS 快照生命周期管理,可在 AWS 控制台配置 Data Lifecycle Manager (DLM) 策略,但注意 DLM 默认管理快照而非直接导出到 S3 桶,导出步骤通常需单独脚本触发。
怎么验证是否生效
- 文件备份:运行
aws s3 ls s3://my-backup-bucket/确认是否有新文件,检查文件大小是否与源数据一致。 - 快照导出:运行
aws ec2 describe-export-tasks查看导出任务状态,当State为completed时,登录 S3 控制台查看对应前缀下是否有镜像文件。
常见坑
1. 数据一致性问题
未冻结文件系统或未锁表直接备份数据库,恢复后可能无法启动。务必在脚本中严格执行冻结 - 备份 - 解冻流程。
2. 权限不足
若报错 AccessDenied,检查 IAM 策略中 Resource 是否精确匹配了 S3 桶 ARN,以及 EC2 角色是否已附加到实例。
3. 存储成本
S3 存储会产生费用,建议开启存储桶的生命周期策略,自动清理过期备份或将旧数据转为低频访问层(如 S3 Glacier)。
4. 网络带宽
上传大文件可能占用带宽。AWS CLI 支持配置 max_concurrent_requests 优化传输,但需平衡请求数量避免触发限流。
参考来源
- AWS Official Documentation - Exporting EBS Snapshots to Amazon S3
- AWS Official Documentation - Creating a policy to access Amazon S3
- AWS Official Documentation - Backing up MySQL databases