我运行一个EBS支持的实例 ,充当软件开发团队的构build服务器(运行Jenkins和其他服务的主机)。 服务器运行Linux (来自官方AMI的最新Ubuntu)。
我想定期,自动地快照实例的相关EBS卷。 我只需要保留一个最新的备份(即修剪旧的快照),一个好的频率会每天一次。
亚马逊似乎并没有提供这种备份服务,所以你必须使用第三方脚本或推出自己的解决scheme。
我的问题是, 最简单的方法是什么? 我想要less量的麻烦,configuration和外部依赖。 把它设置为Linux盒子上的某种定时脚本,据我所知,这是一个有效的select。
基于Jonik的概念,我使用boto创build了一个python脚本。 您为其提供要进行快照的卷列表,以及为每个卷保留多less尾随快照:
# 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插件),configuration为每天运行。 如果您使用IAM来pipe理凭据,请注意,这将需要在ec2策略中:DescribeRegions,DescribeVolumes,CreateSnapshot,DeleteSnapshot,DescribeSnapshots,CreateTags(因为boto的实现)。
好的,为了什么是值得的,这是我所做的。 我希望我的软弱的脚本鼓励人们发布更好的解决scheme!
我写了两个简单的bash脚本,并使用cron自动化它们。 (现在我在本地服务器上运行这些服务器,因为我认为 (?)不build议将AWS的证书放入实例/ AMI / EBS中)。
要创build一个新的快照 :
# 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输出中parsing相应的快照信息,并使用[timestamp tab snapshot-id]条目(例如, 2011-06-01T10:24:36+0000 snap-60507609 )创build一个临时文件,其中最新的快照位于最后一行)。
备注 :
--region所有命令。 否则,例如, ec2-create-snapshot会失败,卷标识未知。 (YMMV如果使用默认区域“us-east-1”)。 免责声明:这成为Bash / Unix编程的一部分,尤其是修剪脚本。 我很乐意承认,当你需要像“为列表中的最后一项而做所有事情”这样的逻辑时,你很可能会用例如Python得到更清晰的结果。 即使使用Bash,你也可以做得更优雅(例如,你并不需要临时文件)。 所以, 请随时发布其他解决scheme !
如果你对外部公用事业开放,看看Skeddly 。
披露 :我是Skeddly背后的公司Eleven41 Software的首席执行官。
我扩展了Jonik脚本的想法,允许保留多个快照。 代码太长,不适合评论,所以我添加了一个新的答案。 此代码假定所有正确的环境variables已经为CLI工具设置。 另外,这个默认为拍摄当前实例的快照。
# Look up our instance ID using the magic URL INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) # The number of previous backups we want to keep N=3 # get list of locally attached volumes via EC2 API: VOLUME_LIST=$(ec2-describe-volumes | grep ${INSTANCE_ID} | awk '{ print $2 }') DATE=$(date '+%Y-%m-%d-%H%M%S') sync # actually creating the snapshots for VOLUME in $(echo $VOLUME_LIST); do echo "Processing volume $VOLUME" SNAPSHOT_LIST=$(ec2-describe-snapshots | grep completed | grep "Automatic snapshot" | grep $VOLUME | awk '{print $5 "\t" $2}' | sort | head "--lines=-$N" | awk '{print $2}') ec2-create-snapshot $VOLUME -d "Automatic snapshot on $DATE" for SNAPSHOT in $(echo $SNAPSHOT_LIST); do ec2-delete-snapshot $SNAPSHOT done done
我已经用PHP编写了一个脚本,可以自动执行EBS快照并删除旧脚本。 它甚至会把快照的结果发给你。 您必须configurationAWS PHP SDK和PHPMailer以获取电子邮件function,但这两个步骤都非常简单。 然后你每天晚上用CRON或Windows Scheduled Tasks运行脚本。 详细的说明和代码可以在我的博客上find: