AWS ChatbotとSlackを連携してみた

# 背景・目的
Slackにメッセージ通知するソリューションを探している過程で、AWS Chatbotというものが利用できることを知りました。
あまりわかっていなかったので、整理したいと思います。

# まとめ
下記に特徴を整理します。

|特徴|説明|
|:--|:--|
|AWS Chatbotとは|DevOps チームとソフトウェア開発チームがメッセージング プログラムのチャットルームを使用して AWS クラウド内の運用イベントを監視および対応できるようにする AWS のサービス<BR><BR>SNSからのサービス通知を処理しチャットルームに転送する<BR><BR>AWS の ChatOps を可能する|
|Chatbotの機能|・Chatbotの機能<BR>・IAMポリシーテンプレート<BR>・通知の受信<BR>・通知のカスタマイズ<BR>・カスタムアクションを作成する<BR>・Microsoft Teams と Slack を使用して AWS CLI 経由で AWS リソースを監視および管理する<BR>・AWS 情報の検索と発見<BR>・Amazon Q に質問する|
|Chatbotの仕組み|Chatbotは、SNSにトピックを使用して、AWSサービスからイベントとアラームの通知をチャットチャンネルに送信する<BR><BR>SNS トピックが設定されたチャットクライアントに関連付けられると、さまざまなサービスからのイベントとアラームが処理され、指定されたチャットチャネルとWeb Hookに通知が配信される|

# 概要
下記を基に整理します。

https://docs.aws.amazon.com/ja_jp/chatbot/latest/adminguide/what-is.html

> AWS Chatbot は、DevOps チームとソフトウェア開発チームがメッセージング プログラムのチャットルームを使用して AWS クラウド内の運用イベントを監視および対応できるようにする AWS のサービスです。AWS Chatbot は、Amazon Simple Notification Service (Amazon SNS) からの AWS サービス通知を処理し、チャットルームに転送します。これにより、チームは場所に関係なく、通知を即座に分析して対応することができます。

- DevOps チームとソフトウェア開発チームがメッセージング プログラムのチャットルームを使用して AWS クラウド内の運用イベントを監視および対応できるようにする AWS のサービス
- SNSからのサービス通知を処理しチャットルームに転送する

## AWS チャットボットの機能
> AWS Chatbot は AWS の ChatOps を可能にします。ChatOpsは、 DevOps チームがチャットクライアントとチャットボットを使用して通信し、タスクを実行できるようにすることで、ソフトウェアの開発と運用をスピードアップします。AWS Chatbot は、チャットユーザーに AWS サービスのイベントを通知するため、チームは SNS トピックからメールに対応する代わりに、共同で問題をリアルタイムで監視して解決できます。AWS Chatbot では、Amazon CloudWatch からのインシデントメトリクスをチャット通知で表示するためのチャートとしてフォーマットすることもできます。

- AWS の ChatOps を可能する
    - ChatOpsは、 DevOps チームがチャットクライアントとチャットボットを使用して通信し、タスクを実行できるようにすることで、ソフトウェアの開発と運用をスピードアップする
- チャットユーザーに AWS サービスのイベントを通知するため、チームは SNS トピックからメールに対応する代わりに、共同で問題をリアルタイムで監視して解決できる
-  CloudWatch からのインシデントメトリクスをチャット通知で表示するためのチャートとしてフォーマットもできる

> AWS Chatbot サービスの重要な機能は次のとおりです。
> - Amazon Chime、Microsoft Teams、Slack をサポート– 数回クリックするだけで、AWS Chatbot を Amazon Chime チャットルーム、Microsoft Teams チャネル、または Slack チャネルに追加できます。

> - 定義済みの AWS Identity and Access Management (IAM) ポリシーテンプレート– AWS Chatbot は、AWS Identity and Access Management (IAM) を通じてチャットルーム固有のアクセス許可コントロールを提供します。AWS Chatbot の定義済みテンプレートを使用すると、特定のチャネルまたはチャットルームに関連付けるアクセス許可を簡単に選択して設定できます。

