[運用Tips] EC2やRDSのメンテナンス通知をSlackに連携する

AWS運用自動化サービス「Cloud Automator」

PS課佐竹です。
最近「CloudWatchのイベント通知を設定していて良かったな」と思うことがあったので、その内容を紹介させて頂きます。

はじめに

今回は、AWSから定期的に来る「メンテナンス通知」をSlackに連携する方法について記載します。

メンテナンス通知とは

EC2やRDS等のサービスでは、定期的にインスタンス(仮想マシン)が動作しているハイパーバイザーやハードウェアレベルでのメンテナンスが行われます。そのメンテナンスのタイミングで、メンテナンス対象となったハイパーバイザー(ハードウェア)上で動作するインスタンス(仮想マシン)を利用中の各ユーザに通知が行われます。

特に設定をしていない場合、連絡が来るのは以下の2つの方法となります。

  1. Personal Health Dashboard で通知が来る
  2. メールアドレスにメールが送付される

このうちの2つ目「メールアドレスにメールが送付される」ですが、以下のような件名と内容で連絡が来ます。

[件名] Amazon EC2 Maintenance – Maintenance [AWS Account: XXXXXXXXXXXX]
 
Dear Amazon EC2 Customer,
 
One or more of your Amazon EC2 instances is scheduled for maintenance on 2019-02-15 for 2 hours starting at 2019-02-15 04:00:00 UTC. During this time, the following instances in the ap-northeast-1 region will be unavailable and then rebooted:
 
i-[instance id]
 
During the scheduled maintenance window, your instance will undergo a reboot. The instance will retain its IP address, DNS name, and any data on local instance-store volumes. Please note that any reboot you perform on your own will not alleviate the need for this maintenance.
 
However, you can complete this maintenance at a time of your choosing by stopping and restarting your instance at any time prior to the scheduled maintenance window. Please note that the data on your local instance-store volume will not be persisted if you stop and start your instance.

しかし、このメールが確実に来る保証は実はされていない場合もあるのです。それにメールはやはり見逃します。
加えて、Personal Health Dashboard はその確認において、マネジメントコンソールにログインして閲覧するという能動的な動きを行う必要があります。そのため、弊社ではこの運用対応においてSlackに通知するという仕組みを採用することにしてみました。

前準備1:Slackで通知用のメールアドレスを取得する

まずは、以下の手順に従って、Slackの機能を用いて連絡用のメールアドレスを取得してください。

⑤メールアドレスをコピーします。このアドレスへ送られたメールはご希望のチャンネルまたは DMに投稿されます。

上記の手順で得たメールアドレスを、この後の手順で利用します。

前準備2:SNSでTopicを作成する

SNSでTopicを作成します。Topic nameとDisplay nameを入れてCreate topicするだけで作成できます。Display nameは10文字の制限があり、この名称がメールのFromにそのまま表示されます。

Topicを作成したらそのTopicにSubscriptionを作成します。
今回、このProtocolにEmailを選択し、そのEndpointとなるメールアドレスには、先ほど取得したSlackのメールアドレスを入力します。

ここまでで、前準備は完了となります。

CloudWatchでスケジュールされたメンテナンスをSNSで通知する

CloudWatch Eventsの画面で通知の設定を行います。
公式ドキュメントは「Amazon CloudWatch Events での AWS Health イベントのモニタリング」になります。

左端のメニュー「Events」を押下すると、上の画像と同じ画面が表示されますので、Get Startedを押下してください。以下のCreate ruleの画面に遷移します。

赤枠で囲ったところを設定してください。今回は「EC2」をターゲットとした設定を行います。

  1. Service Name で [Health] を選択します
  2. Event Typeで[Specific Health events]を選択します ※All Eventsだと全ての通知が来てしまいノイズになるため
  3. [Specific service(s)] を選択し、リストから [EC2] を選択します ※複数のサービスをまとめて選択はできません
  4. [Specific event type category(s)] を選択し、リストから [scheduledChange] を選択します

この選択を終えると、以下のJsonが完成します。

JsonはEditボタンから直接編集することも可能ですので、設定をImportすることも可能です。

RDSで設定すると上記のようになります。他のサービスでもscheduledChangeで気になるものがあれば、そのサービス分だけ設定をされると良いでしょう。

最後にTargetsの設定画面にて、SNSのTopicと連携する設定をして完了です。 [Configure Details] を押下した次の画面にて、作成したruleに名前を付けて [Create rule] を押下してください。なお、Targetsの設定は必須となりますので、この設定が完了しない限り画面右下の [Configure Details]ボタンは押下できません。

今回は、EC2に関連したruleの作成方法を紹介しましたが、RDSでも必要な場合は、もう1つRDS用のrule作成が必要となります。ELASTICACHEが必要であれば、ELASTICACHE用にもう1つruleが必要・・・と、メンテナンス通知を取得したいサービスごとにruleが増えて行きます。

流れ

整理のために記載しますと [CloudWatch Events]→[SNS topic]→[SlackのE-mail Adress]→[Slack]という流れで連携されます。

実際のSlackの画面

この設定の困った点の1つは、設定が正しく行われているのかの確認が、実際にメンテナンスがスケジュールされるまでわからないというところです。そこで、例として実際にメンテナンス通知がSlackの画面に登場したらどうなるのか、キャプチャしてきました。

SNSからは、Jsonでメールが届くので、はっきり言って可読性はかなり悪いです。ですが、「気付く」ことは十分に可能です。

まとめ

今回、CloudWatch EventsからSlackにSNSを使ってメンテナンス通知を連携する方法を記載させて頂きました。
先に記載した通り、可読性は少々低い通知にはなるのですが、Slackに連携されると高確率で気付くことができます。詳しい内容は、Personal Health Dashboardを確認すれば問題ありません。それに実装が非常に簡単です。Lambdaなどを間に挟むことでSlackでメンションをしたりすることで、さらに利便性を高めることは可能なのですが、お手軽にSlackに連携するという敷居の低さが魅力だと思います。
またメールが確実に送られることが無い、というときでもCloudWatch Eventsなら確実に通知してくれるのです!

この設定がいろんな案件で設定されることで、メンテナンス通知の抜け漏れが減り、お客様の満足度が少しでも上がればと思いながら以上でこの記事を終わりにいたします。

AWS運用自動化サービス「Cloud Automator」