AWS Chatbotを使って、Slack通知をカスタマイズする

AWS

2024.2.15

Topics

はじめに

こんにちは、Shunです。

AWSを活用する多くの方が、様々な通知をSlackに送信していることでしょう。しかし、デフォルトの設定では、情報が見づらかったり、必要な情報を把握するまでに時間がかかることがあります。そこで、AWS Chatbotを用いてSlackに送る通知内容をカスタマイズする方法をご紹介します。

AWS Chatbot は、Microsoft Teams および Slack チャンネルで AWS のリソースをより簡単にモニタリングおよび操作できるようにしてくれるインタラクティブエージェントです。AWS Chatbot を使用することで、アラートを受信することや、診断情報の取得、AWS Lambda 関数の呼び出し、AWS サポートケースの作成を行うコマンドを実行することができ、チームでの共同作業やイベント対応がさらに迅速になります。

引用: AWS Chatbot

想定読者

  • AWSからの通知をSlackへ送っている方
  • CloudWatchアラームなどの通知をカスタマイズしたい方

本記事で紹介する内容

  • AWS Chatbotの設定手順
  • AWS Chatbotに付随するパラメータ説明
  • AWS Chatbotに関連するサービスの設定方法

本記事で取り扱わない内容

  • Amazon SNSなど関連リソースの説明
  • Slackワークスペースの作成方法

実施すること

概要

Amazon SNS、Amazon CloudWatch Alarm、Amazon EventBridge、AWS Chatbotを設定し、Slackに通知します。今回は、EC2のCPU使用率を基にアラームを設定します。

料金

  • AWS Chatbot: 無料
  • Amazon SNS: $0.5/100万通知
  • Amazon CloudWatch Alarm: $0.1/アラームメトリクス(月)
  • Amazon EventBridge: $1.00/100万イベント

今回の検証を通して、発生する費用は数円です。

構成図

構築するサービスの構成図は以下の通りです。

前提

  • 東京リージョンであること
  • EC2が構築済みであること

手順

本記事で行う手順は以下の通りです。

  1. Amazon SNSの設定
  2. AWS Chatbotの設定
  3. Amazon CloudWatch Alarmの設定
  4. Amazon EventBridgeの設定
  5. Slackでの通知テスト

実際の作業

1.Amazon SNSの設定

最初に、Amazon SNSトピックを「スタンダード」タイプで作成します。その他の設定はデフォルトで問題ありません。

2.AWS Chatbotの設定

AWS ChatbotとSlackの連携を行います。「新しいクライアントを設定」から「Slack」を選択し、Slackワークスペースへのアクセス権限を許可します。

連携成功後、Slackチャネルへの通知設定を行います。

SlackチャネルへチャネルIDまたはURLを入力します。

アクセス許可は、「ロール名」のみ入力します。

その他の設定値も気になると思いますので、簡単にご紹介します。

チャネルロール
Slackのチャネルにいるメンバー全員の権限

ユーザーレベルのロール
Slackのチャネルにいるメンバー個別の権限

チャネルガードレールポリシー
チャネルロール、ユーザーレベルのロールに付与される権限を制限するための機能

詳しくは以下の公式ドキュメントを参照ください。

AWS公式ドキュメント: AWS Chatbot のアクセス許可について

最後に、先ほど作成したAmazon SNSトピックを紐づけて、設定完了です。

3. Amazon CloudWatch Alarmの設定

アラームを設定する際に使用するメトリクスは何でも構いませんが、今回は例としてEC2のCPU使用率に基づいてアラームを作成します。

EventBridgeを使用してアラームを検知するため、「アクションの設定」は不要です。その他の設定はデフォルトのままでアラームを作成します。

アラームの作成完了後、「詳細」から「EventBridge ルールを表示」を確認します。この情報をもとにEventBridgeの設定を行います。

{
  "source": [
    "aws.cloudwatch"
  ],
  "detail-type": [
    "CloudWatch Alarm State Change"
  ],
  "resources": [
    "arn:aws:cloudwatch:ap-northeast-1:xxxxxxxxx:alarm:xxxxxxxx"
  ]
}

4.Amazon EventBridgeの設定

