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