AnsibleをAWS Systems Managerから実行するCI/CDを構築する。（その３：SNS、Chatbotの準備）

# はじめに
前回は`CodeCommit`の準備まで行いました。

今回は`CI/CD`の実行結果通知の準備として`Amazon SNS`、`AWS Chatbot`の設定を行い、`Slack`へ通知する設定を行ってみようと思います。

- 【前】[AnsibleをAWS Systems Managerから実行するCI/CDを構築する。（その２：CodeCommitの準備）](https://qiita.com/sakai00kou/items/5977f76cb3c8a182e840)
- 【次】[AnsibleをAWS Systems Managerから実行するCI/CDを構築する。（その４：CodeBuildからのAnsible実行）](https://qiita.com/sakai00kou/items/5c100bc6b46864332f1d)

# 今回の構成
今回は`Chatbot`を使った一般的な`Slack`への通知の構成を作ってみようと思います。

```plantuml
@startuml
!define AWSPuml https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/v13.1/dist
!include AWSPuml/AWSCommon.puml
!include AWSPuml/Groups/AWSCloud.puml
!include AWSPuml/ApplicationIntegration/SimpleNotificationService.puml
!include AWSPuml/ManagementGovernance/Chatbot.puml
!include <logos/slack.puml>
!include AWSPuml/AWSSimplified.puml

skinparam shadowing false
hide stereotype
'skinparam linetype ortho
skinparam rectangle {
    BackgroundColor AWS_BG_COLOR
    BorderColor transparent
}

left to right direction
title Slackへの通知
AWSCloudGroup(cloud){
  rectangle "$SimpleNotificationServiceIMG()\nSNS" as sns
  rectangle "$ChatbotIMG()\nChatBot" as chat
}
rectangle "<$slack>" as slack

sns-->chat
chat-->slack :ChatBotからSlackへ通知
@enduml
```

# Slackへの通知手順
`Chatbot`を使って`Slack`へ通知するための設定手順は以下となります。

尚、今回は`Slack`の**プライベートチャンネル**に通知してみようと思います。

- [Slackのチャンネル作成](#slackのチャンネル作成)
- [SNSトピックの作成](#snsトピックの作成)
- [Chatbot_クライアントの設定](#chatbot_クライアントの設定)
- [Chatbot_Slackチャネルの設定](#chatbot_slackチャネルの設定)
- [SlackでAWSアプリの招待（プライベートチャンネルの場合のみ）](#slackでawsアプリの招待プライベートチャンネルの場合のみ)
- [Slackへの通知確認](#slackへの通知確認)

## Slackのチャンネル作成
`Chatbot`からの通知を受け付けるための`Slack`チャンネルを作成します。

`Slack`画面より、「**チャンネル**」の右にある「**＋**」→「**チャンネルを作成する**」を選択します。

![Monosnap_20220923_153108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/3ebfe7c2-47dc-bd79-9dc3-f214e5e87046.png)

今回は**プライベートチャンネル**で通知を受けたいので、「**プライベートチャンネルにする**」にチェックを入れ、適当な名前（今回は「**ssm_ansible**」）をつけて、「**作成**」を選択します。

![Monosnap_20220923_153216.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/8976a046-75ca-b5e6-68aa-0d3d08e58ad5.png)

メンバーは特に追加しなくて良いのでそのまま「**後でする**」を選択。

![Monosnap_20220923_153317.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/5464c813-752c-bd48-1c63-5e8f6c7f9367.png)

`Slack`のチャンネル一覧に作成したチャンネルが表示されていれば完了です。

## SNSトピックの作成
`Chatbot`へメッセージを通知するためのSNSトピックを作成します。

「**Amazon SNS**」→「**トピック**」から「**トピックの作成**」で以下のように設定を行います。

![Monosnap_20220923_160114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/c9141a50-fa0a-ef6f-9349-7d713309155a.png)

本来はこの後、設定したトピックを購読するためのサブスクリプション設定が必要となりますが、次の`Chatbot`の設定を行うことで自動的にサブスクリプション設定が追加されるため、サブスクリプション設定は行いません。

## Chatbot_クライアントの設定
先程`Slack`側で作成したチャンネルが所属するワークスペースに対して`Chatbot`からアクセスできるようにするため、クライアントの設定を行います。

「**AWS Chatbot**」→「**設定済みクライアント**」から「**新しいクライアントを設定**」を選択。

![Monosnap_20220923_160723.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/6d08a1b0-5ea6-4ddd-35cb-1090f94af6f1.png)

「**Slack**」にチェックを入れ「**設定**」を選択。

![Monosnap_20220923_160809.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/5866f422-6e2f-47b5-144a-55d0a4e8125b.png)

`Slack`側の認証画面に遷移するため、「**許可する**」を選択。

![Monosnap_20220923_160857.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/29dbe117-c2c0-69e7-8752-76f3b125d599.png)

`Slack`の　「**App**」に「**aws**」が追加されれば完了です。

![Monosnap_20220923_161050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/02937a98-469f-13db-3f6d-806fd82dde30.png)

また、次手順でプライベートチャンネルの「**チャンネルID**」が必要となるため、`Slack`画面より、先程作成したチャンネル名を右クリック→「**チャンネル詳細を表示する**」を選択し、以下赤枠部分のIDを控えておきます。

![Monosnap_20220923_161716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/6f589b8c-4fb1-ffce-a372-23159383e093.png)

## Chatbot_Slackチャネルの設定
続いて先程作成した`Slack`のチャンネルに対してアクセスできるように設定を行います。

「**AWS Chatbot**」→「**Slack**」を選択すると、前手順で設定した`Slack`ワークスペース名が表示されているはずなので、ワークスペース名の画面から「**新しいチャネルを設定**」を選択。

設定画面が表示されるため、今回は以下のように設定を行いました。

![Monosnap_20220923_165000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/67ef3907-2ffd-cecf-7382-1ea3daa3bb7d.png)

![Monosnap_20220923_165059.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/9a68eb92-9d3d-1088-b6df-b922d8361e9c.png)

![Monosnap_20220923_165154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/34dd4951-bd52-f0d2-a3a3-85b752e0d8f9.png)

## SlackでAWSアプリの招待（プライベートチャンネルの場合のみ）
**プライベートチャンネル**で`Chatbot`の通知を受ける場合は`Slack`側で、先程追加された「**aws**」のアプリの招待が必要となるため、メッセージ欄に以下コマンドを入力して実行します。

尚、**パブリックチャンネル**で通知を受ける場合はコマンド実行は不要です。

```bash:awsアプリの招待コマンド
/invite @aws
```

![Monosnap_20220923_172358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/f287efb7-ca69-9922-b473-58d66bda3b49.png)

## Slackへの通知確認
再度`Chatbot`のワークスペースの画面に戻り、先程設定したチャンネルを選択した後、「**テストメッセージを送信**」を選択します。

![Monosnap_20220923_165327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/3cdb8712-31ee-b659-ba68-24d67085c555.png)

`Slack`画面に以下のようなテストメッセージが送信されれば完了です。

![Monosnap_20220923_172635.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/523bb4cb-d834-2249-f160-bd0df00b6427.png)

# おわりに
今回構築した仕組みは、通知元サービスを変えることで様々な通知を`Slack`に送信することが可能となるため、広く使える仕組みとなります。

今回最終的に構築しようとしている`CI/CD`の通知のためだけではなく、その他のサービス通知でもぜひともこの仕組みを使ってもらえればと思います。

次回は今回構築した通知の仕組みも使って`CodeBuild`からの`RunCommand`実行を試してみようと思います。