2023 年版 AWS Health イベントを Slack 通知する方法

## はじめに
5 年ほど前に AWS のメンテナンス情報を Slack 通知する という記事を書きました。

https://qiita.com/hayao_k/items/a4a0e415e86de6cd6af7

時間が経ち、通知できる内容や通知方法も増えていますので 2023 年 5 月現在の情報で再度まとめます。

## EventBridge による AWS Health イベントのモニタリング
Amazon EventBridge を使用して、以下のような AWS Health イベントを検出できます。

* アカウント固有のイベント
* パブリックイベント

### アカウント固有のイベント
アカウント固有のイベントは　EBS ボリュームの消失イベントやその他スケジュールされた変更イベントなど、特定のアカウントとリソースに影響するイベントを指します。

全アカウントに影響するサービスの障害情報などはアカウント固有のイベントには含まれません。

### パブリックイベント
パブリックイベントは　AWS サービスのヘルスイベント、つまり障害情報です。2023/5/2 のアップデートでサポートされました！

https://aws.amazon.com/jp/about-aws/whats-new/2023/05/aws-health-publishes-events-eventbridge-primary-backup-regions/

以前はアカウント固有のイベントのみが EventBridge に発行されていたため、サービスヘルスの RSS Feed を Slack に流していた方も多いのではないかと思います。

https://status.aws.amazon.com/rss/all.rss

例えば上記の RSS の場合、全リージョン全サービスの障害情報が通知されてしまうため、特定のリージョンのみに絞った通知ができませんでした。

EventBridge にサービスヘルスイベントが発行されることで、柔軟な通知条件を設定できます。

### EventBridge ルールはリージョン毎に設定する

AWS Health Dashboard はグローバルサービスですが、アカウント固有のイベント、パブリックイベントどちらも、各リージョン毎にイベントが発生するため、通知が必要なリージョンの分だけ EventBridge ルールの設定を行う必要があります。

EventBridge 自体のサービス障害が起きている場合は正常に通知されるのでしょうか？

前述のアップデートで当該リージョンの EventBridge にイベント発行ができない場合は、オレゴンリージョンにイベントがルーティングされるようになりました。これにより Resilience がさらに強化されます。

よって、仮にメインで使用するリージョンが東京と大阪リージョンのみだったとしても、グローバルサービスが稼働するバージニア北部と、バックアップとして機能するオレゴンリージョンを含む、最低 4 つのリージョンで EventBridge ルールを設定すべきでしょう。


利用するリージョンが多い場合は設定がなかなか手間ですが、後述する AWS User Notifications を使用すると簡単に設定できます。

### EventBridge ルールの例
AWS Health イベントのスキーマは以下のとおりです。

```json:AWS Health Event Schema
{
  "version": "0",
  "id": "7bf73129-1428-4cd3-a780-95db273d1602",
  "detail-type": "AWS Health Event",
  "source": "aws.health",
  "account": "123456789012",
  "time": "2016-06-05T06:27:57Z",
  "region": "region",
  "resources": [],
  "detail": {
    "eventArn": "arn:aws:health:region::event/id",
    "service": "service",
    "eventTypeCode": "AWS_service_code",
    "eventScopeCode": "scopecode",
    "communicationID": "communicationid",
    "eventTypeCategory": "category",
    "startTime": "Wed, 05 Apr 2023 05:01:10 GMT",
    "endTime": "Wed, 05 Apr 2023 05:30:57 GMT",
    "lastUpdatedTime": "Mon, 27 Mar 2023 09:01:22 GMT",
    "statusCode": "open",
    "eventRegion": "af-south-1"
    "eventDescription": [{
    "language": "lang-code",
      "latestDescription": "description"
    }]
    ...
  }
}
```

アカウント固有のイベントの場合は `eventScopeCode` が `ACCOUNT_SPECIFIC` に、パブリックイベントの場合は `PUBLIC` となります。

例えば特定サービスのパブリックイベントのみを検知したい場合は、以下のようなイベントパターンを作成できます。

```json
{
  "source": ["aws.health"],
  "detail-type": ["AWS Health Event"],
  "detail": {
    "eventScopeCode": ["PUBLIC"],
    "service": [
      "AUTOSCALING",
      "VPC",
      "EC2"
    ]
  }
}
```

## Slack への通知方法
### AWS Chatbot
AWS Chatbot を使用すると簡単に AWS Health イベントを Slack 通知できます。EventBridge ルールのターゲットに AWS Chatbot 用の SNS Topic を指定すれば OK です。

AWS Chatbot 自体の設定例は以下の過去記事を参考にしていただければ幸いです。

https://qiita.com/hayao_k/items/529539bbb07736ea0f41

### AWS Lambda + Incoming Webhock
冒頭の [過去記事](https://qiita.com/hayao_k/items/a4a0e415e86de6cd6af7) で紹介していた方法です。個別に通知内容をカスタマイズしたいといった要件がない限り、現在は AWS Chatbot で十分かと思います。

## AWS Chatbot による Slack 通知例
ドキュメントに記載のサンプルイベントや過去の通知のイベントの情報を使用して、AWS Chatbot から Slack 通知を行った例です。

### アカウント固有のイベント 
**EC2 インスタンスストアのパフォーマンス低下:**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/6ff0bac7-1778-3f7d-0772-0aed8f3e41e3.png)

