CloudWatchアラームをSlack通知する

こんにちは!虎の穴ラボのNSSです。今回はCloudWatchアラームが異常を検知した時、Slackに通知する手順をご紹介します。前回私が投稿した「AWS Cloud Watchでディスク容量を監視する」という記事の続きとしてご覧ください。

1. CloudWatchアラームの作成

Slackに通知するアラームを作成します。 CloudWatchアラーム作成手順は、前回の記事に記載していますのでご確認ください。

toranoana-lab.hatenablog.com

2. Incoming Webhooksの作成

SlackでIncoming Webhooksを作成するときは、今までカスタムインテグレーションを利用していましたが、カスタムインテグレーションが廃止予定という注意書きが出ています(2019/08/28現在)。 f:id:toranoana-lab:20190828153954p:plain

いつ廃止になるかわからないので、注意書きの「アプリとの置き換え」から新たな作成方法で作成します。

Incoming Webhooksの新旧比較の詳細はここでは省きますが、
大きな変更点は旧方式は送信先チャンネルがパラメータで指定できたのに対し、
新方式はURLを発行した際のチャンネルにのみ送信できるようになっています。

3. Slack通知の設定

本来であればLambdaでSlack通知ロジックを一から実装していくのですが、今回はServerless Application Repositoryを使う方法をご紹介します。

3-1. Serverless Application Repositoryとは

Serverless Application Repository(以下SAR)とは、チームや個人が作成したサーバーレスアプリケーションを、Githubのように保存し共有することができる、サーバーレスアプリケーション用のマネージド型リポジトリです。SARに自分の欲しい機能のサーバーレスアプリケーションが公開されていれば、実装することなく利用することができます。
※ご利用の際はライセンスにご注意ください。

aws.amazon.com

3-2. AWS Lambdaの設定

AWS Lambdaコンソールを開き、ナビゲーションペインから「関数」を選択し、「関数の作成」をクリックします。 関数の作成画面で「Serverless Application Repositoryの参照」を選択します。 f:id:toranoana-lab:20190827111707p:plain

検索フォームが表示されるので、「cloudwatch slack」等のキーワードで検索すると いくつか公開されているアプリケーションがヒットします。 今回はAWSが自ら公開している「cloudwatch-alarm-to-slack-python3」を使用します。

f:id:toranoana-lab:20190827114028p:plain

ソースコードURL github.com

「cloudwatch-alarm-to-slack-python3」を選択すると設定とデプロイ画面に遷移します。ここでアプリケーションの設定を入力しデプロイを行います。

f:id:toranoana-lab:20190827113603p:plain

アプリケーション名:
cloudwatch-alarm-to-slack-python3がデフォルトで設定されています。変更したい場合は別の名称を設定します。

KeyIdParameter:
後述するAWS Key Management ServiceのIDを設定します。

kmsEncryptedHookUrlParameter:
SlackのincomingWebHookのURLを"https://"を除いた値で設定します。デプロイ後も変更可能です。

slackChannelParameter:
通知するSlackのチャンネル名を"#"抜きで設定します。デプロイ後も変更可能です。

設定値の入力が終わったら「デプロイ」ボタンを押します。

3-3. CloudWatchアラーム送信先変更

デプロイが完了すると、新しくAmazon SNSのトピックが作成されます。 これをCloudWatchアラームの通知の送信先に指定します。 f:id:toranoana-lab:20190829173523p:plain

4. AWS Key Management Service (KMS) の設定

4-1. KMSとは

KMSとは、データの暗号化に使用するキーの容易な作成および管理を行うことができるサービスです。 多くのAWS のサービスやアプリケーションで暗号化の使用を制御できるようになります。

4-2. キーの作成

KMSコンソールからキーを作成をクリックし、手順に従いキーを作成します。

ステップ1:エイリアスと説明の追加
キーのエイリアスと説明を設定します。

ステップ2:タグの追加
タグの設定は任意です。

ステップ3:キーの管理アクセス許可を定義
キーの有効化や削除などができるユーザーを定義できます。必須ではありません。

ステップ4:キーの使用アクセス許可を定義
暗号化・複合化を許可するユーザーを定義できます。必須ではありません。

ステップ 5:キーポリシーの確認と編集
ステップ3・4で定義したアクセス許可の確認です。特に編集する必要はありません。

設定が完了するとキーが作成され、キーIDが発行されるので3-2のKeyIdParameterに設定します。

4-3. 環境変数の暗号化

Lambdaコンソールで環境変数を設定します。 f:id:toranoana-lab:20190829171157p:plain kmsEncryptedHookUrlに2.で作成したIncoming WebHooksのURLの"https://"以下を設定します。 slackChannelに通知するチャンネルを設定します。ただ、2.で述べたようにチャンネルは固定に変更されているので、この設定に意味はありません。

それぞれ値を入力し、暗号化の設定で「伝送中の暗号化のためのヘルパーの有効化」をチェックします。
「伝送中に暗号化するAWS KMS キー」に4-2.で作成したキーを指定します。
「保管時に暗号化するAWS KMS キー」でデフォルトかカスタマーマスターキーかを指定します。例ではカスタマーマスターキーを選択し、4-2.で作成したキーを指定しています。

環境変数の設定に「暗号化」というボタンが表示されていますので、kmsEncryptedHookUrlの暗号化」ボタンをクリックして暗号化します。slackChannelは暗号化しません。

最後にLambdaコンソールの「保存」ボタンをクリックして設定は完了です。 動作確認して、CloudWatchアラームのメッセージが飛べば成功です。 f:id:toranoana-lab:20190829174341p:plain

5. まとめ

Cloud Watchアラームの異常をSlack通知する方法をご紹介しました。 今回の対応でシステムに異常があったことをチーム全体で検知できるようになりました。 システムエラーはない方がいいですが、万が一発生してしまったときに、誰かが気づいて早く対応できるようにしておくと安心ですね。

P.S.

虎の穴では一緒に働く仲間を絶賛募集中です! この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。 yumenosora.co.jp

また、9/11(水)には御茶ノ水にて会社説明会を開催いたします。ご興味のある方は是非ご応募ください! yumenosora.connpass.com