> - 通知の受信– AWS Chatbot を使用して、運用アラーム、セキュリティアラート、予算の逸脱など、サポートされているソースから運用上のインシデントやその他のイベントに関する通知を受信します。AWS Chatbot コンソールで通知を設定するには、通知を受信するチャネルまたはチャットルームを選択し、通知をトリガーする Amazon Simple Notification Service (Amazon SNS) トピックを選択するだけです。

> - 通知のカスタマイズ– チャットチャネルで直接、カスタマイズされた AWS サービスおよびアプリケーションの通知を定義して受信できます。カスタム通知は、必要に応じて簡潔または包括的にすることができ、デフォルトの通知と同じ Amazon SNS ベースのメカニズムを使用します。

> - カスタムアクションを作成する– カスタムアクションは、通知をアクション可能なアイテムに変換します。カスタムアクションは、通知にボタンとして表示されます。このボタンは、定義した Lambda 関数または CLI コマンドを表します。カスタムアクションを使用して、テレメトリ情報を取得したり、Lambda 関数を実行したり、自動化ランブックを実行したり、チームメンバーに通知したりできます。問題が発生した場合は、通知から直接簡単にアクションを実行できます。

> - Microsoft Teams と Slack を使用して AWS CLI 経由で AWS リソースを監視および管理します– AWS Chatbot はほとんどの AWS サービスの CLI コマンドをサポートしているため、デスクトップやモバイル デバイスのチャット クライアントから AWS リソースを簡単に監視および管理できます。チームは、診断情報をリアルタイムで取得したり、AWS リソースを変更したり、AWS SSM ランブックを実行したり、集中管理された場所から長時間実行されるジョブを開始したりできます。AWS Chatbot コマンドは、標準の AWS コマンドライン インターフェイス構文を使用します。

> - AWS 情報の検索と発見– AWS Chatbot に自然言語で質問することで、AWS サービスと AWS リソースに関する情報を検索して発見できます。チャットチャネルで提供される回答は、AWS 環境、AWS 製品ドキュメント、サポート記事から直接取得されます。これにより、リソースの検索、製品情報の検索、問題のトラブルシューティングが容易になります。

> - Amazon Q に質問する– AWS サービスに関する質問に対して、生成型人工知能 (AI) アシスタントである Amazon Q から直接チャットチャネルで回答を得ることができます。

- Chatbotの機能
    - 下記をサポート
        - Amazon Chime
        - Microsoft Teams
        - Slack
    - IAMポリシーテンプレート
        - ChatbotはIAMを通じて、チャットルーム固有のアクセス許可コントロールを提供する
        - Chatbot の定義済みテンプレートを使用すると、特定のチャネルまたはチャットルームに関連付けるアクセス許可を簡単に選択して設定できる
    - 通知の受信
        - Chatbot を使用して、運用アラーム、セキュリティアラート、予算の逸脱など、サポートされているソースから運用上のインシデントやその他のイベントに関する通知を受信する
        - 通知を設定するには、受信するチャンネルまたはチャットルームに選択肢、通知をトリガーするSNSトピックを選択する
    - 通知のカスタマイズ
        - チャットチャネルで直接、カスタマイズされた AWS サービスおよびアプリケーションの通知を定義して受信できる
    - カスタムアクションを作成する
        - カスタムアクションは、通知をアクション可能なアイテムに変換する
        - カスタムアクションは、通知にボタンとして表示される
        - ボタンは、定義した Lambda 関数または CLI コマンドを表す
        - カスタムアクションを使用して、テレメトリ情報を取得したり、Lambda 関数を実行したり、自動化ランブックを実行したり、チームメンバーに通知できる
    - Microsoft Teams と Slack を使用して AWS CLI 経由で AWS リソースを監視および管理する
        - AWS Chatbot はほとんどの AWS サービスの CLI コマンドをサポートしているため、デスクトップやモバイル デバイスのチャット クライアントから AWS リソースを簡単に監視および管理できる
    - AWS 情報の検索と発見
        - AWS Chatbot に自然言語で質問することで、AWS サービスと AWS リソースに関する情報を検索して発見できる
    - Amazon Q に質問する
        - AWS サービスに関する質問に対して、Amazon Qから直接チャットチャンネルで回答を得る

