この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
CloudWatch Events、やればやるほど可能性が感じられるサービスです。超面白い。
さて、弊社にはソンナコトモアロウカトというツールがあります。CloudFormationを使ってAutoScaling Groupを作成し、スケジュールに従って一時的にEC2を立ち上げてEBSスナップショットを取得するものです。
が、CloudWatch Eventsが出てきたことで不要になりました。今回はCloudWatch Eventsを使って毎日EBSスナップショットを自動取得する仕組みをご紹介します。
やってみた
AWS管理コンソールのCloudWatch画面で[Events]-[Rule]をクリックします。
[Rules]画面で[Create rule]ボタンをクリックします。
[Create rule]画面が表示されます。[Event selector]で[Schedule]を選択します。
CloudWatch Eventsのスケジュールは、Fixed Rate(周期的な実行)による指定と、Crontabライクな指定ができます。今回はCrontabライクな指定をしてみました。月曜日から金曜日のAM1:00です。書き方についてはSchedule Expression Syntax for Rulesを参照してください。なお注意事項として、UTCで実行されます。なので以下の指定だと日本時間ではAM10:00に実行されてしまいます。日本時間のAM1:00を指定する場合には「0 16 ? * 1-5 *」になります。
次に[Targets]-[Add target]をクリックします。
[Select target type]で[Built-in target]を選択します。
Built-in targetは以下のものが用意されています。たくさんある!今回は[Create snapshot of an EBS volume]を選択します。
[Volume ID]で、スナップショットを取りたいEBSのVolume IDを指定します。ここで複数選択したりTagで指定したり出来るとアツいのですが、それをやりたい場合はLambdaで作り込む必要がありますね。その後[Configure details]ボタンをクリック。
[Configure rule details]画面が表示されます。[Name]にわかりやすい名前を、[Description]に説明を入力します。[State]で[Enabled]にチェックが入っていることを確認します。
[AWS permissions]で、スナップショットを取得するためのRoleを設定する必要があります。[Create new role]-[Basic built-in targets role]をクリックします。
IAM画面に遷移しますので、[Allow]ボタンをクリック。
ここで設定される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]ボタンをクリックします。
これでRuleが作成されました。
あとは時間になったら勝手に実行されてEBSスナップショットを取得してくれます。
便利!実際に運用に乗せるのであれば、古いEBSスナップショットを削除するLambdaを作って、CloudWatch Eventsで定期実行させる必要がありますね。
さいごに
スケジュールで実行も出来るし、 AWS APIをイベントにしてキックも出来る。Lambdaに渡せるので何でも出来ちゃうし、最初から用意されているBuilt-in targetも豊富。これ、バッチサーバという概念自体を消し去るサービスだと思います。すごいですね。