Azure Event Grid で MQTT メッセージをルーティングする

Event Gridは、MQTTメッセージをAzureサービスやウェブフックにルーティングしてさらなる処理を行うことができます。 このデータをルーティングすることで、IoTデータを分析、保存、可視化に活用するエンドツーエンドのソリューションを構築できます。

この記事では、ルーティングを使うタイミングを説明し、イベントグリッドの名前空間トピックかカスタムトピックのいずれかにルーティングを設定する方法を示します。

Azure Event Gridを経由するデバイスから、Azureサービス、ウェブフック、アプリなどのハンドラーへ向かうMQTTメッセージのルーティングを示す図。

ルーティングの使用時期

クライアントからのメッセージをAzureサービスやカスタムエンドポイントにルーティングすることで、このデータの最大限のメリットを活かすことができます。 以下のリストは、この機能の多くのユースケースの一部を示しています:

  • データ分析:クライアントからルーティングされたメッセージを抽出・分析し、ソリューションを最適化しましょう。 例えば、故障が起こる前にメンテナンスをスケジュールすべきタイミングを予測するために、機械のテレメトリーを分析し、遅延やさらなる損傷を防ぎましょう。
  • サーバーレスアプリケーション:クライアントからのルーティングメッセージに基づいてサーバーレス関数を起動します。 例えば、モーションセンサーが動きを検知した場合は、警備担当者に通知を送って対処を促します。
  • データ可視化:クライアントからルーティングされたデータの可視化を作成し、データを表現・理解し、傾向や例外値を強調します。

ルーティングの構成

ルーティング設定により、クライアントからのすべてのMQTTメッセージを イベントグリッドの名前空間トピック かイベント グリッドのカスタムトピックに送信できます。 メッセージがトピックに含まれると、トピックからのメッセージを使用するようにイベント サブスクリプションを構成できます。 この構成を実現するには、次の大まかな手順を使用します。

  • ルーティング先としての名前空間トピック:
    • Event Gridの名前空間トピックを作成し、Event GridがすべてのMQTTメッセージをルーティングします。
    • プッシュタイプのイベントサブスクリプションを作成して、これらのメッセージをサポートされているAzureサービスのいずれかやカスタムウェブフックにルーティングするか、キュータイプのイベントサブスクリプションを作成して、アプリケーションを通じて名前空間トピックから直接メッセージを引き出すことができます。
    • 最初のステップで作成したトピックを参照する ルーティング設定 を設定します。

名前空間トピックへの MQTT メッセージ ルーティングの図。

カスタム トピックへの MQTT メッセージ ルーティングの図。

名前空間でパブリックネットワークアクセスを無効にすると、MQTTルーティングが失敗します。

ルーティング先としての名前空間トピックとカスタム トピックの違い

次の表は、ルーティング先としての名前空間トピックとカスタム トピックの違いを示しています。 各イベントグリッドリソースに含まれる割当量と制限の詳細については 、「割当と制限」を参照してください。

比較のポイント 名前空間のトピック カスタム トピック
Throughput 高、最大 40 MB/秒 (イングレス) および 80 MB/秒 (エグレス) 低、最大 5 MB/秒まで (入力と出力)
プル配信 はい いいえ
Event Hubs へのプッシュ配信 はい はい
Azure サービスへのプッシュ配信 (Functions、Webhook、Service Bus キューとトピック、リレー ハイブリッド接続、ストレージ キュー) いいえ はい
メッセージの保持期間 7 日 1 日
ロールの割り当ての要件 MQTTブローカーと名前空間トピックは同じ名前空間に属しているため、必要ありません MQTTブローカー機能をホストする名前空間とカスタムトピックが異なるリソースであるため、必須です

ルーティングに関する Event Grid カスタム トピックの要件

ルーティングに使用するEvent Gridのカスタムトピックは、以下の要件を満たす必要があります:

  • CloudEventsスキーマv1.0を使う必要があります。
  • 名前空間と同じリージョンに存在する必要があります。
  • ルーティング設定を適用する前に、 Event Grid Data Sender の役割を自分自身またはEvent Gridのカスタムトピックで選択した管理IDに割り当てる必要があります。 役割を割り当てる方法:
    1. ポータルで作成したイベントグリッドのトピックリソースにアクセスしてください。
    2. アクセス制御(IAM)メニューで、役割割り当てを追加を選択します。
    3. RoleタブでEvent Grid Data Senderを選択し、次に「Next」を選択します。
    4. メンバー」タブで「メンバー選択」を選択し、表示される「セレクト」ボックス(例:user@contoso.com)にMicrosoft Entraユーザー名を入力してください。
    5. Microsoft Entraのユーザー名を選択し、次に「Review + assign」を選択してください。

