執行 Ubuntu 的 EBS 支持的 EC2 實例的自動快照
我正在執行一個由EBS 支持的實例,它充當軟體開發團隊的建構伺服器(執行 Jenkins 和其他服務的主機)。伺服器正在執行Linux (來自官方 AMI的最新 Ubuntu )。
我想為實例的關聯 EBS 卷定期自動拍攝快照。我只需要保留一個最新的備份(即應該修剪舊的快照),而且最好的頻率是每天一次。
亞馬遜似乎沒有提供這種開箱即用的備份服務,因此您必須使用 3rd 方腳本或推出自己的解決方案。
我的問題是,**實現這一目標的最簡單方法是什麼?**我想要最少的麻煩、配置和外部依賴。據我所知,在 Linux 機器上將其設置為某種定時腳本是一個有效的選擇。
好吧,為了它的價值,這就是我所做的。我希望我微弱的腳本能鼓勵人們發布更好的解決方案!
我編寫了兩個簡單的 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
修剪除最新快照之外的所有內容:
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 snapshot-id $$
2011-06-01T10:24:36+0000 snap-60507609
最新快照位於最後一行的條目(例如 )。) 備註:
- 將您的 X509 證書和私鑰放在腳本可以找到它們的某個地方。
- 您必須明確指定
--region
所有命令。否則,例如ec2-create-snapshot
會因卷 ID 未知而失敗。(如果您使用預設區域“us-east-1”,則為 YMMV。)- 我使用快照描述(“自動備份”)作為標記,以避免修剪腳本刪除相關卷的其他快照(例如與 AMI 相關的快照)。
免責聲明:這部分成為我在 Bash/Unix 程式中的練習,尤其是修剪腳本。我欣然承認,當您需要諸如“為列表中的最後一項以外的所有項目做某事”之類的邏輯時,您很可能使用 Python 獲得更清晰的結果。即使使用 Bash,您也可以更優雅地執行此操作(例如,您實際上並不需要臨時文件)。因此,請隨時發布其他解決方案!
基於 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 的實施)。