EventBridgeで「イベントパターンを持つルール」を選択します。

次に、「イベントパターン」の設定を行います。ここでは、先ほど確認したEventBridge ルールをもとに設定を行います。(今回は、CloudWatch Alarmのアラーム状態のみを検知したいため、追記します。)

以下のハイライトしている箇所を先ほどメモしたイベントへ追記してください。

{
  "source": [
    "aws.cloudwatch"
  ],
  "detail-type": [
    "CloudWatch Alarm State Change"
  ],
  "resources": [
    "arn:aws:cloudwatch:ap-northeast-1:xxxxxxxxxx:alarm:xxxxxxxxxxx"
  ],
	"detail": {
	    "state": {
	      "value": ["ALARM"]
	    }
	  }
}

続いて、「ターゲットを選択」し、作成したSNSトピックを指定します。「追加設定」で「入力トランスフォーマーを設定」を選択します。

入力トランスフォーマーを用いて、CloudWatch Alarmから受け取ったイベントをSNSへ送信するための整形を行います。CloudWatch Alarm State Changeを検索して、どのようなデータが受け取れるかを確認します。

この先、「入力パス」と「テンプレート」といった項目を入力していくのですが、その記入例も確認することができます。

入力パス

入力パスでは、イベントから受け取った値を変数で定義し、テンプレートで使用します。以下はその定義例です。

{
  "account": "$.account",
  "alarm": "$.detail.alarmName",
  "description": "$.detail.configuration.description",
  "instance": "$.detail.configuration.metrics[0].metricStat.metric.dimensions.InstanceId",
  "metrics_name": "$.detail.configuration.metrics[0].metricStat.metric.name",
  "state": "$.detail.state.value",
  "timestamp": "$.detail.state.timestamp"
}

テンプレート

テンプレートでは、これらの変数を用いてSlackへの通知文面を定義します。Slackの絵文字も使用可能です。(お好みの絵文字などを設定してください。)

{
  "version": "1.0",
  "source": "custom",
  "content": {
    "textType": "client-markdown",
    "title": ":red_circle: <state>:EC2インスタンス(<instance>)ステータスチェックアラート",
    "description": "発生時刻 : `<timestamp>`\nアカウント : <account>\nインスタンス : `<instance>`\nメトリクス : <metrics_name>\nアラーム : <alarm>",
    "nextSteps": [
      "異常の原因は :naze:"
    ]
  }
}}

これでアラームの設定は完了です。

同様に、アラームの状態が「OK」になった際のEventBridgeの設定も行います。

以下のハイライトをOKとし、入力パス、テンプレートを作成します。(同様の作業となるため、割愛します。)

{
  "source": [
    "aws.cloudwatch"
  ],
  "detail-type": [
    "CloudWatch Alarm State Change"
  ],
  "resources": [
    "arn:aws:cloudwatch:ap-northeast-1:xxxxxxxxxx:alarm:xxxxxxxxxxx"
  ],
	"detail": {
	    "state": {
	      "value": ["OK"]
	    }
	  }
}

これでEventBridgeの設定は完了です。

5.Slackでの通知テスト

最後に、実際にSlackで通知を受け取れるかテストします。CPU使用率80%をしきい値と設定していますが、テストのためにこの値を超えるように設定変更するか、新しく設定したばかりでデータが不足している状態を異常とするなどして、アラームを上げます。

以下はSlackで受け取った通知の例です。アラーム名、インスタンスID、アカウントなどが明確に表示され、視認性が高まっています。

アラームが「OK」になった際も、EventBridgeからの通知が届きます。

まとめ

AWS Chatbotを利用することで、CloudWatch Alarmの通知内容をカスタマイズでき、非常に便利です。今回はご紹介できませんでしたが、Slack上でAWS CLIコマンドを実行し、インスタンスの再起動などのアクションも設定可能です。(そのためのチャネルロールだったりします。)

今後も便利な使い方を見つけたら、紹介していきたいと思います。

最後まで読んでいただきありがとうございます!

Shun

好きな言葉は生ビール199円です。日本ビール協会認定1冠、AWS12冠、Google Cloud11冠

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら