【AWS】CloudWatchアラーム通知をLambdaでSlack投稿する

こんにちは!AWSソリューションアーキテクト – アソシエイトを勉強中の初心者エンジニアです。

 

前回の記事(カスタムメトリクスの取得)に引き続き、CloudWatchアラームについてになりますが、
今回は、AWSのCloudWatchアラームをSlackでも確認してみたいと思います。

 

CloudWatchアラーム(メトリクスの状態が変化したときにAmazon Simple Notification Service (以降SNSと表記します)を使用し、メールが送信されるよう設定している状態で、
この通知をSlackでも確認したいので、Lambdaファンクションを使用し、SNSをトリガーにしてSlack連携を行いたいと思います。

 

事前準備

まずは事前準備ですね。
前提としてCloudWatchアラート作成、Slackでのチャンネル用意です。

 

①CloudWatchでアラートを設定

・AWS のCloudWatchにて、Slackへ流したいアラートを設定しておきます。
※今回はメトリクスの状態が変化したときに、SNSで設定したメールアドレスにメールが送信されるように設定しておきました。

 

②Slackのチャンネルを用意

・Slack側で投稿したいチャンネルを作成する、または既存のチャンネルを確認して用意しておきます。

 

準備ができたら、ここから実際にSlackで連携する手順に進みます。

Slack連携用URL取得

Slackで外部連携時に必要なURLを取得する為、SlackにIncoming WebHooksアプリを追加します。

 

①Incoming WebHooksアプリをSlack上のAppから探して追加します

またはこちらのURLにアクセス→ https://slack.com/services/new/incoming-webhook

「チャンネルへの投稿」のプルダウンリストから、投稿したいチャンネルを選択します。

 

slack add application Incoming Webhook

 

②インテグレーションの設定画面で、必要な項目を入力

 

slack application Incoming Webhook settings

 

lambdaで使用するので、Webhook URLをコピーしておきます。

※チャンネル、アイコンなどの設定を変更した場合は「設定を保存する」を押して保存してください。

 

Lambda関数作成

実際にLambda関数を作成する前に、暗号化用KMS、IAMロールを準備します。
 

①KMSを作成
 

キーの作成
AWSのコンソールから、KMS→カスタマー管理型のキー→キーの作成
キーの「エイリアス」を入力、ARNはIAMロール作成時に必要になるのでコピーしておきます。
AWS KMS key management service
 

②IAMを作成

②-1. KMSのポリシーを作成

Lambda実行用のIAMロールを作成しますが、まずは先ほど作成したKMS用のポリシーを作成します。
AWSのコンソールから、IAM→ポリシー→ポリシーの作成

ビジュアルエディタのタブをJSONタブに変更、以下貼り付け、先ほど作成したKMSのARNを貼り付けます。

 

 

②-2. IAMロールの作成

AWSのコンソールから、IAM→ロール→ロールの作成

 

  • CloudWatchReadOnlyAccess
  • AWSLambdaBasicExecutionRole
  • 先ほど作成したKMSポリシー

3つのポリシーをアタッチして保存します。

 

AWS create IAM role for Lambda

 

③Lambdaで関数作成

AWSのコンソールから、Lambda→関数→関数の作成

 

③-1. 設計図の使用 → [cloudwatch-alarm-to-slack-python]を選択、「設定」をクリック

AWS create Lambda for post slack

 

③-2. 「SNSトリガー」設定
・「SNSトリガー」にCloudWatchアラート作成時に選択していたSNSを選択します

AWS Lambda to Slack Chose SNS
 

その他、「関数名」に、分かりやすい名前をつけておき、必要があれば「関数コード」でlambda_functionのPythonを編集します。
AWS Lambda python code
 

③-3. 「環境変数の設定」

■「環境変数の設定」にSlackのURL、チャンネル名を設定

  • kmsEncryptedHookUrlに、暗号化したWebhook URLを入力
  • slackChannelに、チャンネル名を入力

■「▼暗号化の設定」項目で有効化にチェックを入れ、KMSキーは作成した暗号化キーを選択します。
入力した環境変数のうち、kmsEncryptedHookUrlの右側にある、「暗号化」をクリックして暗号化します。

AWS Lambda enviroment settings

■「暗号化」をクリックすると「復号」とボタンが変化しますが、その横のコードをクリックします。

 

■コードをコピーしてソースに追加します。DECRYPTEDなどの名前は変更してください。
 

このDECRYPTEDの値を確認したところ、b’hooks.slack.com/services/XXXXXXXX/XXXXXXXX/XXXXXXXXXXXXXXXX’というbyte形式になっていたので、
decodeにてhooks.の箇所のみ取り出しました。
このような感じにしてみました。

 

③-4. 「実行ロール」で、前の手順で作成したロールを選択

AWS Lambda Select IAM role

 

③-5. Lambda画面の右上にある「保存」をクリック

保存をクリックすると完成です。
テストで投稿ができているか確認し、必要であれば投稿テキストを編集するなどしてみてください。

〇アラームの状態、アラームの名前、状態の理由を以下のように設定してみました。実際の投稿イメージもご参考にされてください。↓

 

 

AWS Lambda posted to slack

 

まとめ

1.CloudWatchアラート、Slackチャンネルの準備
2.Slackで連携用URL取得
3.Lambda関数を作成

今回はこのような流れで作成しました。
Lambdaの設計図が既に用意されているので、簡単にSlackとの連携ができます。

実際にSNSが流れる時に、名前が「アラート」の場合のみSlack連携、なども設定できて便利ですね。

この記事が気に入ったら
いいね ! しよう

Twitter で
The following two tabs change content below.
Fuji
Fuji
初心者エンジニアです。AWSソリューションアーキテクト-アソシエイト勉強中です。

【採用情報】一緒に働く仲間を募集しています

採用情報
ページトップへ