Amazon EBSのスナップショット(バックアップ)を取得しつつ世代管理も行うスクリプト

by Waleed Alzuhair


# タイトル長い。

Amazon EBS(Elastic Block Store)では、スナップショット機能と呼ばれる、ボリューム(ディスク)を瞬時にバックアップする機能をAPI経由で簡単に使うことができます。

参考


そんな便利機能なEBSスナップショット君ですが、そのバックアップデータの保存先はAmazon S3ということで、S3の利用容量無制限!という素晴らしい恩恵を受けちゃっていて、当然、バックアップデータの世代管理は使い手自身に委ねられています


ということで、指定したEBSボリュームに対して、スナップショット(バックアップ)取得しつつ、世代管理(指定世代数に基づいて古いデータを削除)もするようなスクリプトを昔に書いたので、それとなく公開します。

これからAmazon EC2で運用するのだー、という方には間違いなく役に立つはず。

前提

  • ec2-api-toolsが動くこと
  • EC2のX.509証明書が手元(サーバ)にあること

スクリプトの中身

以下のような感じです。

#!/bin/sh
export JAVA_HOME=/usr
export EC2_HOME=/opt/ec2-api-tools
export PATH=${PATH}:/bin:/usr/bin:${EC2_HOME}/bin

# ----- config
AWS_PRIVATE_KEY=/etc/ec2_keys/pk.pem
AWS_CERTIFICATE=/etc/ec2_keys/cert.pem

EBS_VOLUME_ID="vol-ead8e482"
EBS_GENERATION_COUNT=3

AWS_REGION=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/[a-z]$//'`
# -----

# スナップショットの取得
echo -n "[creating...] "
ec2-create-snapshot --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${AWS_REGION} ${EBS_VOLUME_ID}

# スナップショットの一覧を取得
SNAPSHOTS=`ec2-describe-snapshots --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${AWS_REGION} | grep ${EBS_VOLUME_ID} | sort -k5 -r | awk '{print $2}'`

# 世代保管分の調整(過去スナップショットのクリア)
COUNT=1
for SNAPSHOT in ${SNAPSHOTS}; do
  if [ ${COUNT} -le ${EBS_GENERATION_COUNT} ]; then
    # 保管対象なのでN/A
    echo "[keeping] " ${SNAPSHOT}
  else
    # 保管対象外なので削除
    echo -n "[deleting...] "
    ec2-delete-snapshot --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${AWS_REGION} ${SNAPSHOT}
  fi
  COUNT=`expr ${COUNT} + 1`
done

このスクリプトは、サーバが自分自身に接続されているEBSボリュームに対して取得することを想定した簡単な実装例です。

  • 上部のPATHや設定部分は、適宜書き換えるようにしてください。
    • ec2-api-toolsやX.509証明書は、サーバに配置の上、設定のファイル・ディレクトリパスを書き換えてください。
  • "EBS_VOLUME_ID"には、取得したいEBSボリュームのIDを入れてください。
    • 複数のEBSボリュームを対象にしたいときは、適当にループでまわすように書き換えてください。
  • "EBS_GENERATION_COUNT"には、保持しておきたい世代数を入れてください。
  • "AWS_REGION"の部分は、上記では自動でサーバ自身が動いているRegionが入るようにしています。
    • EC2外のサーバや、別Regionのサーバ(EC2インスタンス)から実行したい場合は、手動でRegion("us-west-1"など)を入れるようにしてください。

(あまり書きたくないけど)注意書き

あと、このスクリプトを使って何かあっても(バックアップが取れてなかった!とか)責任は取れませんので、きちんとテストした上で、そして自己責任でご利用ください。よろしくお願いします。




まとめ


クラウドAMAZON EC2/S3のすべて (ITpro BOOKs)

クラウドAMAZON EC2/S3のすべて (ITpro BOOKs)