AWS Chatbotで簡単にSlack通知!!&通知例いろいろ

## はじめに
AWS Chatbot がついに一般利用開始となりました。(2020/4/23)
SlackまたはAmazon Chime各種AWSサービスに関する通知を簡単に送ることが可能になります。
通知以外にもIAM、STS、KMSを除いたほとんどのサービスでAWS CLIの読み取り専用コマンドを
AWS Chatbotを通じて実行できます（作成、変更、削除系のコマンドは実行できません）。
またLambda関数のinvokeやサポートケースの作成にも対応しています。

https://aws.amazon.com/jp/about-aws/whats-new/2020/04/aws-chatbot-now-generally-available/

通知に関してはこれまでのように専用のLambda関数を個別に作る必要はありません。
以下のサービスの通知に対応しています。

* AWS Billing and Cost Management
* AWS CloudFormation
* Amazon CloudWatch Alarms
* AWS Developer Tools
 * AWS CodeBuild
 * AWS CodeCommit
 * AWS CodeDeploy
 * AWS CodePipeline
* Amazon EventBridge 
 * EventBridge で発生するすべてのサービスイベント (2021/4/20 Update)
 
Slackでそれぞれのサービスでの通知例を確認しましたのでご紹介します。
通知例で表示されている :aws: がカスタム絵文字に変換されてしまってますが、ご容赦ください。

### 2021/4/21 追記
以前は Amazon EventBridge 経由での通知がサポートされていたサービスは、AWS Config、Amazon GuardDuty、AWS Health、AWS Security Hub、および AWS Systems Manager のみでしたが、2021/4/20 の Update で EventBridge によって処理されるすべてのサービスイベントを AWS Chatbot で通知できるようになりました。

https://aws.amazon.com/jp/about-aws/whats-new/2021/04/aws-chatbot-now-expands-coverage-of-aws-services-monitored-through-amazon-eventbridge/

Amazon EventBridge での通知例は、当初よりサポートされていた AWS Config、Amazon GuardDuty、AWS Health、AWS Security Hub、および AWS Systems Manager について記載していますが、その他のサービスも設定方法は同じです。各サービスごとのイベントパターンを定義し、通知先に AWS Chatbot 用の SNS Topic を指定してください。

追記おわり

## AWS Chatbotの設定
AWS Chatbotのコンソールで新規にクライアントの設定を行います。
ここではSlackを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/9a5161ef-e4b5-808f-f1d8-7bae9952664c.png)
Slackアプリのインストール確認画面が立ち上がります。
内容を確認して対象のワークスペースにインストールします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/35138e73-3d9d-ded8-c974-b16f80ff2c99.png" width=75%>
次に新しいチャンネルの設定から通知先のチャンネルの設定を進めていきます。
パブリックチャンネルの場合はリストから通知先のチャンネル名を選択できます。
プライベートチャンネルの場合はチャンネルのIDを個別に指定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/116e3cc8-b392-84f7-5004-d5d58a27d3b3.png)
プライベートチャンネルの場合はさらにAWS Chatbotのbotユーザを
対象のチャンネルにinviteする必要があります。

