AWS でのイベント駆動アーキテクチャ構築
スケーリングパターン で学んだ対策を、AWS のサービスを使って実現する構成パターンを学びます。
イベントデータのライフサイクル
1つのイベントがアプリケーションで発生してから、分析・アーカイブされるまでの全体像です。
┌─────────────────────────────────────────────────────────────────────┐
│ イベントデータのライフサイクル │
│ │
│ [1] 発生 ユーザー操作(ログイン、トークン発行等) │
│ │ アプリケーション内で同期的に処理 │
│ │ │
│ │ 同期 │
│ ▼ │
│ [2] 書き込み RDS (PostgreSQL) に INSERT │
│ │ トランザクション内で確実に記録 │
│ │ ここまでがリクエスト処理の範囲 │
│ │ │
│ │ 非同期 ─── ここからリクエスト処理とは独立 ────────────── │
│ │ │
│ ├──→ [3a] アプリ内通知(同一プロセス・非同期スレッド) │
│ │ Spring @EventListener / @Async │
│ │ イベント1件ごとに: │
│ │ ① フック設定を確認(テナントに設定があるか?) │
│ │ ② トリガー判定(このイベント種別が対象か?) │
│ │ ③ 対象なら実行(Slack, Webhook, Email) │
│ │ ④ 対象外ならスキップ │
│ │ レイテンシ: ミリ秒(スキップ時)〜 500ms(実行時) │
│ │ │
│ ├──→ [3b] CDC 伝搬(WAL → CDC ツール → 外部システム) │
│ │ PeerDB / Debezium / MSK Connect │
│ │ ・アプリ変更不要(DBレベルで自動) │
│ │ レイテンシ: 数秒 │
│ │ │
│ └──→ [3c] メッセージキュー(アプリ → Kafka → 購読者) │
│ アプリが明示的に publish │
│ ・複数の購読者に同時配信 │
│ レイテンシ: ミリ秒〜秒 │
│ │
│ ── 3a/3b/3c は併用可能 ── │
│ │
│ ▼ │
│ [4] 読み取りモデル構築(各購読者が非同期で処理) │
│ │ │
│ ├── ClickHouse: バッチINSERT → 統計・集計クエリ │
│ │ レイテンシ: 秒(バッチ間隔依存) │
│ │ │
│ ├── OpenSearch: インデクシング → 全文検索・ログ検索 │
│ │ レイテンシ: 秒 │
│ │ │
│ └── S3: Parquet 書き出し → 長期保存 │
│ レイテンシ: 分〜時間(バッチ) │
│ │
│ ▼ │
│ [5] 利用 │
│ │ │
│ ├── ダッシュボード: ClickHouse から集計クエリ │
│ ├── 監査ログ検索: OpenSearch でフィルタ・全文検索 │
│ ├── 月次レポート: ClickHouse で年次集計(数秒) │
│ └── アドホック分析: Athena で S3 上の過去データを分析 │
│ │
│ ▼ │
│ [6] アーカイブ・削除 │
│ │
│ ├── RDS: パーティション管理で90日保持 → archive へ移動 │
│ ├── ClickHouse: TTL で1年保持 → 自動削除 │
│ ├── OpenSearch: Index Lifecycle で30日保持 → 削除 │
│ └── S3: ライフサイクルポリシーで Glacier → 削除 │
│ │
└─────────────────────────────────────────────────────────────────────┘