EBSのスナップショットを定期的に作成するスクリプト

参考にしたもの

こちらのスクリプトに @gommmmmm さんが手を加えたのが元になっています。ありがとうございます。

  • 失敗時にcronからメールを出すために、正常時に標準出力に何も出力しないようにしました。ログはログファイルに出力します。
  • 設定ファイルを追加しました。コマンドラインから実行しやすいように。
  • ローテートタグというのを追加しました。

インストール

実行にはright_awsが必要です。

sudo gem install right_aws

wgetして、

ruby snapshot.rb

で設定サンプルを表示します。config.ymlにコピーして編集してください。直接ファイルに書くときは、

ruby setup.rb dummy > config.yml

としてください。引数の存在しない設定ファイル名 dummy を省略すると、リダイレクト(> config.yml)で作成された空のconfig.ymlファイルを読もうとするため、うまくいきません(そのうち直すかも)。

コマンドライン

コマンドラインオプションは2つあり、どちらも省略できます。

$ ruby snapshot.rb [設定ファイル] [ローテートタグ]

設定ファイルは、デフォルトで同じディレクトリのconfig.ymlを使います。

ローテートタグは、descriptionの末尾に付ける文字列です。後述。

設定ファイル

設定ファイルはYAMLで書きます。

# アクセスキー
access_key: ABCDEFGHIJKLMNOPQRST
secret_key: abcdefghijklmnopqrstuvwxyz/ABC1234567890

# リージョン
region: ap-northeast-1

# 対象のボリューム
volume_id: vol-abcde123

# 説明
description: "www.example.com backup"

# ログファイル。/で始まらない場合は、設定ファイルからの相対パス。
log_file: /path/to/logfile

# 何個残すか。
rotate: 5

# 同じボリュームの同じタグがついてるものをローテート。
rotate_tag: "[rotate]"

スナップショットのdescriptionは、次のような形式で設定されます。

www.example.com backup 2011-08-01 23:59:59 [rotate]

ローテートタグ

ローテートタグを使うと、同じボリュームで複数のローテーションを回せます。例えば、2つの設定ファイルを作って

rotate: 3
rotate_tag: "[daily]"
rotate: 3
rotate_tag: "[weekly]"

とし、cronでそれぞれ、日1回、週1回実行すると、直近の3日と3週分のスナップショットが残ります。

自動で消したくないスナップショットを作るために、rotate_tagをコマンドラインオプションから指定できます。

どのスナップショットを消すかは、コマンドラインオプションと関係なく、設定ファイルの値を使います。コマンドラインで指定したローテートタグは勝手に消えないので要注意です。