AWSコンソールへのログイン通知実装(+構築時の試行錯誤)

# はじめに
**AWSマネジメントコンソールへユーザがサインインした際、ログインに関する情報をメールで通知**する方法を紹介します。
<br>

構築時にいくつかの記事等を参考にしましたが、要件にアンマッチであったため試行錯誤した結果も併せて紹介します。
<br>

# 実現したいこと
・IAMユーザー/ルートユーザーがAWSコンソールにログインした際、指定した宛先へメール通知したい
　⇨メール通知に含めたい内容は以下
　　- ログイン時刻
　　- ログインユーザ
　　- ログインイベントに関するログ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675544/a0cfe21b-c75e-425f-83ca-f5961133cc3f.png)

# ◎採用案①
いくつかの方法を試しましたが、最終的に構築した方法を最初に紹介します。
#### 構成図
![採用案](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675544/b950e01d-1d3c-9f6e-bfb1-ae5288e531a6.png "採用案")
#### 詳細
* **AWS CloudTrail**：
    * AWSコンソールログインログの収集 **（全リージョン有効化）**
* **Amazon CloudWatch**：
    * 各リージョンのログインログを**Amazon CloudWatch Logs ロググループ**のログストリームに集約
    * **Amazon CloudWatch Logsサブスクリプションフィルター**により、Amazon CloudWatch Logsに出力されたログをLambdaに転送
* **AWS Lambda**：
    * ログを使用したメッセージを成形
    * Amazon SNSへメッセージを連携
* **Amazon SNS**:
    * メッセージを対象者に配信

#### 長所/短所
* ◎転送されたログを使用して通知本文をカスタマイズ可能
* ○メール通知のリンクから直接CloudWatchのアラーム詳細設定など閲覧可能
* △ソースコード書く必要あり...


<br>
※具体的な実装方法については別記事にて紹介します。
<br>

# ◎採用案②
採用案①で構築後にリリースされた**AWS User Notifications**を使用した方法です。
#### 構成図
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675544/7f46bd47-d39b-4284-a8d0-713d9571d1f9.png width="260">

#非常にシンプル...!

#### 詳細
* **AWS User Notifications**：
    * AWSのサービスからの通知を一貫したわかりやすい形式で一元的にセットアップや表示可能
　⇒通知可能なイベントとして「AWS Console Sign-in」をサポート

#### 長所/短所
* ◎実装が容易であり、構成がシンプル
* ◎AWS User Notifications自体は無料 ※裏で作成されるEventBridgeには料金発生
* △文面のカスタマイズはできない ※もともと十分見やすい内容ではある
* △リージョン新設時には設定にて新リージョンを対象追加することが必要

#### 実際の通知イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675544/692266b8-6407-419f-a063-3d8b6040ea6f.png)


# ×不採用案①
ここからは不採用案の紹介です。
ログ出力先などの仕様理解のきっかけとなったため紹介します。
#### 構成図
![不採用案①](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675544/a9aa333e-ce1b-4589-9086-a3dd437ec92f.png)

#### 詳細
* **AWS CloudTrail**：
    * AWSコンソールログインログの収集
* **Amazon EventBridge**：
    * ログインログを検出
    * ログ内容をAmazon SNSへ連携
* **Amazon SNS**:
    * メッセージを対象者に配信

#### 問題点：全てのログインログを検出できない
* 原因①：AWSコンソールへのログインイベントは不特定のリージョンで実施される。
  ※CloudTrail仕様変更による。詳細は以下公式ドキュメントを参照ください。
　　　⇨ログは不特定のリージョンに記録される。
>一部のグローバルサービスイベントは米国東部 (オハイオ) リージョンや米国西部 (オレゴン) リージョンなどのその他のリージョンで発生しているものとしてログに記録されます。

https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-concepts.html#cloudtrail-concepts-global-service-events

   >ConsoleLogin イベントに記録されるリージョンは、ユーザータイプと、サインインにグローバルエンドポイントとリージョンエンドポイントのどちらを使用したかによって異なります。

https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-event-reference-aws-console-sign-in-events.html

* 原因②：EventBridgeは同一リージョン内のログ検出しか対応していない。
　　　⇨不特定のリージョンに記録されるログを検知できない。


※不採用①の設定を全リージョンに構築しても新規リージョン追加の度に追加実装が必要となります。


# ×不採用案②
#### 構成図
![不採用案①](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675544/8343cc8f-f3be-ee1b-3a39-af8433e96b7f.png "不採用案②")

#### 詳細
* **AWS CloudTrail**：
    * AWSコンソールログインログの収集 **（全リージョン有効化）**
* **Amazon CloudWatch**：
    * 各リージョンのログインログをAmazon CloudWatch Logsロググループのログストリームに集約
    * **Amazon CloudWatch Logsメトリクスフィルター**によりログを検知してAmazon SNSへ連携
* **Amazon SNS**:
    * メッセージを対象者に配信

#### 問題点：即時通知できない
* 原因：**Amazon CloudWatch Logsメトリクスフィルター**を使用した場合は一定期間の集計結果に基づく通知となるため、即時通知できない。


# まとめ・学び
* 一部のイベントは不特定リージョンで実行されるため、ログも不特定リージョンに記録される。
* サービスは日々アップデートされるため、公式ドキュメントにて最新情報のキャッチアップが必要。
* 検証は念入りに複数パターンで実施する（不採用案①でも運が悪ければ通知漏れに気づかない可能性がある...）

# おわりに
* 具体的な実装方法についても紹介予定のため、興味があれば是非ご覧ください。
* 他にも不採用となった案があるため、機会があれば追記や別記事にて紹介したいと思います。
* 本記事の内容について誤り等あればご意見ください。

<br>
2025/02/12 追記
先日、こちらの内容でLT登壇してきました!

* AWS User Notificationsがログイン通知をサポートしていることを知らなかった
* ログインイベントのログ出力先の仕様を知らなかった
* 個人のアカウントにも適用した

等々、多くのリアクションをいただきました!
以下の記事でイベントの様子も紹介しているためよかったらご覧ください。

https://qiita.com/rolfern/items/19d840206f2ebee7ba2f