AWS Health Dashboard と AWS User Notifications を活用した Slackへの通知設定

[LIFULL Advent Calendar 2024](https://qiita.com/advent-calendar/2024/lifull) 22日目の記事です。

10月からLIFULLで基盤グループのマネージャーを担当している磯野です。

それまでは別チームのマネージャーを担当していましたが、10月からロールが変わってAWSを中心としたサービスの基盤を担当することになりました。そこで今回は異動後取り組んでいる運用の改善・自動化、及び日常のノイズ削減に関連するAWS Health DashboardとSlackの連携について紹介します。

# まとめ

- AWS User Notifications を使って AWS Health Dashboard の通知を Slack に流すと便利
- AWSアカウントのHealthイベントが以下のようにSlackに送信される
![スクリーンショット 2024-12-21 205724.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45645/2657d351-9fd2-e504-0fff-2e39edcc6c89.png)


# 背景
LIFULLではAWS Organizationsを利用して多くのアカウントを管理しています。

各部署が持っているアカウントも含め、必要な対応を管理するのは大変な作業です。

そこで、AWS Health DashboardのOrganization Viewを有効にし、それらをSlackに通知することで、全アカウントのHealth Eventを一元管理する方法を模索しました。

## AWS Health DashboardのOrganization Viewの有効化

Organization全体のHealth Eventを受け取るには管理アカウントで以下のコマンドを実行する必要があります。
（個別のアカウントで設定する場合には本設定は不要です。）

```bash
aws health enable-health-service-access-for-organization --region us-east-1
```

コンソールからも実行可能です。詳しくは[ドキュメント](https://docs.aws.amazon.com/ja_jp/health/latest/ug/aggregate-events.html)を参照してください。

## AWS User Notificationsの有効化

AWS User Notifications はAWSコンソールから手動で設定する必要があります。

### 事前準備

- Slack通知用の準備
  - 通知用のチャネルで[AWS Chatbot](https://us-east-2.console.aws.amazon.com/chatbot/home?region=ap-northeast-1#/)を作成する
  - プライベートチャネルの場合、`@aws` チャネルにを招待することも忘れずに
- メール通知の場合
  - 特に事前準備は不要

### Quick Setupの実行

- [AWS User Notifications](https://us-east-1.console.aws.amazon.com/notifications/home?region=ap-northeast-1#/notifications)を開き、Quick Setupから `Health` を選択
- 必要なリージョンを選択し、`Edit configuration` で詳細設定に遷移
- 必要な設定を行い、`Create notification configuration`をクリックして終了

以下に `Edit configuration` 時のおすすめの設定を記載します。

1. Name を `QuickSetup` からわかりやすい名前に変更する
2. Aggregation settings で `Do not aggregate`を選択
3. Delivery channelsで`Chat channels`を選び、事前準備で作ったAWS Chatbotを選択

### Slackへの通知確認

設定が正しく行われていれば、AWS Health Dashboardからの通知がSlackに届きます。

![スクリーンショット 2024-12-21 205724.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45645/2657d351-9fd2-e504-0fff-2e39edcc6c89.png)

### 不要な通知フィルタリング

上で作成したNotificationの設定をにおいて`Event pattern JSON`を使用して、ノイズとなる通知をフィルタリング可能です。現在は以下の設定を行っています。

```json
{
  "detail": {
    "statusCode": ["open", "upcoming"],
    "eventArn": [{
      "anything-but": ["arn:aws:health:ap-northeast-1::event/xxxx"]
    }],
    "eventTypeCode": [{
      "anything-but": ["AWS_CLOUDSHELL_PERSISTENCE_EXPIRING"]
    }]
  }
}
```

#### ルール説明

- eventArn にマッチするイベントを除外する
- CloudShellの削除処理前の通知を除外する

### さらに細かいフィルタ設定

eventTypeCodeやeventArnについてはSlackの通知に含まれるため、そちらを使ってフィルタを更新することが可能です。
とはいえ、Slack通知に含まれていない要素も含めてフィルタを検討したい場合には対応することが難しくなっています

AWS User Notificationsは `AWS Event Bridge` と `AWS Chatbot` をいい感じにつないでくれるサービスですので、`AWS Event Bridge` の [Event Busesのルール](https://ap-northeast-1.console.aws.amazon.com/events/home?region=ap-northeast-1#/rules) にマネージドルールが有効化したリージョン毎に作られています。

そのルールと同等のルールを`Event Buses`作成し、`CloudWatch Logs`に流すことができますので、それを確認することで細かいルールにまで対応することができます。

# 最後に

AWSにはこのようにちょっとした作業で簡単に運用を改善できる仕組みがたくさんあります。
これらを活用して運用を改善し、自社の提供するサービスの改善に集中できる環境となるよう取り組んでまいります。

最後まで読んでいただきありがとうございました！
普段はCDKを活用してIaCを推進しているので、そちらのことも今後書きたいと思います。

また次の記事でお会いしましょう。