Azure IoT Operations のカスタム WebAssembly (WASM) データ処理機能を使用すると、Azure IoT Operations クラスター内でリアルタイムのテレメトリ データ処理が可能になります。 カスタム WASM モジュールをデプロイすることで、データ フロー グラフまたは HTTP/REST コネクタの一部としてデータ変換を定義および実行できます。
この記事では、 Azure IoT Operations Data Flow VS Code 拡張機能を使用して、WASM モジュールを Azure IoT Operations クラスターにデプロイする前に、WASM モジュールをローカルで開発、テスト、デバッグする方法について説明します。 次の方法について学習します。
- 基本的なワークフローを理解するために、サンプル データを含む事前構築済みのグラフを実行して、グラフ アプリケーションをローカルで実行します。
- マップとフィルターの機能を使用して Python と Rust で新しい演算子を構築して、カスタム WASM モジュールを作成します。
- 状態ストアを使用して、メッセージ処理全体で状態を維持します。
- スキーマ レジストリの検証を使用して、処理する前に JSON スキーマを使用してメッセージ形式を検証します。
- ローカル開発用のブレークポイントとステップスルー デバッグを使用して WASM モジュールをデバッグします。
この拡張機能は、次のプラットフォームでサポートされています。
- Linux
- Windows Subsystem for Linux (WSL)
- ウィンドウズ
Azure IoT Operations のグラフと WASM の詳細については、次を参照してください。
[前提条件]
開発環境:
- Visual Studio Code
- VS Code 用の RedHat YAML 拡張機能 (省略可能)
- VS Code 用の Azure IoT Operations Data Flow 拡張機能。
- WASM モジュールのデバッグを有効にする VS Code 用 CodeLLDB 拡張機能
- Azure CLI
- ORAS CLI
- Docker
Docker イメージ:
docker pull mcr.microsoft.com/azureiotoperations/processor-app:1.1.4
docker tag mcr.microsoft.com/azureiotoperations/processor-app:1.1.4 host-app
docker pull mcr.microsoft.com/azureiotoperations/devx-runtime:0.1.8
docker tag mcr.microsoft.com/azureiotoperations/devx-runtime:0.1.8 devx
docker pull mcr.microsoft.com/azureiotoperations/statestore-cli:0.0.2
docker tag mcr.microsoft.com/azureiotoperations/statestore-cli:0.0.2 statestore-cli
docker pull eclipse-mosquitto
VS Code 拡張機能を使用してグラフ アプリケーションをローカルで実行する
この例では、VS Code 拡張機能を使用してグラフ アプリケーションをローカルでビルドして実行するために必要なすべてのリソースを含むサンプル ワークスペースを使用します。
VS Code でサンプル ワークスペースを開く
まだ作成していない場合は、 Explore IoT Operations リポジトリを複製します。
Visual Studio Code で samples/wasm フォルダーを開き、[ファイル] メニューから [フォルダーを>] を選択し、 フォルダーに移動します。
演算子を構築する
Ctrl+Shift+Pキーを押してコマンド パレットを開き、Azure IoT Operations: Build All Data Flow Operators を検索します。 ビルド モードとして リリース を選択します。
このコマンドは、ワークスペース内のすべての演算子をビルドし、.wasm フォルダーにoperatorsファイルを作成します。
.wasm ファイルを使用して、グラフ アプリケーションをローカルで実行します。
グラフ アプリケーションをローカルで実行する
Ctrl+Shift+Pキーを押してコマンド パレットを開き、Azure IoT Operations: Run Application Graph を検索します。 実行モードとして リリース を選択します。 このコマンドは、ワークスペース内の graph.dataflow.yaml ファイルと共にローカル実行環境を使用して、グラフ アプリケーションをローカルで実行します。
また、 hostapp.env.list から読み取り、データ フロー オペレーター構成パラメーターの環境変数 TK_CONFIGURATION_PARAMETERS を設定します。
入力データの入力を求められたら、ワークスペース内の data-and-images フォルダーを選択します。 このフォルダーには、温度と湿度のデータを含むグラフ アプリケーションの入力データ ファイルと、スナップショット モジュールのイメージが含まれています。
ログの準備ができたことを示す VS Code 通知が表示されるまで待ちます: Log files for the run can be found at ...\wasm\data-and-images\output\logs。
出力は、output フォルダーの下の data-and-images フォルダーにあります。 ワークスペース内の output フォルダーを開いて、出力ファイルを表示できます。 ファイル名の日付と時刻を含む .txt ファイルには、処理されたデータが含まれており、次の例のようになります。
{"tst":"2025-09-19T04:19:13.530381+0000","topic":"sensors","qos":0,"retain":0,"payloadlen":312,"properties":{"payload-format-indicator":1,"message-expiry-interval":10,"correlation-data":"...","user-properties":{"__ts":"001758255553528:00000:...","__protVer":"1.0","__srcId":"mqtt-source"},"content-type":"application/json"},"payload":{"temperature":[{"count":2,"max":653.888888888889,"min":204.44444444444449,"average":429.16666666666669,"last":204.44444444444449,"unit":"C","overtemp":true}],"humidity":[{"count":3,"max":85,"min":45,"average":69.666666666666671,"last":79}],"object":[{"result":"notebook, notebook computer; sliding door"}]}}
出力は、グラフ アプリケーションが入力データを処理し、出力を生成したことを示しています。 出力には、温度と湿度のデータと、画像で検出されたオブジェクトが含まれます。
カスタム WASM モジュールを使用して新しいグラフを作成する
このシナリオでは、カスタム WASM モジュールを使用して新しいグラフ アプリケーションを作成する方法を示します。 グラフ アプリケーションは、温度値を華氏から摂氏に変換する map 演算子と、500°C を超える温度値のメッセージを除外する filter 演算子の 2 つの演算子で構成されています。
既存のサンプル ワークスペースを使用する代わりに、新しいワークスペースを最初から作成します。 このプロセスでは、新しいグラフ アプリケーションを作成し、Python と Rust で演算子をプログラミングする方法を学習できます。
演算子の名前付け制約
現在、演算子名にはハイフン (-) またはアンダースコア (_) を使用しないでください。 VS Code 拡張機能ではこの要件が適用されますが、モジュールを手動で作成または名前変更すると、問題が発生します。
filter、map、stateenrich、schemafilterなどのモジュールには、単純な英数字名を使用します。
Python で新しいグラフ アプリケーション プロジェクトを作成する
Ctrl+Shift+Pを押して VS Code コマンド パレットを開き、Azure IoT 操作を検索します。新しいデータ フロー アプリケーションを作成します。
- フォルダーの場合は、プロジェクトを作成するフォルダーを選択します。 このプロジェクトの新しいフォルダーを作成できます。
- 名前として「
my-graph」と入力します。 - 言語として Python を選択します。
- 種類として [マップ ] を選択します。
- 名前として「
map」と入力します。
これで、基本的なプロジェクト構造とスターター ファイルを含む新しい VS Code ワークスペースが作成されました。 スターター ファイルには、 graph.dataflow.yaml ファイルとマップ演算子テンプレートのソース コードが含まれます。
Important
デプロイされた Azure IoT Operations インスタンスで Python モジュールを使用するには、ブローカー のメモリ プロファイルが [中 ] または [ 高] に設定されたインスタンスをデプロイする必要があります。 メモリ プロファイルを Low または Tiny に設定した場合、インスタンスは Python モジュールをプルできません。
map 演算子モジュールの Python コードを追加する
operators/map/map.py ファイルを開き、内容を次のコードに置き換えて、受信温度の値を華氏から摂氏に変換します。
import json
from map_impl import exports
from map_impl import imports
from map_impl.imports import types
class Map(exports.Map):
def init(self, configuration) -> bool:
imports.logger.log(imports.logger.Level.INFO, "module4/map", "Init invoked")
return True
def process(self, message: types.DataModel) -> types.DataModel:
# TODO: implement custom logic for map operator
imports.logger.log(imports.logger.Level.INFO, "module4/map", "processing from python")
# Ensure the input is of the expected type
if not isinstance(message, types.DataModel_Message):
raise ValueError("Unexpected input type: Expected DataModel_Message")
# Extract and decode the payload
payload_variant = message.value.payload
if isinstance(payload_variant, types.BufferOrBytes_Buffer):
# It's a Buffer handle - read from host
imports.logger.log(imports.logger.Level.INFO, "module4/map", "Reading payload from Buffer")
payload = payload_variant.value.read()
elif isinstance(payload_variant, types.BufferOrBytes_Bytes):
# It's already bytes
imports.logger.log(imports.logger.Level.INFO, "module4/map", "Reading payload from Bytes")
payload = payload_variant.value
else:
raise ValueError("Unexpected payload type")
decoded = payload.decode("utf-8")
# Parse the JSON data
json_data = json.loads(decoded)
# Check and update the temperature value
if "temperature" in json_data and "value" in json_data["temperature"]:
temp_f = json_data["temperature"]["value"]
if isinstance(temp_f, int):
# Convert Fahrenheit to Celsius
temp_c = round((temp_f - 32) * 5.0 / 9.0)
# Update the JSON data
json_data["temperature"]["value"] = temp_c
json_data["temperature"]["unit"] = "C"
# Serialize the updated JSON back to bytes
updated_payload = json.dumps(json_data).encode("utf-8")
# Update the message payload
message.value.payload = types.BufferOrBytes_Bytes(value=updated_payload)
return message
Docker が実行されていることを確認します。 次に、 Ctrl+Shift+P キーを押してコマンド パレットを開き、 Azure IoT Operations: Build All Data Flow Operators を検索します。
リリース モジュールを作成します。
ビルド プロセスでは、map.wasm 演算子のmap ファイルが operators/map/bin/release フォルダーに配置されます。
フィルター演算子モジュールの Rust コードを追加する
Ctrl+Shift+Pキーを押してコマンド パレットを開き、Azure IoT Operations: Create data flow operator を検索して、新しいオペレーターを作成します。
- 言語として Rust を選択します。
- 演算子の種類として [フィルター] を選択します。
- 名前として「
filter」と入力します。
operators/filter/src/lib.rs ファイルを開き、内容を次のコードに置き換えて、温度が 500°C を超える値を除外します。
mod filter_operator {
use wasm_graph_sdk::macros::filter_operator;
use serde_json::Value;
fn filter_init(_configuration: ModuleConfiguration) -> bool {
// Add code here to process the module init properties and module schemas from the configuration
true
}
#[filter_operator(init = "filter_init")]
fn filter(input: DataModel) -> Result<bool, Error> {
// Extract payload from input to process
let payload = match input {
DataModel::Message(Message {
payload: BufferOrBytes::Buffer(buffer),
..
}) => buffer.read(),
DataModel::Message(Message {
payload: BufferOrBytes::Bytes(bytes),
..
}) => bytes,
_ => return Err(Error { message: "Unexpected input type".to_string() }),
};
// ... perform filtering logic here and return boolean
if let Ok(payload_str) = std::str::from_utf8(&payload) {
if let Ok(json) = serde_json::from_str::<Value>(payload_str) {
if let Some(temp_c) = json["temperature"]["value"].as_i64() {
// Return true if temperature is above 500°C
return Ok(temp_c > 500);
}
}
}
Ok(false)
}
}
operators/filter/Cargo.toml ファイルを開き、次の依存関係を追加します。
[dependencies]
# ...
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
Docker が実行されていることを確認します。 次に、 Ctrl+Shift+P キーを押してコマンド パレットを開き、 Azure IoT Operations: Build All Data Flow Operators を検索します。
リリース モジュールを作成します。
ビルド プロセスでは、filter.wasm 演算子のfilter ファイルが operators/filter/bin/release フォルダーに配置されます。
サンプル データを使用してグラフ アプリケーションをローカルで実行する
graph.dataflow.yaml ファイルを開き、その内容を次のコードに置き換えます。
metadata:
$schema: "https://www.schemastore.org/aio-wasm-graph-config-1.0.0.json"
name: "Temperature Monitoring"
description: "A graph that converts temperature from Fahrenheit to Celsius, if temperature is above 500°C, then sends the processed data to the sink."
version: "1.0.0"
vendor: "Microsoft"
moduleRequirements:
apiVersion: "1.1.0"
runtimeVersion: "1.1.0"
operations:
- operationType: source
name: source
- operationType: map
name: map
module: map
- operationType: filter
name: filter
module: filter
- operationType: sink
name: sink
connections:
- from:
name: source
to:
name: map
- from:
name: map
to:
name: filter
- from:
name: filter
to:
name: sink
複製されたサンプル リポジトリdataから現在のワークスペースにサンプル データを含むexplore-iot-operations\samples\wasm\data フォルダーをコピーします。
data フォルダーには、サンプルの入力温度データを含む 3 つの JSON ファイルが含まれています。
Ctrl+Shift+Pキーを押してコマンド パレットを開き、Azure IoT Operations: Run Application Graph を検索します。
-
graph.dataflow.yamlグラフ ファイルを選択します。 - 実行モードとして リリース を選択します。
- ワークスペースにコピーした
dataフォルダーを選択します。
DevX コンテナーが起動してグラフが実行されます。 処理された結果は、 data/output フォルダーに保存されます。
カスタム WASM モジュールとグラフを Azure IoT Operations インスタンスにデプロイする方法については、「 WASM モジュールとデータ フロー グラフのデプロイ」を参照してください。
WASM 演算子のステート ストアのサポート
この例では、WASM 演算子で状態ストアを使用する方法を示します。 状態ストアを使用すると、オペレーターはメッセージ処理全体でデータを保持および取得でき、データ フロー グラフでステートフル操作が可能になります。
状態ストアのサンプル ワークスペースを開く
まだ作成していない場合は、 Explore IoT Operations リポジトリを複製します。
Visual Studio Code で samples/wasm/statestore-scenario フォルダーを開き、[ファイル] メニューから [フォルダーを>] を選択し、 フォルダーに移動します。 このフォルダーには、次のリソースが含まれています。
-
graph.dataflow.yaml- 状態ストアが有効な演算子を使用したデータ フロー グラフの構成。 -
statestore.json- キーと値のペアを使用した状態ストアの構成。 -
data/- テスト用のサンプル入力データ。 -
operators/- otel-enrich 演算子とフィルター演算子のソース コード。
状態ストアを構成する
statestore.jsonファイルを開き、現在の状態ストアの構成を表示します。テスト用に
factoryIdまたはmachineIdの値を変更できます。 エンリッチメント パラメーターは、これらのキーを参照します。graph.dataflow.yamlを開き、エンリッチメントの構成を確認します。 このファイルの重要なセクションを次のスニペットに示します。moduleConfigurations: - name: module-otel-enrich/map parameters: enrichKeys: name: enrichKeys description: Comma separated list of DSS keys which will be fetched and added as attributes default: factoryId,machineId operations: - operationType: "source" name: "source" - operationType: "map" name: "module-otel-enrich/map" module: "otel-enrich" - operationType: "sink" name: "sink"enrichKeysパラメーターの既定値 (factoryId,machineId) によって、状態ストアからフェッチされ、属性として追加されるキーが決まります。enrichKeysに一覧表示されている各キーがstatestore.jsonに存在することを確認します。statestore.jsonでキーを追加または削除する場合は、default値を更新するか、TK_CONFIGURATION_PARAMETERS環境変数を使用してオーバーライドします。
テスト データの更新 (省略可能)
data/ フォルダー内のテスト データを変更して、さまざまな入力値を試すことができます。 サンプル データには、温度の測定値が含まれています。
状態ストアのシナリオを構築して実行する
Ctrl+Shift+Pキーを押してコマンド パレットを開き、Azure IoT Operations: Build All Data Flow Operators を検索します。ビルド モードとして リリース を選択します。 ビルドが完了するまで待ちます。
Ctrl+Shift+Pをもう一度押し、Azure IoT 操作: アプリケーション グラフの実行を検索します。実行モードとして リリース を選択します。
入力データの VS Code ワークスペース内の
dataフォルダーを選択します。 DevX コンテナーが起動し、サンプル入力でグラフが実行されます。
状態ストアの機能を確認する
グラフの実行が完了した後:
data/output/フォルダーに結果を表示します。生成された
.txtファイルを開き、処理されたデータを確認します。 出力メッセージのuser propertiesセクションには、状態ストアから取得されたfactoryId値とmachineId値が含まれます。data/output/logs/host-app.logのログを調べて、otel-enrich演算子が状態ストアから値を取得し、それらをユーザー プロパティとしてメッセージに追加したことを確認します。
WASM モジュールのスキーマ レジストリのサポート
この例では、WASM モジュールでスキーマ レジストリを使用する方法を示します。 スキーマ レジストリを使用すると、メッセージ形式を検証し、データ フロー処理でデータの一貫性を確保できます。
スキーマ レジストリのサンプル ワークスペースを開く
まだ作成していない場合は、 Explore IoT Operations リポジトリを複製します。
Visual Studio Code で samples/wasm/schema-registry-scenario フォルダーを開き、[ファイル] メニューから [フォルダーを>] を選択し、 フォルダーに移動します。 このフォルダーには、次のリソースが含まれています。
-
graph.dataflow.yaml- データ フロー グラフの構成。 -
tk_schema_config.json- ホスト アプリがダウンストリーム演算子に到達する前に受信メッセージ ペイロードを検証するためにローカルで使用する JSON スキーマ。 このファイルは、Microsoft Azure 環境に発行するすべてのスキーマと同期してください。 -
data/- テスト用に異なるメッセージ形式のサンプル入力データ。 -
operators/filter/- フィルター演算子のソース コード。 - (省略可能)
hostapp.env.list- VS Code 拡張機能は、実行時に 1 つを自動生成し、TK_SCHEMA_CONFIG_PATH=tk_schema_config.jsonを追加します。 独自のスキーマ ファイルを指定する場合は、変数がそのファイルを指していることを確認します。
スキーマ構成について
tk_schema_config.json ファイルを開き、スキーマ定義を表示します。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"humidity": {
"type": "integer"
},
"temperature": {
"type": "number"
}
}
}
このスキーマは、 humidity (整数) と temperature (数値) の 2 つの数値プロパティを含むことができる最上位の JSON オブジェクトを定義します。 両方を必須にする必要がある場合は "required": ["humidity", "temperature"] 配列を追加するか、ペイロード形式の進化に合わせて properties セクションを拡張します。
ローカル スキーマ ファイル (tk_schema_config.json) には、次の制限事項が適用されます。 スキーマ ファイル:
- Azure IoT Operations スキーマ レジストリでサポートされているのと同じ下書きである、標準の JSON スキーマ ドラフト 07 構文を使用します。
- 機能的には、クラウド スキーマ レジストリに登録するコンテンツと同じです。 一貫性を保つには、2 つの間にコピーして貼り付けることができます。
- 環境変数
TK_SCHEMA_CONFIG_PATHを介してホスト アプリによって参照されます。
現時点では、ローカル開発ランタイムには次の制限事項が適用されます。
- 読み込まれるスキーマ構成ファイルは 1 つだけです。 マルチファイルインクルードまたはディレクトリスキャンはサポートされていません。
-
$ref外部ファイルまたは URL へのアクセスはローカルではサポートされていません。 スキーマは自己完結型のままにします。{"$ref":"#/components/..."}などの内部 JSON ポインター参照を使用できます。 -
type、properties、required、enum、minimum、maximum、allOf、anyOf、oneOf、not、itemsなど、一般的に使用されるドラフト 07 キーワードはすべて動作します。 基になる検証コントロールは、contentEncodingやcontentMediaTypeなどの一般的でない機能や高度な機能を無視する場合があります。 - 高速コールド スタートでは、スキーマのサイズを最大 1 MB 未満にしてください。
- バージョン管理ポリシーとスキーマ進化ポリシーはローカルに適用されません。 クラウド レジストリとの連携を維持する責任は、お客様にあります。
検証がローカルで失敗する高度なコンストラクトに依存している場合は、発行後にクラウド レジストリに対して同じスキーマを検証し、パリティを確保します。
詳細については、 Azure IoT Operations スキーマ レジストリの概念に関するページを参照してください。
テスト データを確認する
data/ フォルダーには、次の 3 つのテスト ファイルが含まれています。
-
temperature_humidity_payload_1.json- 温度と湿度の両方のデータが含まれており、検証に合格します。 ただし、湿度の値はスキーマで指定されている整数ではないので、データはフィルターで除外されます。 -
temperature_humidity_payload_2.json- 湿度データのみが含まれており、除外されます。 -
temperature_humidity_payload_3.json- 温度と湿度の両方のデータが含まれており、検証に合格します。
スキーマ レジストリ シナリオをビルドして実行する
Ctrl+Shift+Pキーを押してコマンド パレットを開き、Azure IoT Operations: Build All Data Flow Operators を検索します。ビルド モードとして リリース を選択します。 ビルドが完了するまで待ちます。
Ctrl+Shift+Pをもう一度押し、Azure IoT 操作: アプリケーション グラフの実行を検索します。graph.dataflow.yamlグラフ ファイルを選択します。実行モードとして リリース を選択します。
入力データの VS Code ワークスペース内の
dataフォルダーを選択します。 DevX コンテナーが起動し、サンプル入力でグラフが実行されます。
スキーマの検証を確認する
処理が完了した後:
data/output/フォルダーで結果を確認します。出力には、スキーマに準拠しているため、処理されたバージョンの
temperature_humidity_payload_3.jsonメッセージのみが含まれます。data/output/logs/host-app.logファイルには、スキーマ検証に基づいて受け入れられるメッセージまたは拒否されるメッセージを示すログ エントリが含まれています。
この例では、スキーマ レジストリが受信メッセージを検証し、定義されたスキーマに準拠していないメッセージを除外する方法を示します。
VS Code 拡張機能を使用して WASM モジュールをデバッグする
この例では、VS Code でブレークポイントと統合デバッガーを使用して WASM モジュールをローカルでデバッグする方法を示します。
[前提条件]
サンプル ワークスペースを設定するには、 WASM モジュールのスキーマ レジストリサポート の例を完了します。
デバッグを設定する
operators/filter/src/lib.rsワークスペースでファイルschema-registry-scenarioを開きます。filter関数を見つけ、行番号の横にある余白をクリックするか、F9を押してブレークポイントを設定します。fn filter(message: DataModel) -> Result<bool, Error> { let DataModel::Message(message) = input else { return Err(Error {message: "Unexpected input type.".to_string()}); }; // ... rest of function }
デバッグ用のビルド
Ctrl+Shift+Pキーを押してコマンド パレットを開き、Azure IoT Operations: Build All Data Flow Operators を検索します。ビルド モードとして [デバッグ ] を選択します。 ビルドが完了するまで待ちます。
デバッグを有効にして実行する
Ctrl+Shift+Pキーを押し、Azure IoT 操作: アプリケーション グラフの実行を検索します。lldb-debug.graph.dataflow.yamlグラフ ファイルを選択します。実行モードとして [デバッグ ] を選択します。
入力データの VS Code ワークスペース内の
dataフォルダーを選択します。 DevX コンテナーが起動し、サンプル入力でグラフが実行されます。DevX コンテナーが起動すると、ホスト アプリ コンテナーがデバッグ用の
lldb-serverで始まることがわかります。
現在のデバッガーはデバッグ セッション内の 1 つのカスタム WASM 演算子にのみアタッチできるため、特別なデバッグ グラフ ファイルを使用します。 専用デバッグ グラフを使用すると、通常の graph.dataflow.yaml を維持でき、複数のモジュールが存在する場合にデバッガーが予期しないアタッチを防ぐことができます。
独自のデバッグ グラフ ファイルを作成するには:
- 通常の
graph.dataflow.yamlを新しいファイルにコピーします。lldb-プレフィックスの使用は規則ですが、名前は任意です。 - デバッグする演算子を除き、他のすべてのカスタム WASM 演算子を削除します。
- シンボルを使用できるように 、デバッグ モードでターゲット演算子を再構築します。
- 実行モードをデバッグに設定してデバッグ グラフを実行 します。 拡張機能によって
lldb-serverが起動され、VS Code が自動的にアタッチされます。
WASM モジュールをデバッグする
実行は、
filter関数で設定したブレークポイントで自動的に停止します。VS Code デバッグ インターフェイスを使用して、次の操作を行います。
- [変数 ] パネルで 変数の値を調べます。
-
F10またはF11を使用してコードをステップ 実行します。 - [呼び出し履歴] パネルで 呼び出し履歴を 表示します。
- 特定の変数または式のウォッチを設定します。
F5キーを押すか、[続行] ボタンを選択して、実行を続行します。デバッガーは、処理中の各メッセージのブレークポイントで停止し、データ フローを検査できます。
デバッグのヒント
- デバッグ コンソールを使用して式を評価し、ランタイムの状態を検査します。
- ブレークポイントを右クリックして条件を追加して、条件付きブレークポイントを設定します。
- ブレークポイントを削除せずにオンとオフを切り替えるには、
F9を使用します。 - [ 変数] パネルには、ローカル変数と関数パラメーターの現在の状態が表示されます。
このデバッグ機能を使用すると、運用環境にデプロイする前に、問題のトラブルシューティング、データ フローの理解、WASM モジュール ロジックの検証を行うことができます。
既知の問題
データ フローの構成
YAML のブール値: 検証エラーを回避するには、ブール値を文字列として引用符で囲む必要があります。 たとえば、
"True"や"False"の代わりにtrueとfalseを使用します。引用符で囲まれていないブール値を使用する場合のエラー例:
* spec.connections[2].from.arm: Invalid value: "boolean": spec.connections[2].from.arm in body must be of type string: "boolean" * spec.connections[2].from.arm: Unsupported value: false: supported values: "False", "True"Python モジュールの要件: Python モジュールを使用するには、 中 または 高 のメモリ プロファイルを使用するように構成された MQTT ブローカーと共に Azure IoT Operations をデプロイする必要があります。 メモリ プロファイルが Low または Tiny に設定されている場合、Python モジュールをプルすることはできません。
モジュールのデプロイのタイミング: WASM モジュールのプルと適用には、ネットワークの状態とモジュールのサイズによっては、通常は約 1 分かかる場合があります。
VS Code 拡張機能
ビルド エラーの詳細: ビルドが失敗すると、ポップアップ通知のエラー メッセージで十分な詳細が提供されない可能性があります。 ターミナルの出力で、より具体的なエラー情報を確認します。
Windows の互換性: Windows では、グラフ アプリケーションを初めて実行するときに、"終了コード 1 でコマンドが失敗しました" というエラーが発生する可能性があります。このエラーが発生した場合は、操作を再試行してください。正しく動作するはずです。
ホスト アプリの安定性: ローカル実行環境が動作を停止し、回復するために再起動が必要になる場合があります。
トラブルシューティング
ログの表示
データ フロー サービス ログを表示するには、次のコマンドを実行します。
kubectl logs -n azure-iot-operations -l app.kubernetes.io/name=microsoft-iotoperations-dataflows
データ処理サービス ログを表示するには、次のコマンドを実行します。
kubectl logs -n azure-iot-operations -l app.kubernetes.io/instance=aio-dataflow-default
モジュール管理ログを表示するには、次のコマンドを実行します。
kubectl logs -n azure-iot-operations -l app.kubernetes.io/instance=aio-dataflow-graph-controller
回復手順
VS Code 拡張機能のリセット: VS Code 拡張機能が予期せず動作する場合は、アンインストールして再インストールしてから、VS Code を再起動してください。