Azure Event Grid MQTTブローカー
多数の IoT デバイスを MQTT で相互接続し、デバイス間 pub/sub と Azure へのイベント取り込みをマネージドで実現。AWS IoT Core の MQTT ブローカに相当する位置づけ。
- Event Grid名前空間でMQTT 3.1.1/5.0の双方向通信を提供する。
- QoS 0は最大1回、QoS 1は最低1回で重複を許容する。
- 証明書とトピック権限で端末を分離し、Azure側へ転送する。
解決する課題
多数の IoT デバイスやクライアントを標準プロトコルの MQTT でつなぎ、デバイス同士のメッセージ交換と、クラウド側でのイベント処理の両方をマネージドに実現できます。
- 大量のデバイスを標準の MQTT で双方向接続し、ブローカ運用の手間をなくしたい
- デバイス間で直接 pub/sub(command/telemetry のやり取り)をしたい
- 受け取ったメッセージをAzure サービスへルーティングしてクラウド処理につなげたい
- デバイスごと・トピックごとにきめ細かい認可をかけ、なりすましや横取りを防ぎたい
主要概念と用語
- 名前空間(Namespace): MQTT ブローカや Event Grid のプル/プッシュ機能を束ねる管理単位。MQTT を使うにはこの名前空間で MQTT 機能を有効化する
- MQTT ブローカ: 接続したクライアント間でメッセージを中継する pub/sub の中核。MQTT v3.1.1 と v5.0 をサポート
- クライアント: ブローカへ接続するデバイスやアプリ。クライアント認証情報(証明書のサブジェクトなど)で識別する
- トピック(MQTT トピック): メッセージの宛先を表す階層的な文字列。発行者は特定トピックへ publish し、購読者は subscribe する
- トピック空間(Topic space): ワイルドカードを含むトピックフィルタの集合。誰がどのトピックへ publish/subscribe できるかをこの単位でまとめて定義する
- パーミッションバインディング: クライアントグループとトピック空間を結びつけ、publisher か subscriber の権限を付与する設定
- ルーティング: ブローカが受け取った MQTT メッセージを、CloudEvents として Event Grid 名前空間トピックへ流し、Azure サービスへ届ける仕組み
- MQTT セッション: クライアントとブローカ間の接続状態。永続セッションでは切断中のメッセージ保持や再開ができる
HTTP プッシュ配信の従来型 Event Grid Topics とは独立した機能です。MQTT は必ず Event Grid 名前空間(Namespaces) 側で提供され、デバイス向けの pub/sub とクラウド取り込みを担います。
仕様・制限・クォータ
- 対応プロトコル: MQTT v3.1.1 と v5.0。接続は TLS で暗号化し、平文接続は許可しない
- QoS: QoS 0 は最大 1 回で再送せず、QoS 1 は確認応答まで再送する最低 1 回配信。QoS 1 の受信側は重複を前提に冪等に設計する
- 保持/共有購読など: MQTT v5.0 の機能(ユーザープロパティ、共有サブスクリプション、メッセージ有効期限など)に対応。利用可否は仕様の更新で変わり得るため公式を確認する
- 容量: 1 メッセージは最大 512 KiB。1 TU あたり最大 10,000 セッション、1,000 publish/秒、1 MB/秒で、名前空間は通常最大 40 TU
- 永続セッション: セッション有効期限は名前空間で設定し、上限は 8 時間。切断中の未確認 QoS 1 が上限を超えるとセッションが破棄される
- ルーティング先: 名前空間トピックはプル配信または Event Hubs へのプッシュ、カスタムトピックは Functions・Webhook・Service Bus などへ配信できる。ルーティングは最低 1 回、順序非保証で、再試行後も重複し得る
内部の仕組み
横にスクロール
クライアントは TLS 接続でブローカへハンドシェイクし、提示した認証情報(X.509 証明書のサブジェクトや Entra ID トークンなど)でクライアントとして識別されます。識別されたクライアントはクライアントグループに分類され、グループに紐づくパーミッションバインディングによって、どのトピック空間へ publish/subscribe できるかが決まります。
発行者があるトピックへ publish すると、ブローカはそのトピックに一致するフィルタで subscribe している購読者すべてへメッセージを中継します。これがデバイス間 pub/sub の基本動作です。ワイルドカードを含むトピックフィルタにより、1 つの購読で複数トピックをまとめて受け取れます。
クラウド連携が必要な場合は、ブローカーがメッセージを CloudEvents 形式に包み、名前空間トピックまたはカスタムトピックへルーティングします。名前空間トピックはアプリによるプル取得か Event Hubs へのプッシュ、カスタムトピックは Functions・Webhook・Service Bus など従来の Event Grid 配信先へつなげます。
ブローカは「デバイス同士の直接 pub/sub」と「クラウドへの一方向の取り込み」を同じ基盤で扱えます。コマンド配信はデバイス間トピックで、テレメトリ集約はルーティング経由で、と役割を分けると設計が整理しやすくなります。
設計パターン / ベストプラクティス
- トピック設計を先に固める: 階層を
region/site/device/telemetryのように設計し、トピック空間とワイルドカードで認可をまとめやすくする - 最小権限の認可: クライアントグループごとに publisher/subscriber を分け、デバイスは自分の領域のトピックだけ扱えるようにする
- テレメトリはルーティングで集約: 大量のストリーム処理は名前空間トピックから Event Hubs へ、Functions や Service Bus など従来の配信先が必要ならカスタムトピックへルーティングする
- 冪等設計: QoS 1 の少なくとも 1 回配信を前提に、メッセージ ID 等で重複排除する
- 証明書のライフサイクル管理: 失効・ローテーションの運用を整備し、CA ベースの認証で大量デバイスを扱いやすくする
運用・監視
- Azure Monitor のメトリクスで、接続中クライアント数、publish/deliver の成否、ドロップ、ルーティングの配信状況などを監視する
- 診断ログを Log Analytics / Storage / Event Hubs へ送り、接続失敗や認可拒否、切断理由を追跡できるようにする
- 接続トラブルの切り分け: TLS のハンドシェイク、クライアント認証情報とクライアント識別の対応、パーミッションバインディングの権限、トピック空間のフィルタ一致を順に確認する
- ルーティング先で配信失敗とデッドレターを監視する。名前空間トピックのプル購読では保持期限と未確認数、カスタムトピックでは各配信先の失敗を分けて確認する
コスト
MQTT 機能は Event Grid 名前空間で提供され、TU の時間料金と操作数で課金されます。常時起動の専用ブローカーを自前で持つ必要はありませんが、確保した TU の料金は操作がない時間にも発生します。
| 項目 | 課金の考え方 | 補足 |
|---|---|---|
| 容量 | TUを時間単位で課金 | 1 TUで最大10,000セッション。接続時間の別課金はない |
| MQTT操作 | publish・deliver・connect等を64KB単位で課金 | 月100万操作の無料枠あり |
| ルーティング | 属性付加・ルーティングはイベント操作として課金 | 名前空間トピックへのルーティング自体は無料 |
| インフラ費用 | 原則なし(マネージド) | ブローカの構築・運用が不要 |
セキュリティ
- 認証: クライアント証明書(X.509)による認証が基本で、CA ベースの一括登録に対応。アプリやサービスからの接続には Microsoft Entra ID 認証も利用できる
- 認可: クライアントグループ × トピック空間 × パーミッションバインディングで、トピック単位の publish/subscribe 権限を最小権限で設計する
- 通信の暗号化: 接続は TLS で保護され、平文の MQTT は許可しない
- ネットワーク制御: プライベートエンドポイントや公開アクセスの制限で、ブローカへの到達経路を絞れる
全デバイスを 1 つの広いトピック空間に publisher かつ subscriber として登録するのは NG。1 台が侵害されると全トピックを横取り・なりすましできてしまいます。クライアントグループを分け、各デバイスには必要なトピックの最小権限だけを与えてください。
関連サービス・比較
最も近いのは AWS の IoT Core(MQTT ブローカ部分) です。どちらもマネージドな MQTT pub/sub と、メッセージのクラウドルーティングを提供します。
| 観点 | Event Grid 名前空間 MQTT | AWS IoT Core (MQTT) |
|---|---|---|
| 役割 | マネージド MQTT ブローカと取り込み | マネージド MQTT ブローカと取り込み |
| MQTT バージョン | v3.1.1 / v5.0 | v3.1.1 / v5.0 |
| 認証 | X.509 証明書 / Entra ID | X.509 証明書 / IAM / カスタム認証 |
| 認可 | トピック空間 + パーミッションバインディング | IoT ポリシー |
| クラウド連携 | 名前空間トピック経由で Azure へルーティング | ルールエンジンで AWS へルーティング |
| 後段の連携先 | 名前空間はEvent Hubs、カスタムはFunctions等 | Lambda / Kinesis / SQS など |
本機能は MQTT メッセージングが中心で、デバイスのプロビジョニングやツインといった IoT デバイス管理までは含みません。デバイスライフサイクル管理が必要なら Azure 側の IoT 向けサービスと組み合わせて補完してください。
ハンズオン / CLI例
# namespace配下はPreviewのeventgrid拡張機能。Azure CLI 2.53.1以降を使用する
# リソースグループを作成
az group create --name demo-rg --location japaneast
# Event Grid 名前空間を作成し、MQTT を有効化
az eventgrid namespace create \
--resource-group demo-rg \
--name demo-ns \
--location japaneast \
--topic-spaces-configuration "{state:Enabled}"
# クライアントを登録(X.509 証明書のサブジェクト名で識別)
az eventgrid namespace client create \
--resource-group demo-rg \
--namespace-name demo-ns \
--client-name device01 \
--authentication-name "device01" \
--client-certificate-authentication "{validationScheme:ThumbprintMatch,allowed-thumbprints:[<THUMBPRINT>]}" \
--state Enabled
# トピック空間を作成(このフィルタ集合へのアクセスをまとめて制御)
az eventgrid namespace topic-space create \
--resource-group demo-rg \
--namespace-name demo-ns \
--name telemetry-space \
--topic-templates "devices/+/telemetry"
# パーミッションバインディングで publisher 権限を付与
az eventgrid namespace permission-binding create \
--resource-group demo-rg \
--namespace-name demo-ns \
--name device-publish \
--client-group-name '$all' \
--permission publisher \
--topic-space-name telemetry-space
Azure Service
Azure Event Grid MQTTブローカーを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
アプリ統合
比較で見る軸
クラウド: Azure / カテゴリ: アプリ統合 / 難易度: intermediate
導入後に効く点
QoS 0は最大1回、QoS 1は最低1回で重複を許容する。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- Azure
- カテゴリ
- アプリ統合
- 難易度
- intermediate
- 関連資格
- —
- 設計柱
- security / reliability / operational / cost
判断チェックリスト
- 自社の用途が「アプリ統合 / security」に近いか確認する。
- 強みである「Event Grid名前空間でMQTT 3.1.1/5.0の双方向通信を提供する。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。