**AWS Lambda のランタイムサポート終了の通知:**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/bd9b8b67-ec50-0cf6-d561-f372caaf77f6.png)

### パブリックイベント
**障害の発生:** 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/0e57ef97-c655-f2e3-05f4-5780af27ab6d.png)

**障害の解消:** 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/f0ba422a-d171-56eb-0b93-15201b14979b.png)

## AWS User Notifications
### サービスの概要
AWS User Notifications は 2023/5/3 に一般利用可能になった新サービスです。複数の AWS アカウント、リージョン、サービスから必要な通知を選択し、設定できます。また AWS User Notifications のコンソール上で受信した通知を確認することも可能です。

https://aws.amazon.com/jp/blogs/aws/new-set-up-your-aws-notifications-in-one-place/

通知先としては E メール、AWS Chatbot、モバイルデバイスへのプッシュ通知 (AWS コンソールモバイルアプリ経由) を選択できます。

仕組みとしては、裏側で AWS User Notifications が管理する EventBridge ルールが作成され、選択したターゲットへ通知されます。

もちろんこれまでどおりユーザー自身で EventBridge ルールを作成することもできますが、AWS User Notifications のメリットには以下のようなものがあります。

* 複数アカウント、リージョン、サービスの通知を一括で設定できる
* コンソール UI から一貫した方法でイベントルールや通知先を設定できる
* 通信を受け取る頻度を設定できる
* 人が読みやすい形でメール通知できる

**1 点目の補足:**
複数アカウントの通知を受け取るためには、事前に以下のドキュメントを参考に複数 AWS アカウントのイベントバス間でイベントを送受信するように EventBridge を設定する必要があります。

https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-cross-account.html

**4 点目の補足**:
メールの通知は AWS User Notifications が Amazon SES API を使用してメールを送信します。そのため SNS Topic やサブスクリプションの管理は不要です。内容も人が読みやすいフォーマットで通知してくれます。EventBridge の入力トランスフォーマーでがんばって json を変換する必要はありません。

デメリットとしては 2023/5/12 では API が提供されていないため、必ずコンソール上で手動設定する必要があります。自動化したい方は、自身が管理する EventBridge ルールを CloudFormation StackSets で作成するのがよさそうです。

### AWS Health イベントの通知を設定してみる
以下はサービスヘルスイベントを AWS Chatbot で通知させる場合の設定例です。

:::note warn
2023/5/12 時点ではコンソールの言語設定が日本語の場合、設定の説明などの表示が一部おかしくなっているようです。英語に切り替えると正常に表示できます。
:::

1. 通知ハブの設定
AWS User Notifications の使用を開始する際に通知ハブとなるリージョンを選択する必要があります (最大 3 つまで)。ドキュメントには「通知を保存、処理、複製する AWS リージョンを識別するアカウントレベルの設定です」とありますが、複数リージョンを選択した際のメリットがまだ理解できていません。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/c93cdc48-808f-13b7-4720-af77c203267d.png)

1. 通知設定の作成: 名前と説明
通知設定の名前と説明を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/bb7c73ab-73ff-fc62-58b5-4d556e99c2c0.png)

1. 通知設定の作成: イベントルール
   1. AWS のサービスの名前で `Health` を指定します
   1. イベントタイプには `AWS Health Event` を選択します
   1. リージョンは通知設定を行いたいリージョンを複数選択できます
   この例では東京、大阪、バージニア北部、オレゴンリージョンを指定しています。
   1. 高度なフィルターで EventBridge で使用する json 形式のイベントパターンを指定できます
   以下のパターンでパブリックイベントのみを通知するルールを作成できます。※後述の不具合あり
       ```json
       {
         "source": ["aws.health"],
         "detail-type": ["AWS Health Event"],
         "detail": {
           "eventScopeCode": ["PUBLIC"]
         }
       }
       ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/4854ad61-de7f-e272-93b6-eefad8e8a0b3.png)


1. 通知設定の作成: 集約設定
集約設定で通知を受信する頻度を指定できます。優先度が低い通知のノイズを低減したい場合は「通知する通知数を少なくする」を選択できます。優先度の高い通知には「通知の配信時間を短縮」がおすすめされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/54ee85e0-e96c-3be4-a2e1-3de2dcf9af4f.png)
集約設定を無効化することで通知の数を減らさずに個別の通知を受け取ることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1d74ea06-13cd-6252-c7c9-b3e9abe26229.png)

1. 通知設定の作成: 配信チャンネル
配信チャンネルで AWS Chatbot を選択し、通知を行う Slack ワークスペース:チャンネルを指定します。AWS Chatbot の設定で事前にワークスペースとチャンネルが追加されている必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/a8464f3a-f755-d84e-2051-fe839cd3230f.png)

通知設定の作成が完了し、ステータスがアクティブになると、指定した各リージョンにそれぞれ EventBridge のマネージドルールが作成されることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/4cc38d90-d2b6-4fa0-6195-865a0c884649.png)

以下は東京リージョンに作成されたマネージドルールです。

:::note warn
2023/5/12 時点では高度なフィルターで設定したイベントパターンが各リージョンマネージドルールに正常に反映されませんでした。これは現時点での不具合であるようです。(すべての Health イベントが通知されますのでご注意ください。)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1cb6b47e-d0e4-beba-c9dd-8fc56e5a9683.png)

## 参考
https://docs.aws.amazon.com/health/latest/ug/cloudwatch-events-health.html

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