## AWS チャットボットの仕組み
> AWS Chatbot は、Amazon Simple Notification Service (Amazon SNS) トピックを使用して、AWS のサービスからのイベントとアラームの通知をチャットチャネルに送信します。SNS トピックが設定されたチャットクライアントに関連付けられると、さまざまなサービスからのイベントとアラームが処理され、指定されたチャットチャネルとウェブフックに通知が配信されます。Microsoft Teams と Slack の場合、管理者がワークスペースまたはテナントの AWS Chatbot サポートを承認すると、ワークスペースまたはチームの誰でも AWS Chatbot をチャットチャネルに追加できます。Amazon Chime の場合、Amazon Chime を使用するための AWS Identity and Access Management (IAM) アクセス許可を持つユーザーは、AWS Chatbot をウェブフックに追加できます。AWS Chatbot コンソールを使用して、SNS トピックからの通知を受信するようにチャットクライアントを設定します。

- Chatbotは、SNSにトピックを使用して、AWSサービスからイベントとアラームの通知をチャットチャンネルに送信する
- SNS トピックが設定されたチャットクライアントに関連付けられると、さまざまなサービスからのイベントとアラームが処理され、指定されたチャットチャネルとWeb Hookに通知が配信される
- TeamsとSlackの場合、管理者がワークスペースまたはテナントの AWS Chatbot サポートを承認すると、ワークスペースまたはチームの誰でも AWS Chatbot をチャットチャネルに追加できる
- Chime の場合、Chime を使用するための IAM アクセス許可を持つユーザーは、AWS Chatbot をウェブフックに追加できる
- Chatbot コンソールを使用して、SNS トピックからの通知を受信するようにチャットクライアントを設定する

> AWS Chatbot は、Amazon CloudWatch、AWS Billing and Cost Management、AWS Security Hub など、多数の AWS サービスをサポートしています。サポートされているサービスの完全なリストについては、「AWS サービスのモニタリング」を参照してください。

- Chatbotは、CloudWatch、Billing and Cost Management、Security Hubなどサービスをサポートしている

> AWS Chatbot を使用して、チャットチャネルで直接 AWS CLI コマンドを実行することもできます。診断情報を取得したり、AWS リソースを設定したり、ワークフローを実行したりできます。コマンドを実行するために、AWS Chatbot は必要なパラメータがすべて入力されているかどうかを確認します。不足しているパラメータがある場合、AWS Chatbot は必要な情報の入力を求めます。次に、AWS Chatbot は、設定された IAM ロールとチャネルガードレールポリシーで許可されている内容とコマンドを照合して、コマンドが許可されているかどうかを確認します。詳細については、「チャットチャネルからの AWS CLI コマンドの実行」および「アクセス許可の理解」を参照してください。

- Chatbot を使用して、チャットチャネルで直接 AWS CLI コマンドを実行できる
- 診断情報を取得したり、AWS リソースを設定したり、ワークフローを実行できる
- コマンドを実行するために、AWS Chatbot は必要なパラメータがすべて入力されているかどうかを確認する
    - 足しているパラメータがある場合、AWS Chatbot は必要な情報の入力を求める
    - 次に、AWS Chatbot は、設定された IAM ロールとチャネルガードレールポリシーで許可されている内容とコマンドを照合して、コマンドが許可されているかどうかを確認する

## AWS チャットボットの要件
> AWS Chatbot を使用するには、次のものが必要です。
> - AWS Chatbot のセットアップ中に Amazon Chime、Microsoft Teams、または Slack チャットクライアントに関連付ける AWS アカウント。
> - Amazon Chime チャットルーム、Microsoft Teams テナント、または Slack ワークスペースの管理者権限。Slack ワークスペースの所有者になるか、ワークスペースの所有者と協力して AWS Chatbot のインストールの承認を得ることができます。
> - AWS Identity and Access Management (IAM) と IAM ロールおよびポリシーに関する知識。IAM の詳細については、IAM ユーザーガイドの「IAM とは」を参照してください。
> - AWS Chatbot でサポートされている AWS サービスの使用経験。通知を送信するために Amazon Simple Notification Service (Amazon SNS) トピックをサブスクライブするようにこれらのサービスを設定した経験も含まれます。サポートされているサービスの詳細については、「AWS Chatbot を他の AWS サービスと共に使用する」を参照してください。

