こんにちは!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
「チャンネルへの投稿」のプルダウンリストから、投稿したいチャンネルを選択します。
②インテグレーションの設定画面で、必要な項目を入力
lambdaで使用するので、Webhook URLをコピーしておきます。
※チャンネル、アイコンなどの設定を変更した場合は「設定を保存する」を押して保存してください。
Lambda関数作成
実際にLambda関数を作成する前に、暗号化用KMS、IAMロールを準備します。
①KMSを作成
キーの作成
AWSのコンソールから、KMS→カスタマー管理型のキー→キーの作成
キーの「エイリアス」を入力、ARNはIAMロール作成時に必要になるのでコピーしておきます。
②IAMを作成
②-1. KMSのポリシーを作成
Lambda実行用のIAMロールを作成しますが、まずは先ほど作成したKMS用のポリシーを作成します。
AWSのコンソールから、IAM→ポリシー→ポリシーの作成
ビジュアルエディタのタブをJSONタブに変更、以下貼り付け、先ほど作成したKMSのARNを貼り付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1443036478000", "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": [ "arn:aws:kms:ap-northeast-1:XXXXXXX:key/作成したARNを貼り付け" ] } ] } |
②-2. IAMロールの作成
AWSのコンソールから、IAM→ロール→ロールの作成
- CloudWatchReadOnlyAccess
- AWSLambdaBasicExecutionRole
- 先ほど作成したKMSポリシー
3つのポリシーをアタッチして保存します。
③Lambdaで関数作成
AWSのコンソールから、Lambda→関数→関数の作成
③-1. 設計図の使用 → [cloudwatch-alarm-to-slack-python]を選択、「設定」をクリック
③-2. 「SNSトリガー」設定
・「SNSトリガー」にCloudWatchアラート作成時に選択していたSNSを選択します
その他、「関数名」に、分かりやすい名前をつけておき、必要があれば「関数コード」でlambda_functionのPythonを編集します。
③-3. 「環境変数の設定」
■「環境変数の設定」にSlackのURL、チャンネル名を設定
- kmsEncryptedHookUrlに、暗号化したWebhook URLを入力
- slackChannelに、チャンネル名を入力
■「▼暗号化の設定」項目で有効化にチェックを入れ、KMSキーは作成した暗号化キーを選択します。
入力した環境変数のうち、kmsEncryptedHookUrlの右側にある、「暗号化」をクリックして暗号化します。
■「暗号化」をクリックすると「復号」とボタンが変化しますが、その横のコードをクリックします。
1 |
DECRYPTED = boto3.client('kms').decrypt(CiphertextBlob=b64decode(ENCRYPTED))['Plaintext'] |
■コードをコピーしてソースに追加します。DECRYPTEDなどの名前は変更してください。
このDECRYPTEDの値を確認したところ、b’hooks.slack.com/services/XXXXXXXX/XXXXXXXX/XXXXXXXXXXXXXXXX’というbyte形式になっていたので、
decodeにてhooks.の箇所のみ取り出しました。
このような感じにしてみました。
↓
1 2 3 |
ENCRYPTED_HOOK_URL = os.environ['kmsEncryptedHookUrl'] DECRYPTED_HOOK_URL = boto3.client('kms').decrypt(CiphertextBlob=b64decode(ENCRYPTED_HOOK_URL))['Plaintext'] DECODED_HOOK_URL = DECRYPTED_HOOK_URL.decode('utf-8') |
③-4. 「実行ロール」で、前の手順で作成したロールを選択
③-5. Lambda画面の右上にある「保存」をクリック
保存をクリックすると完成です。
テストで投稿ができているか確認し、必要であれば投稿テキストを編集するなどしてみてください。
〇アラームの状態、アラームの名前、状態の理由を以下のように設定してみました。実際の投稿イメージもご参考にされてください。↓
1 2 3 4 |
slack_message = { 'channel': SLACK_CHANNEL, 'text': "%s : %s - Reason: %s" % (new_state, alarm_name, reason) } |
まとめ
1.CloudWatchアラート、Slackチャンネルの準備
2.Slackで連携用URL取得
3.Lambda関数を作成
今回はこのような流れで作成しました。
Lambdaの設計図が既に用意されているので、簡単にSlackとの連携ができます。
実際にSNSが流れる時に、名前が「アラート」の場合のみSlack連携、なども設定できて便利ですね。
- Simple AWS DeepRacer Reward Function Using Waypoints - 2023-12-19
- Restrict S3 Bucket Access from Specified Resource - 2023-12-16
- Expand Amazon EBS Volume on EC2 Instance without Downtime - 2023-09-28
- Monitor OpenSearch Status On EC2 with CloudWatch Alarm - 2023-07-02
- Tokyo’s Coworking Space Hidden Gem: AWS Startup Loft Tokyo - 2023-05-24