トピックスペースは、一連のトピックテンプレートを通じて複数のトピックを表現します。 トピックテンプレートは、標準のMQTTワイルドカードに加えて変数のサポート付きMQTTトピックフィルターを拡張します。 各トピック空間は、同じクライアント群が通信に使用するMQTTトピックを表しています。
トピックスペースは、個別のトピックごとにアクセスを管理するのではなく、複数のトピックに一度に公開や購読のアクセスを許可できるため、アクセス管理を簡素化します。 アクセス制御モデルは、クライアントグループにトピックスペースの公開や購読アクセスを与えるために4つのリソースを組み合わせています。
- クライアント:MQTT上で通信するデバイスまたはアプリケーションを表します。
- クライアントグループ:同じMQTTトピックセットに同じアクセスを必要とするクライアントをグループ化します。
- トピックスペース:意図されたトピックやトピックフィルターを表す1つ以上のトピックテンプレートをグループ化します。
- 権限バインディング:クライアントグループにトピックスペースへの公開または購読アクセスを許可します。
詳細については、 MQTTクライアントのアクセス制御をご覧ください。
この記事では、MQTTのトピックフィルター、トピックテンプレート、トピックスペースの設定がどのように連携して動作し、関連トピックをグループ化し、クライアントアクセスを効率的に管理できるかを説明します。
MQTTトピックフィルター
MQTTトピックフィルターとは、1つ以上のセグメントにワイルドカードを含めることができるMQTTトピックであり、複数のMQTTトピックにマッチングします。 トピックフィルターは購読リクエストを簡素化します。なぜなら、1つのトピックフィルターで複数のトピックをマッチングできるからです。
MQTTブローカーは 、MQTT仕様で定義されたすべてのMQTTワイルドカードをサポートしています:
-
+は単一のセグメントに一致します。 例えば、トピックフィルターmachines/+/alert以下のトピックに対応しています:machines/temp/alertmachines/humidity/alert
-
#トピックの最後に0つ以上のセグメントをマッチングします。 例えば、トピックフィルターmachines/#以下のトピックに対応しています:machinesmachines/tempmachines/humiditymachines/temp/alert
ワイルドカードの詳細については、 MQTT仕様のトピックワイルドカードを参照してください。
トピック テンプレート
トピックテンプレートは、MQTTのワイルドカードに加えて変数のサポートも加えたMQTTトピックフィルターを拡張します。 トピック空間の設定は、クライアントグループ内の各クライアントが自分のトピックを公開または購読する権限を制御することで、細かなアクセス制御も提供します。 詳細については、 トピックテンプレートがどのように細かなアクセス制御を提供するかをご覧ください。
トピック空間の構成
トピックスペースは最大10のトピックテンプレートをグループ化できます。 トピックテンプレートはMQTTのワイルドカード(+ および #)および以下の変数をサポートしています。
-
${client.authenticationName}: はクライアントの認証名を表します。 詳細については、 クライアントメタデータの主要用語をご覧ください。 -
${client.attributes.x}: クライアントが作成または更新された際に割り当てられる属性を表し、xは属性キーの正確な文字列です。 例えば、クライアントが属性area:section1を持っている場合、トピックテンプレートarea/${client.attributes.area}/telemetryその属性を持つクライアントのみがMQTTトピックarea/section1/telemetryに公開できるようにします。 詳細については、 MQTTクライアントをご覧ください。
注
-
$で始まるトピックは内部用に取っておきます。 - 変数はセグメントの一部を表すこともセグメント全体を表すこともできますが、複数のセグメントをカバーすることはできません。 例えば、トピックテンプレート
machines/${client.authenticationName|.factory1}/tempmachines/machine1.factory1/tempやmachines/machine2.factory1/tempなどのトピックに対応しています。 - トピックテンプレートは特殊文字
$と|を使いますが、使うシェルによってはエスケープが必要になるかもしれません。 たとえば、PowerShell では、次の例に示すようにこれらの文字をエスケープします。"vehicles/${client.authenticationName|dollar}/#"vehicles/${client.authenticationName"|"dollar}/#
AzureポータルやAzure CLIでトピックスペースを作成するには、「Publish and subscribe to MQTT messages」をご覧ください。 トピックスペースを指定する際は、以下のルールを使いましょう:
- トピックスペースの名前は3文字から50文字程度までの長さがあります。
- トピックスペース名は、英数字文字とハイフン(
-)を含むことができ、スペースは含めません。
以下のAzure CLI例は、2つのトピックテンプレートを持つトピック空間を作成します。
az eventgrid namespace topic-space create -g myRG --namespace-name myNS -n myTopicSpace --topic-templates ['segment1/+/segment3/${client.authenticationName}', "segment1/${client.attributes.attribute1}/segment3/#"]
注
トピックスペースの設定更新は、伝播に数分かかることがあります。