CloudWatch Eventsで毎日EBSスナップショットを自動取得する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

CloudWatch Events、やればやるほど可能性が感じられるサービスです。超面白い。

さて、弊社にはソンナコトモアロウカトというツールがあります。CloudFormationを使ってAutoScaling Groupを作成し、スケジュールに従って一時的にEC2を立ち上げてEBSスナップショットを取得するものです。

が、CloudWatch Eventsが出てきたことで不要になりました。今回はCloudWatch Eventsを使って毎日EBSスナップショットを自動取得する仕組みをご紹介します。

やってみた

AWS管理コンソールのCloudWatch画面で[Events]-[Rule]をクリックします。

CloudWatch_Management_Console

[Rules]画面で[Create rule]ボタンをクリックします。

CloudWatch_Management_Console 2

[Create rule]画面が表示されます。[Event selector]で[Schedule]を選択します。

CloudWatch_Management_Console 3

CloudWatch Eventsのスケジュールは、Fixed Rate(周期的な実行)による指定と、Crontabライクな指定ができます。今回はCrontabライクな指定をしてみました。月曜日から金曜日のAM1:00です。書き方についてはSchedule Expression Syntax for Rulesを参照してください。なお注意事項として、UTCで実行されます。なので以下の指定だと日本時間ではAM10:00に実行されてしまいます。日本時間のAM1:00を指定する場合には「0 16 ? * 1-5 *」になります。

CloudWatch_Management_Console 4

次に[Targets]-[Add target]をクリックします。

CloudWatch_Management_Console_と_名称未設定フォルダ

[Select target type]で[Built-in target]を選択します。

CloudWatch_Management_Console 5

Built-in targetは以下のものが用意されています。たくさんある!今回は[Create snapshot of an EBS volume]を選択します。

CloudWatch_Management_Console 6

[Volume ID]で、スナップショットを取りたいEBSのVolume IDを指定します。ここで複数選択したりTagで指定したり出来るとアツいのですが、それをやりたい場合はLambdaで作り込む必要がありますね。その後[Configure details]ボタンをクリック。

CloudWatch_Management_Console 7

[Configure rule details]画面が表示されます。[Name]にわかりやすい名前を、[Description]に説明を入力します。[State]で[Enabled]にチェックが入っていることを確認します。

CloudWatch_Management_Console 8

[AWS permissions]で、スナップショットを取得するためのRoleを設定する必要があります。[Create new role]-[Basic built-in targets role]をクリックします。

CloudWatch_Management_Console 9

IAM画面に遷移しますので、[Allow]ボタンをクリック。

IAM_Management_Console

ここで設定されるRoleの内容は以下の通り。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Describe*",
        "ec2:RebootInstances",
        "ec2:StopInstances",
        "ec2:TerminateInstances",
        "ec2:CreateSnapshot"
      ],
      "Resource": "*"
    }
  ]
}

[Configure rule details]画面に戻ります。[Create rule]ボタンをクリックします。

CloudWatch_Management_Console 10

これでRuleが作成されました。

CloudWatch_Management_Console 12

あとは時間になったら勝手に実行されてEBSスナップショットを取得してくれます。

EC2_Management_Console

便利!実際に運用に乗せるのであれば、古いEBSスナップショットを削除するLambdaを作って、CloudWatch Eventsで定期実行させる必要がありますね。

さいごに

スケジュールで実行も出来るし、 AWS APIをイベントにしてキックも出来る。Lambdaに渡せるので何でも出来ちゃうし、最初から用意されているBuilt-in targetも豊富。これ、バッチサーバという概念自体を消し去るサービスだと思います。すごいですね。