- 下記が必要
    - Amazon Chime、Microsoft Teams、または Slack チャットクライアントに関連付ける AWS アカウント
    - Amazon Chime チャットルーム、Microsoft Teams テナント、または Slack ワークスペースの管理者権限
    - IAM、SNSトピック

## AWS Chatbot でサポートされているサービス
- ほとんどの通知の送信に Amazon EventBridge を使用する
- [イベントを生成するAWSのサービス](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-service-event-list.html)
- Chatbotは、下記のサービス通知もサポートしている
    - Amazon CloudWatch
    - Amazon CodeCatalyst
    - AWS CodeStar
    - AWS Insights Overwatch


# 実践
## チュートリアル: Slack を使い始める
下記を基に試します

https://docs.aws.amazon.com/chatbot/latest/adminguide/slack-setup.html

### ステップ1: Slackクライアントを設定する

1. Slackのナビゲーションペインで、「自動化」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d3f7b83a-49f8-6b0f-035a-dade5ab74ec0.png" width= 300 />

1. Appをクリックします
1. Chatbotで検索し、「AWS Chatbot」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6d9f5cf3-a402-938b-d433-7a4426778237.png" width =200 />

1. AWSにサインインし、Chatbotに移動します
1. 「Slack」を選択し、「クライアントを設定」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/06afc492-de28-8c7f-0aea-49f12a6c7d7b.png" width=300 />

1. リダイレクトされるので、Slackワークスペースを指定し、「続行する」ボタンをクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/91662a16-be31-a49d-e63f-76da63fd995b.png" width=300 />

1. 権限をリクエストする画面に切り替わるので、「許可する」をクリックします

### ステップ2: Slackチャンネルを設定する
1. Slackチャンネルで、下記を入力します
    ```
    invite @aws
    ```
1. 「招待する」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5177e4e7-c8ec-940c-ab7d-7d9733070443.png" width=500 />

1. AWS Chatbotコンソールのワークスペースの詳細ページで「新しいチャンネルを設定」をクリックします
1. 下記を入力し、「設定」をクリックします
    - 設定名：任意
    - Amazon CloudWatch Logs にログを発行する：ログを出す場合
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5c51c932-b439-1187-4f12-75372431390f.png)
    - チャンネルタイプ：
    - チャンネル名：
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f6a2d994-788a-ca69-d9e1-e0a890bf2dcd.png)
    - ロール設定：チャンネルロール or ユーザレベルのロール
    - チャンネルロール：テンプレートを使用してIAMロールを作成する
    - ロール名：任意
    - ポリシーテンプレート：
    - チャンネルガードレールポリシー：AmazonQDeveloperAccessを追加
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/cb42e4a0-d2ca-65cb-7954-7bcc67945b9c.png)
    - リージョン
    - SNSトピック
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/011480a7-c7c7-bb05-1c9f-d853915d80c3.png)

1. できました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/192015da-66c4-9920-c41a-6af96acb7241.png)

### ステップ3: AWSサービスからSlackへの通知をテストする
1. ①「対象のチャンネル」を選択し、②「テストメッセージを送信」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e818e903-68dc-7342-7aec-685e264181c1.png)
1. 画面上部にメッセージが表示されます
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6e1f27ce-b889-b51d-023b-f4884a14a349.png)

1. Slackにメッセージが届きます。届きました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3da1e1e4-13d6-fc96-847e-fbc282d68670.png)

## AWS Chatbot を使用した AWS サービスの監視
下記を元に、気になったサービスについて試します。

https://docs.aws.amazon.com/chatbot/latest/adminguide/related-services.html

### AWS 請求とコスト管理

#### Slackチャンネル作成
1. 事前にSlackチャンネルを作成します。上記の手順と同様なので割愛します

#### SNSトピックの作成
下記を元に、試します。

https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-sns-policy.html


