Cloud Service
Azure Event Grid
イベントを発行者から多数の購読者へプッシュ配信するサーバーレスのイベントルーティング基盤。通知・ファンアウト(SNS 相当)とイベント駆動の連携(EventBridge 相当)の両方を担う。
- 1.起きた事実を関心のある複数ハンドラーへプッシュ配信する基盤。
- 2.サーバーレスで操作数課金、リトライとデッドレターで取りこぼさない。
- 3.AWS の SNS(通知・ファンアウト)と EventBridge を兼ねる位置づけ。
解決する課題
リソースで「何かが起きた」ことを、ポーリングせずに関係するシステムへ即座に伝えられます。
- 1 つのイベントを**複数のハンドラーへ同報(ファンアウト)**したい
- 発行側は宛先を意識せず、疎結合にイベントを通知したい
- Blob 作成・リソース変更などの Azure 内部イベントに反応して処理を起動したい
- 受け手が一時的にダウンしていても**リトライと配信不能(デッドレター)**で取りこぼしたくない
主要概念と用語
- イベント: 「何かが起きた」という最小限の事実。スキーマは CloudEvents 1.0(推奨)または独自の Event Grid スキーマ
- 発行元(パブリッシャー / ソース): イベントを送る側。Azure サービス、独自アプリ、SaaS(Partner)など
- トピック: イベントの送信先エンドポイント。システム トピック(Azure サービス由来)、カスタム トピック(独自アプリ由来)、パートナー トピック(SaaS 由来)
- イベント サブスクリプション: トピックとハンドラーを結びつけ、フィルター・リトライ・デッドレターを定義する設定単位
- イベント ハンドラー(サブスクライバー): Azure Functions / Logic Apps / Webhook / Event Hubs / Service Bus(Queue/Topic)/ Storage Queue / Hybrid Connections / Relay など
- フィルター: イベントタイプ・サブジェクトの前後方一致・属性(advanced filter)で購読者ごとに振り分け
- MQTT ブローカー機能: Event Grid 名前空間が提供する MQTT v3.1.1 / v5.0 のメッセージング(IoT デバイス向けの pub/sub)
従来からある Event Grid Topics(HTTP プッシュ配信)に加え、後発の **Event Grid 名前空間(Namespaces)**があります。名前空間は MQTT ブローカーと、**プル配信(HTTP でハンドラー側が取りに行く)**をサポートします。用途で使い分けます。
仕様・制限・クォータ
- プッシュ型が基本: トピックへ送られたイベントを、各サブスクライバーへ HTTP で配信(名前空間ではプル配信も選択可)
- 配信の信頼性: 配信は 少なくとも 1 回(at-least-once)。同じイベントが重複し得るため、ハンドラーは冪等に設計する
- 順序保証は無し: イベントの到着順は保証されない
- リトライ: 既定で最大 24 時間/最大 30 回、指数バックオフでリトライ。失敗し続けたイベントは **デッドレター先(Blob)**へ退避できる
- イベントサイズ: Event Grid Topics では 1 イベント最大 1 MB(課金は 64 KB 単位で切り上げ)
- CloudEvents / Event Grid スキーマ: 受信・配信時のスキーマを選択でき、相互変換も可能
- サブスクリプション数・スループットなどはトピック種別ごとに上限があり、必要に応じて引き上げを検討
内部の仕組み
発行されたイベントは、まずトピックで受け取られ、各イベント サブスクリプションのフィルター条件に照合されます。条件に一致したサブスクライバーへ、Event Grid が HTTP でプッシュ配信します(ハンドラー側のポーリングは不要)。
ファンアウトは、1 つのトピックに複数のイベント サブスクリプションを紐づけることで実現します。各サブスクリプションは独立にフィルター・リトライ・デッドレターを持つため、ハンドラーごとに配信条件と再試行の挙動を分けられます。
配信に失敗した場合、Event Grid は指数バックオフでリトライし、リトライ期限/回数を超えると(設定していれば)デッドレター用の Blob コンテナーへイベントを書き出します。これにより、受け手の一時障害でイベントを失わずに済みます。Webhook ハンドラーを使う場合は、なりすまし防止のための**検証ハンドシェイク(validation handshake)**または Microsoft Entra ID 連携が必要です。
1 つのトピックに多くのイベントを集約し、各イベント サブスクリプションのイベントタイプ/サブジェクト/advanced フィルターで必要なものだけを各ハンドラーへ届けると、配線がシンプルになります。AWS EventBridge の「イベントパターン」に相当する考え方です。
設計パターン / ベストプラクティス
- ファンアウト: 1 トピック → 複数イベント サブスクリプション → 各ハンドラー(Functions / Logic Apps など)で並列処理
- バッファが要るなら Service Bus / Event Hubs を挟む: ハンドラーの処理が重い・流量変動が大きい場合は、ハンドラー先を Service Bus Queue/Topic や Event Hubs にして取りこぼしと急なスパイクを吸収する
- Service Bus Topics との役割分担: Service Bus Topics はブローカー内にメッセージを保持してプルで取り出すエンタープライズメッセージング、Event Grid はイベントをプッシュで配るルーティング基盤。「業務処理の確実な引き渡し」は Service Bus、「事実の通知・配布」は Event Grid と捉えると整理しやすい
- 冪等設計: at-least-once と無順序を前提に、イベント ID で重複排除し副作用を冪等化する
- デッドレター + リトライポリシーを必ず設定し、失敗イベントを失わない
運用・監視
- Azure Monitor のメトリクスで
PublishSuccessCount/PublishFailCount/DeliverySuccessCount/DeliveryAttemptFailCount/DeadLetteredCountなどを監視する - 配信失敗時のチェック: ハンドラー側の HTTP 応答コード、エンドポイントの到達性、Webhook の検証状態、サブスクリプションのフィルター条件を確認
- デッドレター先 Blob を定期的に確認し、退避イベントの原因分析と再処理の運用を用意する
- 診断ログを Log Analytics / Storage / Event Hubs へ送って配信失敗・デッドレターを追跡できる
コスト
Event Grid はサーバーレスで、操作数(オペレーション)課金が基本です。常時起動のインフラ費用は不要で、無料枠も用意されています。
| 項目 | 課金の考え方 | 補足 |
|---|---|---|
| 基本課金 | オペレーション数で従量課金 | イベントの取り込み・配信試行・リトライ・デッドレター等を操作としてカウント |
| 無料枠 | 月あたり一定数のオペレーション無料 | 小規模・検証ではコストがほぼ発生しないことが多い |
| イベントサイズ | 64 KB 単位で操作数に換算 | 1 イベントが大きいと操作数が増える(最大 1 MB) |
| インフラ費用 | 原則なし(サーバーレス) | プロビジョニング不要。名前空間の MQTT 等は別体系 |
セキュリティ
- 認証/認可: 配信先 Webhook は Microsoft Entra ID 連携または検証ハンドシェイクで保護。発行側・操作権限は Azure RBAC で制御
- マネージド ID: トピック/名前空間にマネージド ID を付与し、配信先(Service Bus / Event Hubs / Storage Queue)へ資格情報レスで配信できる
- ネットワーク制御: プライベート エンドポイントや IP ファイアウォール、公開アクセス無効化でトピックを保護できる
- 鍵管理: アクセスキーは保護・ローテーションし、可能なら Entra ID 認証へ寄せる
配信先 Webhook を検証も認証もせず公開するのは NG。誰でもイベントを投げ込めたり、なりすましの危険があります。Entra ID 連携または検証ハンドシェイクを必ず行い、できればマネージド ID で資格情報のハードコードを排除してください。
関連サービス・比較(AWS との対応)
Event Grid は AWS の **SNS(通知・ファンアウト)**と **EventBridge(イベントルーティング)**の両方の役割を担います。比較の主軸として SNS との対応を示します。
| 観点 | Azure Event Grid | Amazon SNS |
|---|---|---|
| モデル | イベントのプッシュ配信(Pub/Sub) | メッセージのプッシュ配信(Pub/Sub) |
| 配信単位 | トピック → イベント サブスクリプション | トピック → サブスクリプション |
| ファンアウト | 1 トピックに複数サブスクリプション | 1 トピックに複数サブスクライバー |
| フィルター | イベントタイプ/サブジェクト/advanced | メッセージ属性のフィルターポリシー |
| スキーマ | CloudEvents 1.0 / Event Grid スキーマ | メッセージ(独自属性) |
| 主な配信先 | Functions / Logic Apps / Webhook / Service Bus / Event Hubs | Lambda / SQS / HTTP(S) / Email / SMS |
| イベントルーティング相当 | Event Grid 自体が該当(EventBridge 相当) | EventBridge は別サービス |
| リトライ/退避 | 指数バックオフ + デッドレター(Blob) | リトライ + DLQ(SQS) |
SNS はメール/SMS 通知まで直接担いますが、Event Grid 自体はそこまで含みません。Azure ではメール/SMS は Azure Communication Services 等を、エンタープライズメッセージングは Service Bus を、ストリーム取り込みは Event Hubs を組み合わせます。
ハンズオン / CLI例
# リソースグループを作成
az group create --name demo-rg --location japaneast
# カスタムトピックを作成(独自アプリのイベント送信先)
az eventgrid topic create \
--resource-group demo-rg \
--name demo-topic \
--location japaneast
# トピックのエンドポイントとアクセスキーを取得
TOPIC_ENDPOINT=$(az eventgrid topic show --resource-group demo-rg --name demo-topic --query "endpoint" -o tsv)
TOPIC_KEY=$(az eventgrid topic key list --resource-group demo-rg --name demo-topic --query "key1" -o tsv)
# Webhook をハンドラーにしてイベント サブスクリプションを作成(ファンアウトは本コマンドを複数回)
az eventgrid event-subscription create \
--name to-webhook \
--source-resource-id "$(az eventgrid topic show -g demo-rg -n demo-topic --query id -o tsv)" \
--endpoint "https://example.com/api/eventgrid" \
--included-event-types "Order.Created"
# カスタムトピックへイベントを発行(Event Grid スキーマの例)
curl -X POST "$TOPIC_ENDPOINT" \
-H "aeg-sas-key: $TOPIC_KEY" \
-H "Content-Type: application/json" \
-d '[{
"id": "1",
"eventType": "Order.Created",
"subject": "orders/123",
"eventTime": "2026-06-03T00:00:00Z",
"data": { "orderId": "123" },
"dataVersion": "1.0"
}]'
Azure Service
Azure Event Gridを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
アプリ統合
比較で見る軸
クラウド: Azure / カテゴリ: アプリ統合 / 難易度: intermediate
導入後に効く点
サーバーレスで操作数課金、リトライとデッドレターで取りこぼさない。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- Azure
- カテゴリ
- アプリ統合
- 難易度
- intermediate
- 関連資格
- —
- 設計柱
- reliability / operational / security / cost
判断チェックリスト
- 自社の用途が「アプリ統合 / reliability」に近いか確認する。
- 強みである「起きた事実を関心のある複数ハンドラーへプッシュ配信する基盤。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。
他クラウドの同等サービス
役割が近いサービスです。設計の置き換えや比較検討の参考に。