Jon*_*nik 6 linux backup amazon-ec2 amazon-ebs amazon-web-services
我正在运行一个EBS 支持的实例,它充当软件开发团队的构建服务器(运行 Jenkins 和其他服务的主机)。服务器正在运行Linux(来自官方 AMI 的最新 Ubuntu )。
我想对实例的关联 EBS 卷进行定期自动快照。我只需要保留一个最新的备份(即应该修剪旧快照),并且最好的频率是每天一次。
亚马逊似乎没有提供这种开箱即用的备份服务,因此您必须使用 3rd 方脚本或推出自己的解决方案。
我的问题是,实现这一目标的最简单方法是什么?我想要最少的麻烦、配置和外部依赖。据我所知,在 Linux 机器上将其设置为某种定时脚本是一个有效的选择。
小智 5
基于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)
Run Code Online (Sandbox Code Playgroud)
我将其设置为 Jenkins 作业(通过 Python 插件),配置为每天运行。如果您使用 IAM 来管理凭证,请注意这将需要 ec2 策略:DescribeRegions、DescribeVolumes、CreateSnapshot、DeleteSnapshot、DescribeSnapshots、CreateTags(因为 boto 的实施)。
好吧,不管怎样,这就是我所做的。我希望我的脚本能够鼓励人们发布更好的解决方案!
我编写了两个简单的 bash 脚本并使用cron自动化它们。(目前我在本地服务器上运行这些,我认为(?)不建议将 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
Run Code Online (Sandbox Code Playgroud)
要修剪除最新快照之外的所有快照:
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
Run Code Online (Sandbox Code Playgroud)
(这会从ec2-describe-snapshots输出中解析适当的快照信息,并创建一个带有 [timestamp tab snapshot-id] 条目的临时文件(例如
2011-06-01T10:24:36+0000 snap-60507609),其中最新快照位于最后一行。)
注意事项:
--region。否则,例如ec2-create-snapshot将因卷 ID 未知而失败。(如果您使用默认区域“us-east-1”,则为 YMMV。)免责声明:这在一定程度上成为我 Bash/Unix 编程的练习,尤其是修剪脚本。我承认,当您需要“对列表中除最后一项之外的所有项目执行某些操作”之类的逻辑时,您很可能会使用 Python 等获得更清晰的结果。即使使用 Bash,您也可以更优雅地完成此操作(例如,您实际上并不需要临时文件)。因此,请随时发布其他解决方案!
| 归档时间: |
|
| 查看次数: |
5247 次 |
| 最近记录: |