2009年11月5日木曜日

EBSのスナップショットをローテーション

スズキです。

タイトルがわかりづらいかも知れませんが、
常にEBSのスナップショットを、例えば3世代といったかたちで、
ローテーションさせて作成するシェルスクリプトです
ってことです。

まず、スナップショットの作成です。

ec2-create-snapshot \
-K $AWS_PRIVATE_KEY \
-C $AWS_CERTIFICATE \
$EBS_VOLUME

次にスナップショットのIDリストの取得です。
とりあえず、スナップショットリストの取得はこんな感じです。

ec2-describe-snapshots \
-K $AWS_PRIVATE_KEY \
-C $AWS_CERTIFICATE

SNAPSHOT snap-1 vol-0 completed 2009-11-05T07:12:25+0000
SNAPSHOT snap-2 vol-0 completed 2009-11-05T09:20:17+0000
SNAPSHOT snap-3 vol-0 completed 2009-11-05T09:23:41+0000

これを5列目の日付で降順にソートします。

ec2-describe-snapshots \
-K $AWS_PRIVATE_KEY \
-C $AWS_CERTIFICATE \
| sort -k5 -r

SNAPSHOT snap-3 vol-0 completed 2009-11-05T09:23:41+0000
SNAPSHOT snap-2 vol-0 completed 2009-11-05T09:20:17+0000
SNAPSHOT snap-1 vol-0 completed 2009-11-05T07:12:25+0000

※"-k5"で5列目の日付をソート対象にいして"-r"で降順にしています。

さらに、2列目のスナップショットIDのみにしぼります。

ec2-describe-snapshots \
-K $AWS_PRIVATE_KEY \
-C $AWS_CERTIFICATE \
| sort -k5 -r | awk '{print $2}'

snap-1
snap-2
snap-3

※"$2"で2列目のみ表示しています。

そして、上記で作成したスナップショットIDリストに対して、
新しい順で世代分はそのまま残し、それより古いものは削除処理をします。

COUNT=1
for SNAPSHOT in $SNAPSHOTS; do
  if [ $COUNT -le $EBS_GENERATION ]; then
    echo $SNAPSHOT "remained"
  else
    ec2-delete-snapshot \
    -K $AWS_PRIVATE_KEY \
    -C $AWS_CERTIFICATE \
    $SNAPSHOT
    echo $SNAPSHOT " deleted"
  fi
  COUNT=`expr $COUNT + 1`
done

最後に、あらためて全スクリプトです。

--------ここから-------
ec2-create-snapshot \
-K $AWS_PRIVATE_KEY \
-C $AWS_CERTIFICATE \
$EBS_VOLUME

SNAPSHOTS=`ec2-describe-snapshots \
-K $AWS_PRIVATE_KEY \
-C $AWS_CERTIFICATE \
| sort -k5 -r | awk '{print $2}'`

COUNT=1
for SNAPSHOT in $SNAPSHOTS; do
  if [ $COUNT -le $EBS_GENERATION ]; then
    echo $SNAPSHOT "remained"
  else
    ec2-delete-snapshot \
    -K $AWS_PRIVATE_KEY \
    -C $AWS_CERTIFICATE \
    $SNAPSHOT
    echo $SNAPSHOT " deleted"
  fi
  COUNT=`expr $COUNT + 1`
done
--------ここまで--------

AMIに反映しなきゃ。

--------
http://www.suz-lab.com

0 コメント: