运行 Ubuntu 的 EBS 支持的 EC2 实例的自动快照

运行 Ubuntu 的 EBS 支持的 EC2 实例的自动快照

我正在运行EBS 支持的实例它充当软件开发团队的构建服务器(运行 Jenkins 和其他服务的主机)。该服务器正在运行Linux(最新的 Ubuntu 来自官方 AMI)。

我想定期自动快照实例关联的 EBS 卷。我只需要保留一个最新备份(即应删除旧快照),并且良好的频率是每天一次。

看来亚马逊并没有提供这样的开箱即用的备份服务,所以你必须要么使用第三方脚本,要么推出自己的解决方案。

我的问题是,实现这一目标的最简单的方法是什么?我希望麻烦、配置和外部依赖性最少。据我所知,在 Linux 机器上将其设置为某种定时脚本是一种有效的选择。

答案1

根据 Jonik 的概念,我使用 boto 创建了一个 Python 脚本。您为其提供要快照的卷列表,以及每个卷要保留多少个尾随快照:

# Define the snapshots manage. We'll snapshot the specified volume ID, and only keep the X newest ones.
snapshots = [("vol-XXXXXXXX", 30), ("vol-YYYYYYYY", 180)]

import boto.ec2
auth = {"aws_access_key_id": "YOURACCESSKEY", "aws_secret_access_key": "YOURSECRETKEY"}
ec2 = boto.ec2.connect_to_region("YOURREGIONNAME", **auth)
description = "automated backup"
for volume, num_trailing in snapshots:
  snaps = ec2.get_all_snapshots(filters={"volume-id": volume, "description": description})
  print "%s: Creating new snapshot. %s automated snapshots currently exist." % (volume, len(snaps))
  ec2.create_snapshot(volume, description)
  purgeable = sorted(snaps, key=lambda x: x.start_time)[:-num_trailing]
  print "Deleting snapshots for %s > %s: %s" % (volume, num_trailing, purgeable)
  for snap in purgeable:
    ec2.delete_snapshot(snap.id)

我将其设置为 Jenkins 作业(通过 Python 插件),配置为每日运行。如果您使用 IAM 来管理凭证,请注意这将需要 ec2 策略:DescribeRegions、DescribeVolumes、CreateSnapshot、DeleteSnapshot、DescribeSnapshots、CreateTags(因为 boto 的实现)。

答案2

好吧,不管怎样,这就是我所做的。我希望我的拙劣脚本能鼓励人们发布更好的解决方案!

我编写了两个简单的 Bash 脚本,并使用以下方法自动化它们:计划任务。(目前我在本地服务器上运行这些,因为我思考(?) 不建议将 AWS 的证书放在实例/AMI/EBS 本身中。)

创建新快照

# ESB volume associated with the instance we want to back up:
EBS_VOL_ID=vol-xxxxyyyy

ec2-create-snapshot --region eu-west-1 -K pk.pem -C cert.pem -d "Automated backup" $EBS_VOL_ID 

删除除最新快照之外的所有快照

EBS_VOL_ID=vol-xxxxyyyy

ec2-describe-snapshots --region eu-west-1 -K pk.pem -C cert.pem  | grep "Automated backup" | grep "$EBS_VOL_ID" | awk '{ print $5 "\t" $2 }' | sort > .snapshots

latest_id=$(tail -n1 .snapshots | awk '{ print $2 }')

cat .snapshots | awk '{ print $2 }' > .snapshot_ids
for i in $(cat .snapshot_ids) 
do
    if [ "$i" != "$latest_id" ]
    then
        echo "Deleting snapshot $i"
        ec2-delete-snapshot --region eu-west-1 -K pk.pem -C cert.pem $i
    fi
done

(这将从ec2-describe-snapshots输出中解析适当的快照信息,并创建一个带有 [timestamp tab snap-id] 条目的临时文件(例如 2011-06-01T10:24:36+0000 snap-60507609),其中最新的快照位于最后一行。)

笔记

  • 将您的 X509 证书和私钥放在脚本可以找到的地方。
  • 必须--region在所有命令中明确指定。否则,例如,ec2-create-snapshot由于卷 ID 未知,将失败。(如果您使用默认区域“us-east-1”,则可能因人而异。)
  • 我使用快照描述(“自动备份”)作为标记,以避免修剪脚本删除相关卷的其他快照(例如与 AMI 相关的快照)。

免责声明:这对我来说部分是 Bash/Unix 编程的练习,尤其是 prune 脚本。我欣然承认,当您需要“对列表中除最后一项之外的所有项执行某项操作”之类的逻辑时,使用 Python 等语言最有可能获得更清晰的结果。即使使用 Bash,您也可能更优雅地完成此操作(例如,您实际上不需要临时文件)。因此,请随意发布其他解决方案

答案3

如果你对外部实用程序持开放态度,请查看斯凯德利

披露:我是 Eleven41 Software 的首席执行官,该公司是 Skeddly 背后的公司。

答案4

我用 PHP 编写了一个脚本,可以自动执行 EBS 快照并删除旧快照。它甚至会通过电子邮件将快照结果发送给您。您必须配置 AWS PHP SDK 和 PHPMailer 才能使用电子邮件功能,但这两个步骤都非常简单。然后,您只需每晚使用 CRON 或 Windows 计划任务运行该脚本即可。详细说明和代码可在我的博客上找到:

http://www.caleblloyd.com/software/automatically-take-ebs-snapshots-and-delete-old-ones-with-php-script/

相关内容