Linux

執行 Ubuntu 的 EBS 支持的 EC2 實例的自動快照

  • April 16, 2014

我正在執行一個由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 的實施)。

引用自:https://serverfault.com/questions/275245