答案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 计划任务运行该脚本即可。详细说明和代码可在我的博客上找到: