次の方法で共有


メッセージ スキーマを理解する

Azure デバイス レジストリ プレビューで提供される機能であるスキーマ レジストリは、クラウドとエッジで同期されるリポジトリです。 スキーマ レジストリは、エッジ資産からのメッセージの定義を格納し、エッジでこれらのスキーマにアクセスするための API を公開します。

OPC UA 用コネクタは、メッセージ スキーマを作成してスキーマ レジストリにそれを追加できます。または、お客様は、スキーマを操作エクスペリエンス Web UI にアップロードしたり、ARM/Bicep テンプレートを使用したりできます。

エッジ サービスは、メッセージ スキーマを使って、産業用エッジ シナリオでルーティングされるメッセージのフィルター処理と変換を行います。

"スキーマ" は、メッセージを処理してコンテキスト化できるようにその形式と内容が記述されているドキュメントです。

メッセージ スキーマの定義

スキーマ レジストリでは、メッセージ スキーマに次の必須フィールドが含まれることが想定されています。

必須フィールド Definition
$schema http://json-schema.org/draft-07/schema# または Delta/1.0 のいずれかです。 データフローでは、JSON スキーマはソース エンドポイントに使われ、Delta スキーマは宛先エンドポイントに使われます。
type Object
properties メッセージの定義。

サンプル スキーマ

次のサンプル スキーマでは、各形式でのメッセージ スキーマの定義の例を示します。

JSON:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "name": "foobarbaz",
  "description": "A representation of an event",
  "type": "object",
  "required": [ "dtstart", "summary" ],
  "properties": {
    "summary": {
      "type": "string"
    },
    "location": {
      "type": "string"
    },
    "url": {
      "type": "string"
    },
    "duration": {
      "type": "string",
      "description": "Event duration"
    }
  }
}

Delta:

{
  "$schema": "Delta/1.0",
  "type": "object",
  "properties": {
    "type": "struct",
    "fields": [
      { "name": "asset_id", "type": "string", "nullable": false, "metadata": {} },
      { "name": "asset_name", "type": "string", "nullable": false, "metadata": {} },
      { "name": "location", "type": "string", "nullable": false, "metadata": {} },
      { "name": "manufacturer", "type": "string", "nullable": false, "metadata": {} },
      { "name": "production_date", "type": "string", "nullable": false, "metadata": {} },
      { "name": "serial_number", "type": "string", "nullable": false, "metadata": {} },
      { "name": "temperature", "type": "double", "nullable": false, "metadata": {} }
    ]
  }
}

データフローでのメッセージ スキーマの使用方法

メッセージ スキーマは、データフローの 3 つのフェーズ (ソース入力の定義、データ変換の適用、宛先出力の作成) のすべてで使われます。

入力スキーマ

各データフロー ソースでは、必要に応じてメッセージ スキーマを指定できます。 データフロー ソースに対してスキーマが定義されている場合、スキーマと一致しない着信メッセージはすべて削除されます。

資産ソースには、OPC UA 用コネクタによって作成された定義済みのメッセージ スキーマがあります。

MQTT ソースのスキーマをアップロードできます。 現在、Azure IoT Operations では、入力スキーマとも呼ばれるソース スキーマに対して JSON がサポートされています。 操作エクスペリエンスでは、既存のスキーマを選ぶか、MQTT ソースの定義の間にアップロードできます。

操作エクスペリエンス ポータルでのメッセージ スキーマのアップロードを示すスクリーンショット。

変換

操作エクスペリエンスでは、入力スキーマがデータの起点として使われ、既知の入力メッセージ形式に基づいて変換を簡単に選択できます。

出力スキーマ

出力スキーマは、データフローの宛先に関連付けられており、宛先エンドポイントとしてローカル ストレージ、Fabric、Azure Storage (ADLS Gen2)、または Azure Data Explorer を選ぶデータフローに対してのみ使われます。 現在、Azure IoT Operations エクスペリエンスでは、出力スキーマに対して Parquet 出力のみがサポートされています。

注: Delta スキーマ形式は、Parquet と Delta 両方の出力に使われます。

これらのデータフローでは、操作エクスペリエンスによって入力スキーマに変換が適用されてから、Delta 形式で新しいスキーマが作成されます。 作成されたデータフロー カスタム リソース (CR) には、スキーマ レジストリに格納されている生成されたスキーマを指す schemaRef 値が含まれます。

出力スキーマをアップロードするには、「スキーマのアップロード」を参照してください。

スキーマのアップロード

この記事の入力スキーマセクションで説明したように、入力スキーマは、操作エクスペリエンス ポータルでアップロードできます。 Azure CLI または Bicep テンプレートを使用してスキーマをアップロードすることもできます。

CLI を使用したスキーマのアップロード

