AWSで発生したイベントを AWS Chatbot + Lambda で Slack にお手軽に通知する - ①準備篇

# はじめに

AWSアカウントを作成したその日から、 **AWSアカウント上では様々なイベントが絶え間なく発生** します。これらのイベントを **適切にモニタリング** することで、AWS上の **システムやアプリケーションの健全性** や **可用性** を **追求することが可能**となります。

そこで、2020年4月22日に晴れてGAとなった ``AWS Chatbot`` と、**AWS Chatbot** 登場までは主流な実装方法であった``AWS Lambda`` とを組み合わせて、**AWSで発生したイベントをSlackに通知** してみたいと思います。

もちろん、チャットサービスを介して、**AWSで発生したイベントをリアルタイムにモニタリングすることが、全てのケースで正しいとは限りません**。また、そもそも下記でご紹介するイベントが、イベントの特性上、リアルタイムに通知されるべきではない可能性や、ケースによってはSlackというサービス自体が不適な場合もあるかもしれません。あくまで、AWSをモニタリングするための手法の1つとご理解ください。

# アーキテクチャ

[**今回作成したシステム**](https://github.com/eijikominami/aws-cloudformation-templates/blob/master/notification/README_JP.md) のアーキテクチャは以下の通りです。いくつものアイコンが並んでいますが、実際に実装したのは、``notification`` と書かれた点線部分のみで、システムを構成するサービスは、 **AWS Chatbot** 、**Amazon SNS** 、 **Amazon EventBridge** と **AWS Lambda** です。

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/architecture-notification.png)

