AWSでEC2インスタンスの死活チェックとメール送信

EC2インスタンスで運用をする際に、インスタンスの死活チェックをおこないインスタンスが死んでる際にはメールで知らせたいという要求がありました。そこで折角AWSを使用しているのですから、CloudWatchとSNSを使用してそれを実現してみたいと思います。

準備

まずは環境を用意します。EC2インスタンスを作成します。作成時点でCloudWatchを有効にしておきます。yumhttpdをインストールして稼動させます。適当にindex.htmlファイルを作成してWebから参照できるようにします。最後にELBを作成してインスタンスを紐付けます。chkconfig httpd onで自動起動にしておくと、後ほどインスタンスのSTOP-STARTをする際に楽ができそうです。

Alarmの作成

管理コンソールよりCloudWatchのAlarmを作成します。今回はELBのHealthyHostCountでインスタンスの数をチェックしてメールを送信するようにしてみます。条件は、"HealthyHostCount < 1 for 1 minutes."にします。アクションは新しく作成して追加します。Alarm stateはALARMにし、create topicを選択して名前と送信先アドレスを指定します。topicについては、"Amazon Simple Notification Service(プッシュ方式のメッセージ送信) | AWS"側のお話になります。

メールが送信されることの確認

上記で指定した送信先メールアドレスには、確認用のメールが届きます。この確認はメール内のリンクをクリックして済ませてしまいます。
その後インスタンスをSTOPして、ELBに紐づくインスタンスを減らします。すると、CloudWatch側でインスタンスが減ったことを検知すると、メールが送信されます。

状態が続く限りメールを飛ばしたいのですが。。。

インスタンスの死活監視の場合、インスタンスが死んでいる場合はメールを送信し続けて欲しかったりします。Alarm stateをALARMにして作成した場合、条件が満たされたて状態が変化した初回のみしかメールを送信してくれませんでした。INSUFFICIENT_DATAとにすると、条件が満たされていることを検知し続けている間メールが送信されるのかと思いましたが、そういうわけにはいきませんでした。

危険な状態が続いている場合にはメールを飛ばし続けてもらいたいため、何か方法を探さなくては。。。

インスタンスを停止するとINSUFFICIENT_DATAに

インスタンスを落とした状態にしておいたら、作成していたアラームのステータスがINSUFFICIENT_DATAと表示されていていました。INSUFFICIENT_DATAについてですが、これって対象のデータが取れない場合の状態だったんですね。ELBのメトリックスを監視させていたのに、INSUFFICIENT_DATAになったのはちょっと不思議ではあります。

インスタンスの死活管理にINSUFFICIENT_DATAを使う

あるインスタンスがアクティブかどうかは、CPUUtilizationの値を対象にINSUFFICIENT_DATAのアラームをセットするという方法もとれそうです。インスタンスが死んでしまい、CloudWatchが値を収集できなくなると、INSUFFICIENT_DATAになるようなので、そのアクションでメール送信させます。

コマンドでの操作

"Amazon CloudWatch"のUser ScenariosのCreate an Alarm that Sends Emailにコマンドで操作するための情報がありました。管理コンソールで操作ができるようになっためほとんど必要ないかもしれません。流れを確認するために見たりするのには役に立つように思います。