Azure IoT Operationsデータ フロー グラフでは、エッジでのカスタム データ処理用の WebAssembly (WASM) モジュールがサポートされています。 データ フロー パイプラインの一部として、カスタム ビジネス ロジックとデータ変換をデプロイできます。
Important
現在、データ フロー グラフは MQTT、Kafka、OpenTelemetry エンドポイントのみをサポートしています。 Data Lake、Microsoft Fabric OneLake、Azure Data Explorer、ローカル ストレージなどの他のエンドポイントの種類はサポートされていません。
Important
現在、カスタム処理のグラフ定義をサポートする唯一のコネクタは、HTTP/REST コネクタです。
Important
現在、オペレーションエクスペリエンスのウェブUIは、Azure Container Registry(ACR)から得られたデータフローグラフのアーティファクトの作成と表示のみをサポートしており、組み込みの変換には mcr.microsoft.com も含まれます。 詳細については、Operations Experience Web UIをご覧ください。これはAzure Container Registry(ACR)および mcr.microsoft.com から得られたデータフローグラフのアーティファクトのみを表示します。
[前提条件]
- Kubernetes クラスターにデプロイされた Azure IoT Operations のインスタンス。 詳細については、「Deploy Azure IoT Operationsを参照してください。
- モジュールとグラフをプルするコンテナー レジストリを指すレジストリ エンドポイント。 詳細については、「 レジストリ エンドポイントの構成」を参照してください。 独自のレジストリを設定せずに作業を開始するには、「パブリック レジストリ
ghcr.io」で説明されているパブリック サンプル エンドポイントを使用します。
Azure Container Registry (ACR) などのプライベート レジストリに独自のモジュールとグラフをプッシュするには、次も必要です。
- WASM モジュールとグラフを格納するための ACR などのコンテナー レジストリへのアクセス。
- WASM モジュールをレジストリにプッシュするための OCI Registry As Storage (ORAS) CLI。
この記事のAzure CLI例は環境変数を使っており、各値を一度設定してからコマンドをコピー&ペーストできます as-is。 クイックスタートのAzure IoT Operations Codespaces環境を使っている場合、これらの変数はすでに設定済みなので、このステップを省略できます。 そうでなければ、コマンドを実行する前にシェル内で以下の環境変数を設定してください。
以下のスクリプトは、最も一般的に使われる環境変数を設定します。
| 環境変数 | Description |
|---|---|
SUBSCRIPTION_ID |
Azure IoT Operationsインスタンスを含むサブスクリプションのIDです。 |
RESOURCE_GROUP |
あなたのAzure IoT Operationsインスタンスを含むリソースグループの名前です。 |
AIO_INSTANCE_NAME |
あなたのAzure IoT Operationsインスタンスの名前です。 インスタンスを挙げるには、 az iot ops list -o tableを実行してください。 |
CLUSTER_NAME |
あなたのインスタンスをホストしているAzure Arc対応のKubernetesクラスターの名前です。 |
LOCATION |
例えばeastusなど、新しい資源を活用するためのAzure地域。 |
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
AIO_INSTANCE_NAME=<instance-name>
CLUSTER_NAME=<cluster-name>
LOCATION=<region>
この記事で使っている変数を設定するだけで十分です。 この記事では、選択したリソース名に追加の環境変数を使う場合があります。 記事では、それらが導入される箇所でどのように設定するかを説明しています。
概要
Azure IoT Operations データ フロー グラフとコネクタの WASM モジュールを使用すると、高パフォーマンスとセキュリティでエッジでデータを処理できます。 WASM はサンドボックス環境で実行され、Rust とPythonをサポートします。
パブリック レジストリから事前構築済みモジュールを使用する
事前に構築されたサンプルWASMモジュールやグラフ定義は、GitHubghcr.ioのもとで一般公開されているコンテナレジストリ(azure-samples/explore-iot-operations)に公開されています。
注
ghcr.io は、公開アーティファクトであっても提供する前に認証されたトークン交換を必要とし、現在の Azure IoT Operations ランタイムは匿名での交換を実行しません。
public-ghcrエンドポイントを、匿名認証ではなく、スコープを持つGitHubパーソナルアクセストークン(PAT)で裏付けられたread:packagesで設定してください。 エンドポイントおよびシークレットステップについては、「 パブリックレジストリの使用」を参照してください。
利用可能なサンプル アーティファクト
public-ghcr レジストリ エンドポイントを作成した後、registryEndpointRef: public-ghcrを使用してデータ フロー グラフで参照します。 レジストリ エンドポイント ホストは ghcr.ioされているため、成果物参照にリポジトリ パス azure-samples/explore-iot-operations を含めます。 次のサンプル モジュールとグラフ定義を使用できます。
| アーティファクト | Description |
|---|---|
azure-samples/explore-iot-operations/graph-simple:1.0.0 |
単純温度変換グラフの定義 |
azure-samples/explore-iot-operations/graph-complex:1.0.0 |
マルチセンサー処理グラフの定義 |
azure-samples/explore-iot-operations/temperature:1.0.0 |
温度変換モジュール (華氏から摂氏) |
azure-samples/explore-iot-operations/window:1.0.0 |
時間ベースのウィンドウ 化モジュール |
azure-samples/explore-iot-operations/snapshot:1.0.0 |
画像処理と物体検出モジュール |
azure-samples/explore-iot-operations/format:1.0.0 |
画像形式変換モジュール |
azure-samples/explore-iot-operations/humidity:1.0.0 |
湿度データ処理モジュール |
azure-samples/explore-iot-operations/collection:1.0.0 |
マルチセンサー データ集計モジュール |
azure-samples/explore-iot-operations/enrichment:1.0.0 |
メタデータ エンリッチメント モジュール |
azure-samples/explore-iot-operations/filter:1.0.0 |
データ フィルター モジュール |
注
パブリック サンプル グラフ定義では、azure-samples/explore-iot-operationsなど、azure-samples/explore-iot-operations/temperature:1.0.0 リポジトリ パスを含むモジュール参照が使用されます。 レジストリ エンドポイント ホストが ghcr.ioされているため、このパスが必要です。 成果物を独自のレジストリにコピーする場合は、グラフ定義内のモジュール参照が、モジュール成果物をプッシュするパスと一致していることを確認します。
パブリック レジストリで単純なグラフを使用するには、「 例 1: 1 つの WASM モジュールを使用した基本的なデプロイ 」を参照し、レジストリ エンドポイント名として public-ghcr を使用します。
プライベート レジストリを使用する
カスタム モジュールを使用する必要がある場合、またはサンプル モジュールの独自のコピーをホストする場合は、Azure Container Registry (ACR) などのプライベート コンテナー レジストリを設定します。
コンテナー レジストリを設定する
Azure IoT Operationsには、WASM モジュールとグラフ定義をプルするためのコンテナー レジストリが必要です。 Azure Container Registry (ACR) または別の OCI 互換レジストリを使用できます。 ACR インスタンスを作成するには、「Azure Container Registryのデプロイ」を参照してください。 レジストリが存在したら、それを指すレジストリ エンドポイントを作成します。 「レジストリ エンドポイントの作成」を参照してください。
ORAS CLI をインストールする
ORAS CLI を使用して、WASM モジュールとグラフ定義をコンテナー レジストリにプッシュします。 インストール手順については、ORAS のインストールに関する記事を参照してください。
パブリック レジストリからサンプル モジュールをプルする
事前構築済みのサンプル モジュールを使用します。
# Pull sample modules and graphs
oras pull ghcr.io/azure-samples/explore-iot-operations/graph-simple:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/graph-complex:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/temperature:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/window:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/snapshot:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/format:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/humidity:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/collection:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/enrichment:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/filter:1.0.0
モジュールをレジストリにプッシュする
サンプル モジュールとグラフを取得したら、コンテナー レジストリにプッシュします。
ACR_NAME環境変数をAzure Container Registryの名前に設定してください。
Important
操作エクスペリエンスは、レイヤー メディアの種類ではなく、OCI 構成 メディアの種類によって成果物を検出します。 レジストリに成果物をプッシュする場合は、適切なメディアの種類を設定する必要があります。そうしないと、操作エクスペリエンス UI にアーティファクトが表示されません。
| 成果物の種類 | 必要な OCI 構成メディアの種類 | 必要なレイヤー メディアの種類 |
|---|---|---|
| グラフの定義 | application/vnd.microsoft.aio.graph.v1+yaml |
application/yaml |
| WASM モジュール | application/vnd.module.wasm.content.layer.v1+wasm |
application/wasm |
CI/CD パイプラインまたはその他のツールを使用してレジストリ間で成果物をコピーする場合は、これらのメディアの種類が保持されていることを確認します。 一部のツールでは、転送中に成果物メタデータが削除または置換されます。これにより、操作エクスペリエンスからアーティファクトが自動的に消えます。 詳細については、「 レジストリ成果物の要件」を参照してください。
成果物のレイアウトを選択する
グラフとモジュールをプッシュするときに使用するアーティファクト名によって、グラフ定義内で必要なモジュール参照が決まります。 レジストリ エンドポイント ホスト、成果物パス、およびモジュール参照の関連の背景については、「 成果物のパスとグラフ モジュールの参照」を参照してください。
Azureサンプル グラフの場合は、アーティファクトを独自のレジストリにコピーするときにサンプル リポジトリ パスを保持します。 グラフ定義は、そのパスを使用してモジュールを参照します。
<YOUR_ACR_NAME>.azurecr.io/azure-samples/explore-iot-operations/graph-simple:1.0.0
<YOUR_ACR_NAME>.azurecr.io/azure-samples/explore-iot-operations/temperature:1.0.0
データ フロー グラフで artifact: azure-samples/explore-iot-operations/graph-simple:1.0.0 を使用します。 グラフ定義では、 module: "azure-samples/explore-iot-operations/temperature:1.0.0"を使用します。
独自のグラフの場合は、フラット レイアウトを選択できます。
<YOUR_ACR_NAME>.azurecr.io/graph-simple:1.0.0
<YOUR_ACR_NAME>.azurecr.io/temperature:1.0.0
データ フロー グラフで artifact: graph-simple:1.0.0 を使用し、グラフ定義内で module: "temperature:1.0.0" します。
または、独自の入れ子になったレイアウトを選択します。
<YOUR_ACR_NAME>.azurecr.io/factory/graphs/graph-simple:1.0.0
<YOUR_ACR_NAME>.azurecr.io/factory/graphs/temperature:1.0.0
データ フロー グラフで artifact: factory/graphs/graph-simple:1.0.0 を使用し、グラフ定義内で module: "factory/graphs/temperature:1.0.0" します。
操作エクスペリエンス Web UI にグラフとモジュールが確実に表示されるようにするには、次の例に示すように、 --config フラグと --artifact-type フラグを追加します。
# Log in to your ACR
az acr login --name $ACR_NAME
# Push modules to your registry
oras push $ACR_NAME.azurecr.io/azure-samples/explore-iot-operations/graph-simple:1.0.0 --config /dev/null:application/vnd.microsoft.aio.graph.v1+yaml graph-simple.yaml:application/yaml --disable-path-validation
oras push $ACR_NAME.azurecr.io/azure-samples/explore-iot-operations/graph-complex:1.0.0 --config /dev/null:application/vnd.microsoft.aio.graph.v1+yaml graph-complex.yaml:application/yaml --disable-path-validation
oras push $ACR_NAME.azurecr.io/azure-samples/explore-iot-operations/temperature:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm temperature.wasm:application/wasm
oras push $ACR_NAME.azurecr.io/azure-samples/explore-iot-operations/window:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm window.wasm:application/wasm
oras push $ACR_NAME.azurecr.io/azure-samples/explore-iot-operations/snapshot:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm snapshot.wasm:application/wasm
oras push $ACR_NAME.azurecr.io/azure-samples/explore-iot-operations/format:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm format.wasm:application/wasm
oras push $ACR_NAME.azurecr.io/azure-samples/explore-iot-operations/humidity:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm humidity.wasm:application/wasm
oras push $ACR_NAME.azurecr.io/azure-samples/explore-iot-operations/collection:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm collection.wasm:application/wasm
oras push $ACR_NAME.azurecr.io/azure-samples/explore-iot-operations/enrichment:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm enrichment.wasm:application/wasm
oras push $ACR_NAME.azurecr.io/azure-samples/explore-iot-operations/filter:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm filter.wasm:application/wasm
ヒント
独自のモジュールをプッシュしてカスタム グラフを作成することもできます。「 カスタム データ フロー グラフの構成」を参照してください。
実行中のグラフでモジュールを更新する
実行中のグラフの WASM モジュールは、グラフを停止せずに更新できます。 これは、データフローを停止せずに演算子のロジックを更新する場合に便利です。 たとえば、温度変換モジュールをバージョン 1.0.0 から Azure サンプル成果物レイアウトの 2.0.0 に更新するには、次のように新しいバージョンをアップロードします。
oras push $ACR_NAME.azurecr.io/azure-samples/explore-iot-operations/temperature:2.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm temperature.wasm:application/wasm
注
新しいコンテンツを 同じタグ にプッシュすると ( azure-samples/explore-iot-operations/temperature:1.0.0の上書きなど)、データ フロー グラフは追加の構成なしで更新されたモジュールを自動的に取得します。 ただし、 新しいタグ ( azure-samples/explore-iot-operations/temperature:2.0.0 など) にプッシュする場合は、グラフ定義 YAML を更新して新しいバージョンを参照し、グラフ成果物を再プッシュする必要もあります。
カスタム WASM モジュールを開発する
データ フロー グラフのカスタム データ処理ロジックを作成するには、Rust または Python で WebAssembly モジュールを開発します。 カスタム モジュールを使用すると、組み込みの演算子では使用できない特殊なビジネス ロジック、データ変換、分析を実装できます。
以下のような包括的な開発ガイダンスが必要な場合:
- 開発環境を設定する
- Rust と Python での演算子の作成
- データ モデルとインターフェイスを理解する
- モジュールのビルドとテスト
データ フロー グラフ用 WebAssembly モジュールの開発に関する記事を参照してください。
データ処理ワークフローを定義する YAML グラフ定義の作成と構成の詳細については、WebAssembly グラフ定義の構成に関する記事を参照してください。
レジストリ成果物の要件
操作エクスペリエンスでは、OCI 成果物メタデータを使用して、グラフとモジュールを検出して表示します。 これらの要件を理解することは、カスタム CI/CD パイプラインを構築する場合、レジストリ間で成果物をコピーする場合、または UI で不足している成果物のトラブルシューティングを行う場合に重要です。
アーティファクトの検出のしくみ
ORAS を使用して成果物をレジストリにプッシュすると、OCI マニフェストには次の 2 つの関連フィールドが含まれます。
- 構成メディアの種類: これがどのような種類の成果物であるかを識別します。 操作エクスペリエンスでは、このフィールドにフィルターを適用してグラフとモジュールを検索します。
- レイヤー メディアの種類: 実際のファイル (YAML または WASM) のコンテンツ形式を記述します。
操作エクスペリエンスでは、レイヤー メディアの種類ではなく、検出に構成メディアの種類が使用されます。 構成メディアの種類が見つからないか正しくない場合、成果物はレジストリに存在しますが、UI には表示されません。
必要なメディアの種類
| 成果物の種類 | 構成メディアの種類 (--config または --artifact-type) |
レイヤー メディアの種類 |
|---|---|---|
| グラフの定義 | application/vnd.microsoft.aio.graph.v1+yaml |
application/yaml |
| WASM モジュール | application/vnd.module.wasm.content.layer.v1+wasm |
application/wasm |
グラフ定義の場合は、config mediaタイプに --config フラグを渡します。
REGISTRY環境変数をレジストリホストに設定します(例:<your-registry>.azurecr.io):
oras push $REGISTRY/my-graph:1.0.0 \
--config /dev/null:application/vnd.microsoft.aio.graph.v1+yaml \
graph.yaml:application/yaml \
--disable-path-validation
WASM モジュールの場合は、 --artifact-type フラグを指定して渡します。
oras push $REGISTRY/my-module:1.0.0 \
--artifact-type application/vnd.module.wasm.content.layer.v1+wasm \
module.wasm:application/wasm
CI/CD パイプラインに関する考慮事項
自動化されたパイプラインを使用してレジストリ間で成果物をコピーまたは昇格する場合 (ステージング レジストリから運用レジストリなど)、パイプラインで OCI 成果物メタデータが保持されていることを確認します。 一部のツールでは、転送中に構成メディアの種類が削除または置き換えられます。これにより、操作エクスペリエンスからアーティファクトが自動的に消えます。
転送後に成果物に正しいメタデータがあることを確認するには、マニフェストを調べます。
oras manifest fetch $REGISTRY/my-graph:1.0.0 | jq '{mediaType, configMediaType: .config.mediaType}'
出力には次の内容が表示されます。
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"configMediaType": "application/vnd.microsoft.aio.graph.v1+yaml"
}
configMediaTypeに application/vnd.oci.empty.v1+json などのジェネリック値が表示される場合は、メタデータが削除され、アーティファクトを正しいフラグで再プッシュする必要があります。
関連コンテンツ
- Rust および Python で演算子を記述するための Develop WebAssembly モジュール (エンドツーエンドのクイック スタートを含む)
- グラフ YAML 構造と構成パラメーターの WebAssembly グラフ定義を構成する
- WebAssemblyを使用してデータフローグラフをDataflowGraphリソースの構成および例に活用する
- IDE ベースの開発用に VS Code 拡張機能を使用して WASM モジュールをビルドする
- レジストリ エンドポイントを構成する