1. SNSに移動します
1. ナビゲーションペインで「トピック」に移動します
1. 「トピックの作成」をクリックします
1. 「トピック名」を入力し「トピックの作成」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/316d4ce6-3d94-b49a-0ae4-ef208667389b.png)
1. 作成したトピック名をクリックし、「編集」をクリックします
    
1. 「アクセスポリシー」をクリックし、下記のポリシーStatementに追加します
    ```JSON
    {
      "Sid": "E.g.,AWSBudgetsSNSPublishingPermissions",
      "Effect": "Allow",
      "Principal": {
        "Service": "budgets.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "your topic ARN",
       "Condition": {
            "StringEquals": {
              "aws:SourceAccount": "<account-id>"
            },
            "ArnLike": {
              "aws:SourceArn": "arn:aws:budgets::<account-id>:*"
            }
          }
    }
    ```
1. 「変更の保存」をクリックします

#### 予算アクションの設定
下記を元に、試します。

https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-action-configure.html

1. 予算の設定をします（[予算の編集](https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-edit.html)）

1. SNSアラートに上記で作成したSNSのARNを指定します

#### Chatbotの設定
1. 対象のSlackワークスペースを選択します
1. 「新しいチャンネルを設定」を選択します
1. 設定名とCloudWatch Logsを指定します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4db39039-7096-0561-64cd-38d2e26a9d48.png)

1. チャンネルタイプと、チャンネル名（チャンネルID）を指定します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2ca4a3ec-9559-91ec-be42-5b3db9e1f1ec.png)

1. 通知で、「リージョン」、「トピック」を指定します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/00ec9f0d-a245-ad82-02c5-3011efe9d2a5.png)

1. 作成し、「テストメッセージを送信」をクリックします
1. Slackチャンネルにメッセージが届きます
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0a815e74-6035-d297-00e1-878fd2aec7c3.png)



### AWS Health
下記を基に試します。

https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html

AWS Health は、AWS リソース、サービス、アカウントの状態を可視化します。AWS で実行されているアプリケーションに影響を与えるリソースのパフォーマンスと可用性に関する情報と、修復のためのガイダンスを提供します。

#### Slackチャンネル作成
1. 事前にSlackチャンネルを作成します。上記の手順と同様なので割愛します

#### SNSトピックの作成
1. トピックを作成します
1. 「編集」をクリックし、下記のステートメントを追加します
    ```json
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "health.amazonaws.com"
          },
          "Action": "sns:Publish",
          "Resource": "arn:aws:sns:<リージョン>:<アカウントID>:<トピック名>"
        }
    ```
#### EventBridgeルール
1. EventBridgeに移動します
1. ナビゲーションペインで、「ルール」をクリックします
1. 「ルールを作成」をクリックします
1. ルール名を入力し、「次へ」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/23e1496c-2d79-51ed-62fc-b1cc41a4f971.png)
1. イベントソースとAWSサービスに「Health」を選択し、「次へ」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c304801f-1941-6bd1-425e-f8e42f75eb8d.png)

1. ターゲットを選択画面で、先ほど作成したSNSトピックを選択し「次へ」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/cce8e4f5-1fb7-9b14-a6f3-98307dd0cbaf.png)
1. タグを設定し、確認画面で「作成」します


#### Chatbotの設定
1. Chatbotに移動します
1. Slackワークスペースに移動します
1. 「新しいチャンネルを設定」をクリックします
1. 作成したチャンネル、SNSトピックを指定し「設定」をクリックします
1. 作成したチャンネルを選択し、「テストメッセージを送信」をクリックします
1. Slackチャンネルにメッセージが届きます
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6f447505-88f7-11f4-1d6e-8c6f476346ad.png)


# 考察
今回、Chatbotを整理し、試しました。
下記の流れでつなげることで、Slackに簡単にメッセージを送信できます。ChatOpsの第一歩として簡単に始められそうです。

1. サービス（Budget、Health等）
1. SNSトピック
1. SNSサブスクリプション
1. Chatbot
1. Slackチャンネル

# 参考
https://docs.aws.amazon.com/ja_jp/chatbot/latest/adminguide/what-is.html

https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-edit.html

https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html