イベント駆動 on AWSを考える

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)。

この記事ではイベント駆動 on AWSに関連する内容を超詳細にまとめています。

具体的には以下流れで説明します。

- Amazon EventBridgeとは
- Amazon EventBridgeの仕組み
- Amazon EventBridgeの活用
- Amazon EventBridge for Advance
- Amazon EventBridgeのベストプラクティス
- S3イベント通知とは
- S3イベント通知の活用
- S3イベント通知 for Advance
- S3イベント通知のベストプラクティス

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- イベント駆動 on AWSにどういうサービスがあるか説明できるようになりたい人
- AWSでイベント駆動を採用するときのベストプラクティスを説明できるようになりたい人
- AWS Certified DevOps Engineer Professionalを目指している人

# Amazon EventBridgeとは
Amazon EventBridgeは、AWS上でのイベント駆動型アーキテクチャを構築するためのマネージドサービスです。

異なるソースから発生するイベントを一元的に受信し、柔軟に処理およびルーティングすることが可能です。

Amazon EventBridgeではクーロンジョブのような使い方ができるスケジュールベースと特定のパターンにマッチしたときにトリガーを引くイベントベースの2つでイベントをトリガーできます。

特定のイベントが発生したときに自動でほかのサービスを起動してくれるサービスになるのでDevOpsを実現するうえで必須のサービスといえるでしょう。

# Amazon EventBridgeの仕組み
Amazon EventBridgeは、様々なAWSサービスや外部アプリケーションからのイベントを統合的に扱うための仕組みを提供します。主な構成要素は以下の通りです。

![](https://storage.googleapis.com/zenn-user-upload/6024d3c1370f-20231208.png)

1. **ルール**
ルールは、特定のイベントパターンに基づいてイベントを受信し、対応するアクションをトリガーします。これにより、柔軟なイベントのルーティングが可能です。

2. **イベントバス**
イベントバスはイベントの中継や受信を可能にし、異なるソースからのイベントを集約します。デフォルトのイベントバスやカスタムのイベントバスを作成することができます。

3. **ターゲット**
ターゲットは、特定のイベントを受けて実行されるアクションです。Lambda関数、SNSトピック、Step Functionsなど、多くのAWSサービスがターゲットとして利用できます。

# Amazon EventBridgeの活用
Amazon EventBridgeはイベント駆動型アーキテクチャで最も利用されます。
EventBridgeを使用することで、分散型マイクロサービスアーキテクチャやイベントソーシングパターンを実現できます。

その結果、イベントに応じて柔軟にサービスを拡張したり、特定のイベントに対する処理を実行したりできDevOpsが目指す自動化や効率化に大きく貢献します。

また、Amazon EventBridgeはサードパーティアプリケーションの統合にも利用されます。
SaaS Event BusあるいはカスタムEvent Busを利用することでSaaSアプリケーションやカスタムアプリケーションからのイベントを取り込むことができます。

これによって、AWS外のサービスのイベントをAWSに接続することが実現できます。

# Amazon EventBridge for Advance
## イベントスキーマ
Amazon EventBridgeのイベントスキーマは、イベントの構造を定義するJSON形式のデータです。
イベントスキーマを活用することで、イベントの構造を一元管理し、一貫性を保つことができます。

イベントスキーマには、バージョン、ID、詳細タイプ、発生元、AWSアカウントID、発生時間、リージョン、関連するAWSリソース、詳細データなどが含まれます。

これにより、異なるアプリケーションやサービスが共通の形式でイベントを処理でき、柔軟で相互運用可能なアプリケーションを構築できます。

# Amazon EventBridgeのベストプラクティス
EventBridgeを効果的に利用するためのベストプラクティスは以下の通りです。

|ベストプラクティス | 詳細|
|--- | ---|
|適切なイベントバスの選択 | イベントソースによって異なるイベントバスを検討し、適切なバスを使用する。|
|細かなルールの設定 | ルールを詳細に設定し、特定のイベントに対して精密なルーティングとアクションをトリガーする。|
|分散トレーシングの実装 | 分散トレーシングを活用して、イベントフロー全体を可視化し、デバッグやトラブルシューティングを支援する。|

特に細かなルール設定が非常に重要です。
効率よく運用するためにはDevOpsを実装して何を実現したいか、をまず明確にしたうえでイベント設計をすることが必須です。

実プロジェクトではそんなことより目の前のトラブルを人力で、となりがちです。
しかし、イベント駆動を実装し、効率よく運用し、改善し、という営みを回すことこそがDevOpsであるということを忘れずにいることが大切です。

# S3イベント通知とは
Amazon S3イベント通知は、S3バケット内で発生する特定のイベントに対してリアルタイムで通知を受け取る仕組みです。
これにより、オブジェクトの追加、削除、変更などのアクションに対して即座に反応し、連携するアプリケーションやサービスに通知を送ることが可能です。

# S3イベント通知の活用
S3イベント通知は、異なるAWSサービスとの連携や自動化を可能にします。
例えば、新しいオブジェクトがアップロードされたらLambda関数をトリガーして特定の処理を実行するなど、様々なワークフローを構築できます。
これにより、イベント駆動型のアプリケーションやデータ処理システムを容易に構築できます。

# S3イベント通知 for Advance
S3イベント通知はできることに限りがあるので、複雑なルールによるイベント発火やS3イベント通知で連携できないサービスへの連携をしたい場合にはEventBridgeとの連携が必要です。

![](https://storage.googleapis.com/zenn-user-upload/0f6091f77444-20231208.png)

その際には、とりあえずすべてのS3イベントをEventBridgeに連携し、EventBrdige側でフィルターするとよいでしょう。

# S3イベント通知のベストプラクティス
以下はS3イベント通知のベストプラクティスです。

|ベストプラクティス | 説明|
|--- | ---|
|イベントの適切な選定 | 使用するイベントによって通知の精度が変わるため、必要なイベントを選別し設定することが重要。|
|Lambdaを活用した処理 | S3イベント通知をLambdaに接続することで、柔軟でカスタマイズ可能な処理を実現。|
|通知の冪等性の確保 | イベント通知において冪等性を確保することで、同じ通知が複数回送信されても正確な処理が行われる。|
|アクセス権の適切な設定 | イベント通知に必要な権限を与え、セキュリティを確保。必要最小限の権限を与え、アクセス制御を構築する。|

Lambdaを活用した処理の部分についてはLambdaで実現できるレベルであればまずLambdaを使いましょう、という意図です。
イベントのフィルタを複雑なルールに基づいて行いたいのであれば前述したとおり、EventBridgeとの連携が必要です。

# まとめ
この記事ではイベント駆動 on AWSに関連する内容を超詳細にまとめました。

- Amazon EventBridgeとは
- Amazon EventBridgeの仕組み
- Amazon EventBridgeの活用
- Amazon EventBridge for Advance
- Amazon EventBridgeのベストプラクティス
- S3イベント通知とは
- S3イベント通知の活用
- S3イベント通知 for Advance
- S3イベント通知のベストプラクティス

次回はAWS Health Dashboardを超詳細解説します。