なお、上記のテンプレート等は、[**aws-cloudformation-templates/notification - GitHub**](https://github.com/eijikominami/aws-cloudformation-templates/tree/master/notification) にて公開しています。

+ [README(EN) - aws-cloudformation-templates/notification](https://github.com/eijikominami/aws-cloudformation-templates/blob/master/notification/README.md)
+ [README(JP) - aws-cloudformation-templates/notification](https://github.com/eijikominami/aws-cloudformation-templates/blob/master/notification/README_JP.md)

# 準備

今回作成したシステムは、**AWS SAM** (Serverless Application Model) テンプレートで作成されており、後述のボタンから **ワンクリックでデプロイ** することが可能です。ただし、このテンプレートをAWS上で実行する前に、AWS Chatbotコンソール上で[**初回認証フロー**](https://docs.aws.amazon.com/ja_jp/chatbot/latest/adminguide/setting-up.html#Setup_intro)**を行う必要があります**。

## 1. AWS Management Console (Chatbot) 上で Slack を選択

AWS Chatbotは、Slack と Amazon Chime に対応していますが、**今回はSlackを選択**します。

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/setup_chatbot_1.png)

## 2. 通知先のSlackワークスペースとの間で認証を行う

次のページに進むとSlackとの認証画面が表示されますので、任意のワークスペースを選択した上で「**許可する**」**をクリック** します。

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/setup_chatbot_2.png)

## 3. Incoming Webhook URL の取得

AWS Lambda から通知を送信する際には、 [**Slack App の Incoming Webhook URL を取得する**](https://api.slack.com/messaging/webhooks#getting_started) **必要があります**。[**Your Apps - Slack API**](https://api.slack.com/apps) から既存のSlack App もしくは 新規のSlack App を選択し、**Incoming Webhook URLを発行します**。

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/setup_slack_webhook.png)

## 4. Slackの ワークスペースID と チャンネルID の取得

デプロイする際に使用する際に必要なSlackの **ワークスペースID** と **チャンネルID** は、SlackのURLの以下の部分に該当します。

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/slack_workspace_id_annotation.png)

# TL;DR

**上記の作業で全ての準備が整いました**。以下のCloudFormationテンプレートを実行することで、 **AWSで発生したイベントをSlackに通知するシステムをお手軽に実現** します。

| 順序 | 内容 | 実行 |
| --- | --- | --- |
| 1 | [**セキュリティ関連サービスを有効化** するテンプレート](https://qiita.com/eijikominami/items/53f3a1d83df31981ad86)  (オプション) | [![cloudformation-launch-stack](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/cloudformation-launch-stack.png)](https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/create/review?stackName=DefaultSecuritySettings&templateURL=https://eijikominami.s3-ap-northeast-1.amazonaws.com/aws-cloudformation-templates/security/template.yaml) |
| 2 | **Slack通知を有効化** するテンプレート | [![cloudformation-launch-stack](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/cloudformation-launch-stack.png)](https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/create/review?stackName=Notification&templateURL=https://eijikominami.s3-ap-northeast-1.amazonaws.com/aws-cloudformation-templates/notification/packaged.yaml) |


なお、本テンプレートは、 **2つのSlackチャンネルに対して通知を送信することが可能**です。便宜上、アラーム用とデプロイ用のAmazon SNS トピック、およびSlackチャンネルとしていますが、それぞれに機能の差や用途の制限はありません。

| パラメータ名 | 内容 | 備考 |
| --- | --- | --- |
| **HookUrlForDeployment** | Slack デプロイ用チャンネルのIncoming Webhook URL | **準備** の項の **手順3** を参照してください。**https://を除いて入力**してください。  |
| **HookUrlForAlert** | Slack アラート用チャンネルのIncoming Webhook URL | **準備** の項の **手順3** を参照してください。**https://を除いて入力**してください。   |
| **SlackWorkspaceId** | ワークスペースID | **準備** の項の **手順4** を参照してください。上の画像の**XXXXXXX**の部分に該当します。 |
| **SlackChannelIdForDeployment** | デプロイ用チャンネルID | **準備** の項の **手順4** を参照してください。上の画像の**YYYYYYY**の部分に該当します。 |
| **SlackChannelIdForAlert** | アラート用チャンネルID | **準備** の項の **手順4** を参照してください。上の画像の**YYYYYYY**の部分に該当します。 |

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/setup_cloudformation.png)

# Slackメッセージ

上述した通り、本システムからSlackへは、**2つの異なるルート** で通知が送信されます。1つは **AWS Chatbot** を用いた方法、そしてもう1つは、 **AWS Lambda** を用いた方法です。前者は、AWS Chatbotによってあらかじめ定められたフォーマット（**=英文**）に基づいてメッセージが作成されます。

AWS Chatbotがリリースされたにも関わらず、従来のAWS Lambdaを経由した送信方法を残した理由は、本項執筆時点で、 **AWS Chatbotが対応しているサービスが以下のサービスに限定される** ためです。

+ AWS Billing and Cost Management
+ AWS CloudFormation
+ AWS developer tools
+ Amazon CloudWatch Alarms
+ AWS Config
+ Amazon GuardDuty
+ AWS Health
+ AWS Security Hub
+ AWS Systems Manager

一方で、今回作成した **AWS Lambdaは、以下のサービスに対応しています** 。

+ EventBridge Scheduled Events
+ Amazon EBS Events
+ Amazon EC2 Auto Scaling Events
+ Amazon EC2 State Change Events
+ AWS KMS Events
+ AWS Management Console Sign-in Events
+ Tag Change Events on AWS Resources
+ AWS Trusted Advisor Events

### AWS Chatbot 経由で送信される通知の例

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/slack_chatbot_ssm.png)

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/slack_chatbot_securityhub.png)

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/slack_chatbot_guardduty.png)

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/slack_chatbot_codepipeline.png)

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/slack_chatbot_cloudwatch.png)

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/slack_chatbot_cloudformation.png)

### AWS Lambda 経由で送信される通知の例

![](https://raw.githubusercontent.com/eijikominami/aws-cloudformation-templates/master/images/slack_lambda.png)

以上で、AWS Chatbot, Amazon SNS, Amazon EventBridge, AWS Lambda を用いて **AWSで発生したイベントをSlackに通知するシステムをお手軽に実現** することができました。次回は、このSAMテンプレートの中身とその挙動についてご説明します。

# 関連リンク
1. **準備篇** - AWSで発生したイベントを AWS Chatbot + Lambda で Slack にお手軽に通知する
2. [**EventBridge篇** - AWSで発生したイベントを AWS Chatbot + Lambda で Slack にお手軽に通知する](https://qiita.com/eijikominami/items/3e0c1c7047b4f8d3fa98)