Azure portal の構成

ルーティングの設定:

  1. Azure portal でご使用の名前空間に移動します。
  2. ルーティングの中で「ルーティングを有効にする」を選択してください。
  3. トピックタイプでは、ネームスペーストピックカスタムトピックのいずれかを選択します。
  4. トピックでは、作成したすべてのMQTTメッセージがルーティングされるトピックを選択してください。
  5. カスタムトピックを選択すると、「 Managed Identity for Delivery 」 セクションが表示されます。 MQTTブローカーがカスタムトピックにMQTTメッセージを配信する際に認証するアイデンティティの選択肢から、以下のいずれかを選択してください:
    • なし:カスタムトピックで イベントグリッドデータセンダ の役割を自分に割り当ててください。
    • システム割り当てアイデンティティ:前提条件として 名前空間でシステム割り当てアイデンティティを有効にし 、カスタムトピックのシステム割り当てアイデンティティに イベントグリッドデータセンダー の役割を割り当てます。
    • ユーザー割り当てアイデンティティ:名前 空間でユーザー割り当てアイデンティティを前提条件として有効に し、カスタムトピック上で選択したアイデンティティに イベントグリッドデータセンダー の役割を割り当てます。 「 ユーザー割り当てのアイデンティティ」を選択すると、ドロップダウンが表示されてアイデンティティを選択できます。
  6. を選択してを適用します。

ポータルを通じたルーティング設定のスクリーンショットです。

エンリッチメントの構成手順については、 エンリッチメント ポータルの構成に関する記事を参照してください。

Azure CLI の構成

az resource create --resource-type Microsoft.EventGrid/namespaces --id /subscriptions/<Subscription ID>/resourceGroups/<Resource Group>/providers/Microsoft.EventGrid/namespaces/<Namespace Name> --is-full-object --api-version 2023-06-01-preview --properties @./resources/NS.json

NS.json

{
    "properties": {
        "inputSchema": "CloudEventSchemaV1_0",
        "topicSpacesConfiguration": {
            "state": "Enabled",
            "routeTopicResourceId": "/subscriptions/<Subscription ID>/resourceGroups/<Resource Group>/providers/Microsoft.EventGrid/topics/<Event Grid topic name>",
            "routingIdentityInfo": {
                "type": "UserAssigned",
                "userAssignedIdentity": "/subscriptions/<Subscription ID>/resourceGroups/<Resource Group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<User-assigned identity>"
            }
        }
    }
}

routingIdentityInfoでは、typeNoneSystemAssigned、またはUserAssignedを受け入れます。 UserAssigneduserAssignedIdentity の場合にのみ、type を設定してください。

エンリッチメントの構成手順については、「 エンリッチメント CLI の構成」を参照してください。

MQTT メッセージ ルーティング動作

MQTT メッセージをカスタム トピックにルーティングする際に、Event Grid は各メッセージを 少なくとも 1 回 すぐに配信しようとするため、永続的な配信を提供します。 失敗した場合、Event Gridは配信を再試行するか、ルーティング用メッセージを破棄します。 Event Grid はイベント配信の順序を保証しないため、サブスクライバーは順序を誤って受け取る可能性があります。

次の表では、さまざまなエラーに基づく MQTT メッセージ ルーティングの動作について説明します。

エラー エラーの説明 行動
トピック未検出エラー (TopicNotFoundError) MQTTでルーティングされたすべてのメッセージを受信するように設定されたカスタムトピックは削除されました。 Event Gridはルーティング用のMQTTメッセージを除外します。
AuthenticationError MQTT ルーティング メッセージの宛先として構成されたカスタム トピックの Event Grid データ送信者ロールが削除されました。 Event Gridはルーティング用のMQTTメッセージを除外します。
リクエストが多すぎます 1 秒あたりの MQTT ルーティング メッセージの数が、カスタム トピックの発行制限を超えています。 Event Grid は MQTT メッセージをルーティングするために再試行します。
サービスエラー サーバーの運用上の理由による予期しないサーバー エラー。 Event Grid は MQTT メッセージをルーティングするために再試行します。

再試行中、Event Grid は MQTT メッセージ ルーティングに指数バックオフ再試行ポリシーを使用します。 Event Grid ではベスト エフォート方式で次のスケジュールに従って配信を再試行します。

  • 10 秒
  • 30 秒
  • 1 分
  • 5 分
  • 10 分
  • 30 分
  • 1 時間
  • 3 時間
  • 6 時間
  • 12 時間ごと

再配信キューにキューに入ったルーティング済みMQTTメッセージが成功した場合、Event Gridは最善の方法で再試行キューからメッセージを削除しようとしますが、重複メッセージが届く可能性があります。