az iot ops schema コマンド グループには、スキーマ レジストリでスキーマを作成、表示、管理するためのコマンドが含まれています。

JSON ファイルを参照するか、スキーマをインライン コンテンツとして含めることで、スキーマをアップロードできます。

次の例では、最小限の入力を使って、ファイルから myschema という名前のスキーマを作成します。 バージョン番号を指定しない場合、スキーマ バージョンは 1 です。

az iot ops schema create -n myschema -g myresourcegroup --registry myregistry --format json --type message --version-content myschema.json

次の例では、インライン コンテンツか らmyschema という名前のスキーマを作成して、バージョン番号を割り当てます。

az iot ops schema create -n myschema -g myresourcegroup --registry myregistry --format delta --type message --version-content '{\"hello\": \"world\"}' --ver 14 

create コマンドが完了すると、スキーマ コンテンツを含む BLOB がストレージ アカウント コンテナーに表示されます。 BLOB の名前は schema-namespace/schema/version という形式です。

ヘルパー コマンド az iot ops schema -hを使用すると、その他のオプションを確認できます。

Bicep テンプレート を使用したスキーマのアップロード

Bicep .bicep ファイルを作成し、その先頭にスキーマの内容を変数として追加します。 この例は、クイックスタートの OPC UA データに対応する Delta スキーマです。

// Delta schema content matching OPC UA data from quickstart
// For ADLS Gen2, ADX, and Fabric destinations
var opcuaSchemaContent = '''
{
  "$schema": "Delta/1.0",
  "type": "object",
  "properties": {
    "type": "struct",
    "fields": [
      {
        "name": "temperature",
        "type": {
          "type": "struct",
          "fields": [
            {
              "name": "SourceTimestamp",
              "type": "string",
              "nullable": true,
              "metadata": {}
            },
            {
              "name": "Value",
              "type": "integer",
              "nullable": true,
              "metadata": {}
            },
            {
              "name": "StatusCode",
              "type": {
                "type": "struct",
                "fields": [
                  {
                    "name": "Code",
                    "type": "integer",
                    "nullable": true,
                    "metadata": {}
                  },
                  {
                    "name": "Symbol",
                    "type": "string",
                    "nullable": true,
                    "metadata": {}
                  }
                ]
              },
              "nullable": true,
              "metadata": {}
            }
          ]
        },
        "nullable": true,
        "metadata": {}
      },
      {
        "name": "Tag 10",
        "type": {
          "type": "struct",
          "fields": [
            {
              "name": "SourceTimestamp",
              "type": "string",
              "nullable": true,
              "metadata": {}
            },
            {
              "name": "Value",
              "type": "integer",
              "nullable": true,
              "metadata": {}
            },
            {
              "name": "StatusCode",
              "type": {
                "type": "struct",
                "fields": [
                  {
                    "name": "Code",
                    "type": "integer",
                    "nullable": true,
                    "metadata": {}
                  },
                  {
                    "name": "Symbol",
                    "type": "string",
                    "nullable": true,
                    "metadata": {}
                  }
                ]
              },
              "nullable": true,
              "metadata": {}
            }
          ]
        },
        "nullable": true,
        "metadata": {}
      }
    ]
  }
}
'''

次に、スキーマのすぐ下にある同じファイルに、Azure IoT Operations のデプロイから取得した既存の スキーマ レジストリ リソースへのポインターとともに、スキーマ リソースを定義します。

// Replace placeholder values with your actual resource names
param schemaRegistryName string = '<SCHEMA_REGISTRY_NAME>'

// Pointers to existing resources from AIO deployment
resource schemaRegistry 'Microsoft.DeviceRegistry/schemaRegistries@2024-09-01-preview' existing = {
  name: schemaRegistryName
}

// Name and version of the schema
param opcuaSchemaName string = 'opcua-output-delta'
param opcuaSchemaVer string = '1'

// Define the schema resource to be created and instantiate a version
resource opcSchema 'Microsoft.DeviceRegistry/schemaRegistries/schemas@2024-09-01-preview' = {
  parent: schemaRegistry
  name: opcuaSchemaName
  properties: {
    displayName: 'OPC UA Delta Schema'
    description: 'This is a OPC UA delta Schema'
    format: 'Delta/1.0'
    schemaType: 'MessageSchema'
  }
}
resource opcuaSchemaVersion 'Microsoft.DeviceRegistry/schemaRegistries/schemas/schemaVersions@2024-09-01-preview' = {
  parent: opcSchema
  name: opcuaSchemaVer
  properties: {
    description: 'Schema version'
    schemaContent: opcuaSchemaContent
  }
}

スキーマの内容とリソースを定義したら、Bicep テンプレートをデプロイしてスキーマ レジストリにスキーマを作成できます。

az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep

次のステップ