```
/invite @aws
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/5c069f6c-a045-cbee-1e02-ba9830fe5599.png)
IAMの設定では既存のIAMロールを選択するか新規に作成します。
ここではAWSChatbot-Roleを新規に作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/986ce529-1121-95e2-e05f-42442ed93eaa.png)
最後に使用するSNS Topicを選択して設定を完了します。
ここでは別途SNSコンソールで新規に作成したものを指定しています。
（新規作成時のオプションは全てデフォルトのままです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/336c568a-3c7f-ffaf-d599-d827c30f94c7.png)
AWS Chatbot 自体はグローバルサービスですが、対応する各サービスは
リージョナルサービスなので複数リージョンで通知が必要な場合は
基本的にはリージョンごとに設定します。

## AWS Billing and Cost Management
### 設定例
SNS Topicのアクセスポリシーに以下の内容を追記します。
TopicのARNは自分のものに書き換えます。

```json
    {
      "Sid": "AWSBudgets-notification-1",
      "Effect": "Allow",
      "Principal": {
        "Service": "budgets.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "arn:aws:sns:ap-northeast-1:0123456789012:AWSChatbotTopic"
    }
```

AWS Bugetsのアラームの設定で対象のSNS Topicを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/93be2fc7-4234-e58b-3006-f598a6443eab.png)


### 通知例
設定したアラームの条件を満たすと通知されます。
Budget nameが使用量になっちゃってますが。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/83e82823-fd0a-50a0-1322-6b970475b3a5.png)

## AWS CloudFormation
### 設定例
対象のスタックの通知オプションにSNS Topicを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/be0dfe38-1434-8695-0cff-0e24a3e2ef58.png)

### 通知例
スタックをデプロイすると以下のような通知が投稿されました。
各ステータス毎に通知されるのがわかりやすくてよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/79a799ba-d5ad-13af-a96f-c27b3372b528.png)

## Amazon CloudWach Alarms
CloudWatchアラームがすでに作成されている前提とします。
### 設定例
対象のCloudWatch アラームの通知先にSNS Topicを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/71fd3360-ae5f-4beb-cb57-ee5fe362f9f7.png)

### 通知例
ちゃんとグラフも添付されています。
しきい値の注釈が挿入されているのでわかりやすいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1752b673-7c09-a5fb-5a98-dc5123333640.png)
OK状態に戻ったときも通知できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/afccdacb-196e-2ae1-99ba-cee077b612de.png)

## AWS Developer Tools
### 設定例
各 Developer Tools サービスの通知メニューから通知ルールの作成ができます。
以下は CodePipeline の設定例です。

通知をトリガーするイベントで通知が必要なイベントを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/6f532e28-bb44-2e2b-7d34-302a4854ce2b.png)
ターゲットタイプには AWSChatbot(Slack)を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/a8229e58-cf0a-ef54-fbf2-837f581c2397.png)

### 通知例
通知の設定で選択したイベントに応じて通知されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/0521fd34-5e66-1c6f-5ac9-f774588626c0.png)


## Amazon GuardDuty
GaurdDuty はすでに有効化されている前提とします。

### 設定例
Amazon EventBridge(CloudWatch Events)から通知用のルールを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/96ec8117-34c9-94bb-ccab-648409856fa7.png)
以下のようにイベントパターンを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/ba0f5ac7-9b3a-0a0d-9202-192416bae7c8.png)
ターゲットで対象のSNS Topicを選択してルールの作成を完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/ccd632cd-2bef-877e-a2ab-ec0988fdc49b.png)

### 通知例
セキュリティグループに全世界からアクセス可能となっているポートがある場合の通知例です。
試せてませんが、リスクレベル毎に色が変わりそうな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/85b80b0f-4fb6-2911-d75a-ff4bc91b9e8a.png)

## AWS Config
### 設定例
GuardDutyと同様にAmazon EventBridge(CloudWatch Events)から通知用のルールを作成します。
例えばConfig Rulesで非準拠となったリソースを検知したい場合は
以下のようにパターンを定義し、通知先にSNS Topicを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1cce5630-0058-374b-87f6-1e509ac73b0a.png)

### 通知例
Config Rules で指定したタグがついていないEC2インスタンスが検知されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/bb07e50f-0148-3a28-cd34-e38e920b1f78.png)


## AWS Health
### 設定例
GuardDutyと同様にAmazon EventBridge(CloudWatch Events)から通知用のルールを作成します。
以下のようにパターンを定義し、通知先にSNS Topicを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/f9a75017-1e2d-f5f4-b221-138e0607f586.png)

### 注意点
検知&通知できるのはEBS ボリュームの消失イベント、
すべての予定された変更イベントなど自アカウントに関連するもののみです。
サービスの障害情報など AWS アカウントに固有でないものは対象外です。

通常、イベントパターンに設定するサービスがグローバルサービスである場合は、
エンドポイントが us-east-1 米国東部（バージニア北部）にのみ存在するため、
us-east-1 に設定します。
AWS Health もグローバルサービスなのですが、各リージョン毎にイベントが発生するため
今回の設定もリージョン毎に行う必要があります。

### 通知例
Amazon Detective のマスターアカウントから招待が届いた時の通知例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/55cce027-a70e-0146-3701-1ced93101ee7.png)

## AWS Security Hub
### 設定例
Security Hub コンソールの設定からカスタムアクションを作成しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/8af488bf-7e70-0804-8833-c15cb6208e3d.png)

GuardDutyと同様にAmazon EventBridge(CloudWatch Events)から通知用のルールを作成します。
以下のようにパターンを定義し、通知先にSNS Topicを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/f060d760-5b6f-547a-2163-484a20294bb2.png)

### 通知例
Security HubのFindingsでSlackに通知したい項目を選択し、
作成したカスタムアクションを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/adc11ead-6801-6cc3-9e76-d67c0452c04c.png)

すると、以下のように通知されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/436b8408-fbd8-3ced-6c6c-ec0ceb4d52bf.png)

## AWS Systems Manager
### 設定例
Run Commandやオートメーション、ステートマネージャーなど Systems Manager で対応している
各機能で発生したイベントについて通知を行うことができます。
以下はパラメーターストアの更新イベントについて通信する例です。
GuardDutyと同様にAmazon EventBridge(CloudWatch Events)から通知用のルールを作成します。
以下のようにパターンを定義し、通知先にSNS Topicを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/121e21d6-2ed2-0161-b11d-187d71663e51.png)

### 通知例
パラメータストア値のアップデートにより通知されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/ba8a319c-788d-6cb8-199e-138aa960ba7d.png)

## AWSCLI コマンドの実行
読み取り専用のコマンドであれば、通常の AWSCLI コマンドの構文通りに実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/3a5485f8-7e75-dc8d-166f-e28dccec363a.png)

AWS re:Invent 2021 の期間中に参照系以外のコマンドも実行可能となるアップデートが発表されました。

https://aws.amazon.com/jp/about-aws/whats-new/2021/11/aws-chatbot-management-resources-slack/

:::note warn
参照系以外のコマンド実行は 2021/12/6 時点で Preview 扱いのため、ご注意ください。 
:::


## AWSサポートケースの作成
```
@aws support create-case
```
AWS Chatbotのプロンプトに従って、サポートケースに必要なパラメーターを記入することで
サポートケースを作成することができます。

## 参考
**AWS Chatbot Administrator Guide**
https://docs.aws.amazon.com/chatbot/latest/adminguide/what-is.html

以上です。
参考になれば幸いです。