HEARTBEATS

botoを使ってEBSをバックアップ(世代管理つき)

   

こんにちは。CTOの馬場です。

今回もインフラエンジニア向けにちょっとした情報を紹介します。
少し間があいてしまいましたが今回は珍しくAWSネタです。

botoを使ってEBSをバックアップする方法を紹介します。

元ネタは @d_sea さんの Amazon EBS と boto を使って自動バックアップ環境を構築する ですが少しだけupdateしています。

  • Volume IDとDescriptionが同じsnapshotを、指定した世代数だけ保持するよう変更した
    (同じVolume IDのEBSを別のDescriptionで保存した場合に、世代にカウントされないようにした)
    →手動バックアップと自動バックアップを区別できるようになりました
  • リージョンを指定できるようにした

boto-1.9bで動作を確認しています。 エラー処理がアレなのはご愛嬌で。

AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYには、 webの アカウント>セキュリティ証明書>アクセスキー(タブ) で表示されるものを指定してください。

#!/usr/bin/python 
import sys
import re
from boto import config
from boto import  ec2
from boto.ec2.connection import EC2Connection

AWS_ACCESS_KEY_ID = ''
AWS_SECRET_ACCESS_KEY = ''
DESCRIPTION = 'daily backup'
REGION_NAME = 'us-west-1'

if(len(sys.argv) != 3):
    print "Usage: ebs-snapshot.py <num> <volume-id>"
    sys.exit()
regions = ec2.regions(aws_access_key_id=AWS_ACCESS_KEY_ID,aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
for r in regions:
    if r.name == REGION_NAME:
        _region=r
conn = EC2Connection(aws_access_key_id=AWS_ACCESS_KEY_ID,aws_secret_access_key=AWS_SECRET_ACCESS_KEY,region=_region)
conn.create_snapshot(volume_id=sys.argv[2], description=DESCRIPTION) 
snapshot = {}
for x in conn.get_all_snapshots(): 
    if((x.volume_id == sys.argv[2]) and (x.description == DESCRIPTION)): 
        tmp = {x.id:x.start_time} 
        snapshot.update(tmp) 
snapshot = sorted(snapshot.items(), key=lambda (k, v): (v, k), reverse=True) 
for i in range(int(sys.argv[1]), len(snapshot)): 
    conn.delete_snapshot(snapshot[i][0]) 

利用例(cronで実行)

30 5 * * * /opt/backup/bin/ebs_snapshot.py 3 vol-XXXXXXXX

簡単ですね!