読者です 読者をやめる 読者になる 読者になる

よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

実践で使えるEBSスナップショット取得スクリプト

AWS Ruby

AWS障害による影響を小さくするための設計(2011/4/21の障害を踏まえて)』の障害を経験しての対策として、"(2) snapshot生成のステータスも監視しましょう"というのをあげていました。

その中で、以下のようなことを書いていました。

新しいsnapshotを作成する場合には、過去に取得したsnapshotのステータスなども確認し、きちんとバックアップできているかの確認をすることを怠らないようにしておきましょう。
こちらに関しては、後日、SonicGardenで利用している仕組み(RightScaleが公開しているright_awsを利用したもの)を公開したいと思っています。しばしお待ちを。

こちらをきちんと公開しておこうと思います。

ソースコードは"こちらのGitHub上"で公開していますので、必要な方は利用してください。

このスクリプトですが、EBSのスナップショットを自動的に取得してくれるものですが、以下のような特徴があります。

(1) スナップショット取得ミスをメールで通知

スナップショット取得ミスに気づけるようになると、前回のようなEBS障害が今後発生したとしても、すぐに障害に気づけるようになります。

(2) 直近のスナップショットを多めに保存しておくことで、データ損失量を減らす

下図(縦線が入っているところがスナップショットを取得したタイミング)のように直近のスナップショットを多めに保存しておくことで、1時間に一回スナップショットを取得しておくような仕組みの場合よりも、比較的新しいデータをスナップショットから復元することができるため、データ損失量を減らすことができるはずです。

f:id:interu:20110530185138p:image

上図は、20分に1度スナップショットを取得していますが、直近2時間分は全てのスナップショットを保存しておき、2時間経過後は保存期間まで(デフォルト12時間)1時間間隔分のスナップショットだけを残しておくというものです。

(3) 比較的に必要性の低いスナップショットを削除することで、AWSの料金を下げる

直近のスナップショットデータは多めに残しておき、一定時間経過すると、部分部分だけを残しておくようにすることで若干ではあるが、AWSに支払う料金を削減できる。

言葉ではうまく書けないので、ソースコードを読むか、使ってみることをオススメします!

準備

ruby/gem関連
以下のgemが利用可能な状態になっていれば良いかと思います。

  • activesupport (3.0.6)
  • right_aws (2.1.0)
  • right_http_connection (1.3.0)
  • mail (2.2.15)
  • mime-types (1.16)
  • pit (0.0.6)

ちなみに、rubyは1.8.7p334、rubygemsは1.5.2で動作することは確認しています。

■パラメータ設定
AWSの情報はソースコード上に載せることができないため、pitを利用しています。
pitについては、以下のブログ等を参考にしてください。

pitはハードルが高いよ!って思った方は、ソースコードの initializeメソッドのところに設定を直書きしてもOKです!

ちなみにpitの設定ファイルは以下のような感じになるかと思います。

s3:
app_title: "management_util_test"
access_key: "xxxxxxxxxxxxxxxxxxxxxxx"
secret_key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
volume_id: "vol-xxxxxxxx"
region: "ap-northeast-1"
owner_id: "0123456789"
gmail:
to: "test-to@example.jp"
from: "test-from@gmail.com"
password: "password"

使ってみる

使い方はcronでソースコードのファイルを実行するだけ。下記は20分間隔でスナップショットを取得する場合。

$ crontab -e

0,20,40 * * * * ruby /home/interu/manage_snapshot.rb >> /tmp/manage_snapshot.log 2>&1

あとはスナップショットがきちんと取得できているかを確認するだけでOK。


単にスナップショットを取得するだけと思われるかもしれませんが、このような仕組みをいれておくことで、万一、EBS障害が発生したとしても、迅速にサービス復旧ができるようになるかもしれませんので、ぜひ試してみてください。