怎么配置 EC2 自动快照策略备份数据到 S3

文章导读
EC2 原生快照(EBS Snapshot)底层虽存储在 S3,但用户无法直接在 S3 控制台访问。若需将数据备份至自己可控的 S3 存储桶,主要有两种路径:一是文件级备份(灵活可见),二是使用快照导出功能(整机镜像)。
📋 目录
  1. 方案对比:文件复制 vs 快照导出
  2. 权限配置(最小权限原则)
  3. 实操步骤
  4. 自动化配置
  5. 怎么验证是否生效
  6. 常见坑
  7. 参考来源
A A

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 用户。

怎么配置 EC2 自动快照策略备份数据到 S3

实操步骤

1. 文件级备份(含数据库一致性保障)
直接备份运行中的数据库文件可能导致损坏。建议在备份前冻结文件系统或锁定数据库。

XFS 文件系统冻结:

# 冻结文件系统
xfs_freeze -s /mnt/data
# 执行备份
aws s3 cp /mnt/data s3://my-backup-bucket/data/ `--recursive`
# 解冻文件系统
xfs_freeze -u /mnt/data

MySQL 数据库锁定:

怎么配置 EC2 自动快照策略备份数据到 S3
# 开启全局读锁
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 查看导出任务状态,当 Statecompleted 时,登录 S3 控制台查看对应前缀下是否有镜像文件。

常见坑

1. 数据一致性问题
未冻结文件系统或未锁表直接备份数据库,恢复后可能无法启动。务必在脚本中严格执行冻结 - 备份 - 解冻流程。

怎么配置 EC2 自动快照策略备份数据到 S3

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