元RX-7乗りの適当な日々 このページをアンテナに追加 RSSフィード Twitter

RX-7(FD3S)WRX STI関連のキーワードで検索されて来られた方へ。
右サイドのカテゴリ『』をクリックすると関連する項目だけが表示されます。
日々の写真は『Flickr』で公開しています。

2010/06/06

by Waleed Alzuhair

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


# タイトル長い。

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"など)を入れるようにしてください。

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

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



まとめ


はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/rx7/20100606/p1

オススメ (一部は、最近読んでいる本とも言う)
Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus) クラウド Amazon EC2/S3のすべて~実践者から学ぶ設計/構築/運用ノウハウ~ [Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ) エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド [24時間365日] サーバ/インフラを支える技術 ~スケーラビリティ、ハイパフォーマンス、省力運用 Linux-DB システム構築/運用入門 (DB Magazine SELECTION) キャパシティプランニング ― リソースを最大限に活かすサイト分析・予測・配置 スケーラブルWebサイト 実践ハイパフォーマンスMySQL 第3版 ウェブオペレーション ―サイト運用管理の実践テクニック (THEORY/IN/PRACTICE) SQLアンチパターン インターネットのカタチ―もろさが織り成す粘り強い世界― ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化 Linuxの教科書―ホントに読んでほしいroot入門講座 (IDGムックシリーズ)