MQTT ルーティング メッセージのエンリッチメント

エンリッチメントのサポートにより、Event Grid カスタム トピックに送信される前に、最大 20 個のカスタム キーと値のプロパティをメッセージに追加できます。 これらのエンリッチメントを使用すると、次を実行できます。

  • メッセージにコンテキスト データを追加します。 たとえば、クライアントの名前または名前空間名でメッセージをエンリッチすると、メッセージのソースに関する情報をエンドポイントに提供できます。
  • エンドポイントのコンピューティング負荷を軽減します。 たとえば、MQTT 発行要求のペイロード形式インジケーターやコンテンツ タイプを使用してメッセージをエンリッチすると、メッセージのペイロードを処理する方法がエンドポイントに通知されるため、最初に複数のパーサーを試す必要がなくなります。
  • Event Grid イベント サブスクリプション経由でルーティングされるメッセージを、追加されたデータに基づいてフィルター処理します。 たとえば、クライアント属性をエンリッチすると、エンドポイントにルーティングされるメッセージを、さまざまな属性の値に基づいてフィルター処理できます。

構成

エンリッチメント キー:

エンリッチメント キーは、次の要件に準拠する必要がある文字列です。

  • 小文字の英数字である (a から z) と (0 から 9) のみを含むこと。
  • specversionidtimetypesourcesubjectdatacontenttypedataschemadatadata_base64 でないこと。
  • 先頭が azsp ではないこと。
  • 重複しないこと。
  • 20 文字以下であること。

エンリッチメント値:

エンリッチメント値には、静的エンリッチメントでは静的文字列、またはクライアント属性を表すサポートされている値のいずれか、動的エンリッチメントでは MQTT メッセージ プロパティを指定できます。 エンリッチメント値は 128 文字以下にする必要があります。 サポートされている値の一覧を次に示します。

クライアント属性

  • ${client.authenticationName}: 発行クライアントの名前。
  • ${client.attributes.x}: 発行クライアントの属性。ここで x は属性キー名です。

MQTT プロパティ

  • ${mqtt.message.userProperties.x}: MQTTv5 発行パケットのユーザー プロパティ。ここで x はユーザー プロパティ キー名です
    • Type: 文字列
    • ユーザー プロパティに特殊文字が含まれている場合は、代わりに変数の形式に ${mqtt.message.userProperties['x']} を使用します。 さらに、アポストロフィと円記号を "PN\t" であれば "PN\\t" のようにエスケープする必要があります。
  • ${mqtt.message.topicName}: MQTT 発行パケット内のトピック。
    • Type: 文字列
  • ${mqtt.message.responseTopic}: MQTTv5 発行パケット内の応答トピック。
    • Type: 文字列
  • ${mqtt.message.correlationData}: MQTTv5 発行パケット内の相関データ。
    • 型: バイナリ
  • ${mqtt.message.pfi}: MQTTv5 発行パケット内のペイロード形式インジケーター。
    • 型: 整数

Azure portal の構成

次の手順を使用して、ルーティング エンリッチメントを構成します。

  1. Azure portal でご使用の名前空間に移動します。
  2. [ルーティング] で、[ルーティングを有効にする] をオンにします。
  3. [トピックのルーティング] で、すべての MQTT メッセージのルーティング先である、作成した Event Grid トピックを選択します。
  4. [メッセージ エンリッチメント] で、[+ エンリッチメントの追加] を選択します。
  5. 最大 20 個のキーと値のペアを追加し、その該当する種類を選択します。
  6. [適用] を選択します。

Screenshot showing the routing enrichment configuration through the portal.

ルーティング構成の詳細については、Azure portal のルーティング構成に関する記事を参照してください。

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": {
    "topicSpacesConfiguration": {
        "state": "Enabled",
        "routeTopicResourceId": "/subscriptions/<Subscription ID>/resourceGroups/<Resource Group>/providers/Microsoft.EventGrid/topics/<Event Grid Topic name>",
        "routingEnrichments": {
            "static": [
                {
                    "key": "namespaceid",
                    "value": "123",
                    "valueType": "string"
                }
            ],
            "dynamic": [
                {
                    "key": "clientname",
                    "value": "${client.authenticationName}"
                },
                {
                    "key": "clienttype",
                    "value": "${client.attributes.type}"
                },
                {
                    "key": "address",
                    "value": "${mqtt.message.userProperties['client.address']}"
                },
                {
                    "key": "region",
                    "value": "${mqtt.message.userProperties.location}"
                },
                {
                    "key": "mqtttopic",
                    "value": "${mqtt.message.topicName}"
                },
                {
                    "key": "mqttresponsetopic",
                    "value": "${mqtt.message.responseTopic}"
                },
                {
                    "key": "mqttcorrelationdata",
                    "value": "${mqtt.message.correlationData}"
                },
                {
                    "key": "mqttpfi",
                    "value": "${mqtt.message.pfi}"
                }
            ]
        }
    }
},
"location": "eastus2euap",
"tags": {},
}

ルーティング構成の詳細については、Azure CLI のルーティング構成に関する記事を参照してください。

サンプル出力

次の CloudEvent は、前のエンリッチメント構成を適用した後の、PFI=0 での MQTTv5 メッセージのサンプル出力です。

{
    "specversion": "1.0",
	"id": "9aeb0fdf-c01e-0131-0922-9eb54906e20", // unique id stamped by the service
	"time": "2019-11-18T15:13:39.4589254Z", // timestamp when messages was received by the service
	"type": "MQTT.EventPublished", // set type for all MQTT messages enveloped by the service
	"source": "testnamespace", // namespace name
	"subject": "campus/buildings/building17", // topic of the MQTT publish request
	"namespaceid": "123", // static enrichment
	"clientname": "client1", // dynamic enrichment of the name of the publishing client
	"clienttype": "operator", // dynamic enrichment of an attribute of the publishing client
	"address": "1 Microsoft Way, Redmond, WA 98052", // dynamic enrichment of a user property in the MQTT publish request
	"region": "North America", // dynamic enrichment of another user property in the MQTT publish request
	"mqtttopic": "campus/buildings/building17", // dynamic enrichment of the topic of the MQTT publish request
	"mqttresponsetopic": "campus/buildings/building17/response", // dynamic enrichment of the response topic of the MQTT publish request
	"mqttcorrelationdata": "cmVxdWVzdDE=", // dynamic enrichment of the correlation data of the MQTT publish request encoded in base64
	"mqttpfi": 0, // dynamic enrichment of the payload format indicator of the MQTT publish request
	"datacontenttype": "application/octet-stream", //content type of the MQTT publish request
	"data_base64": 
    {
	    IlRlbXAiOiAiNzAiLAoiaHVtaWRpdHkiOiAiNDAiCg==
	}
}

特殊なケースの処理:

  • 指定されていないクライアント属性/ユーザー プロパティ: 動的エンリッチメントが存在しないクライアント属性/ユーザー プロパティを指した場合、エンリッチメントには、値に空の文字列を持つ指定されたキーが含められます。 例: emptyproperty ""。
  • 配列: クライアント属性内の配列、および重複するユーザー プロパティは、コンマ区切りの文字列に変換されます。 たとえば、エンリッチされたクライアント属性が "array": "value1", "value2", "value3" と設定された場合、結果のエンリッチされたプロパティは array: value1,value2,value3 になります。 別の例: 同じ MQTT 発行要求に次のユーザー プロパティ > "userproperty1": "value1", "userproperty1": "value2" がある場合、結果のエンリッチされたプロパティは userproperty1: value1,value2 になります。

次のステップ:

ルーティングの詳細については、次の記事を参照してください。

クイックスタート:

概念: