こんにちは。CTOの馬場です。
今回もインフラエンジニア向けにちょっとした情報を紹介します。
少し間があいてしまいましたが今回は珍しくAWSネタです。
botoを使ってEBSをバックアップする方法を紹介します。
元ネタは @d_sea さんの Amazon EBS と boto を使って自動バックアップ環境を構築する ですが少しだけupdateしています。
- Volume IDとDescriptionが同じsnapshotを、指定した世代数だけ保持するよう変更した
(同じVolume IDのEBSを別のDescriptionで保存した場合に、世代にカウントされないようにした)
→手動バックアップと自動バックアップを区別できるようになりました - リージョンを指定できるようにした
boto-1.9bで動作を確認しています。 エラー処理がアレなのはご愛嬌で。
AWS_ACCESS_KEY_ID
、AWS_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
簡単ですね!