演習 - Azure 関数を IoT Edge に展開する
デバイスによって送信されるテレメトリをフィルター処理します。
各店舗から送信されてくるデータの量を最小限に抑えることが目的でした。 Azure IoT Central アプリケーションに送信されるテレメトリの量を減らすために、IoT Edge デバイス上のデータをフィルター処理する必要があります。
ここでは、IoT Edge デバイス上で実行されている Azure Functions を使用してフィルターを実装します。 このフィルターにより、周囲温度が 21°C を超える場合にのみ、デバイスがテレメトリを送信するようになります。
Note
この演習は省略してもかまいません。 この演習を実行する場合は、始める前に Azure サブスクリプションを作成する必要があります。 Azure アカウントをお持ちでない場合、またはこの時点で作成しない場合は、提示されている情報を理解するため手順に目を通してください。
コンテナー レジストリを構成する
IoT Edge デバイスは、フィルターを実装するカスタム Azure Functions モジュールをダウンロードしてインストールする必要があります。 IoT Edge モジュールは、コンテナー リポジトリに格納できる Docker 互換イメージとしてパッケージ化されます。 Azure Container Registry (ACR) を使用して、新しいモジュールを保存し、ソース プロジェクトからコンテナーをビルドします。
次のコマンドを実行して、コンテナー レジストリを Azure のリソース グループに追加します。
REGISTRY_NAME="edgecentral$RANDOM"
az acr create -n $REGISTRY_NAME -g <rgn>[sandbox resource group name]</rgn> --sku Standard --admin-enabled true
az acr credential show -n $REGISTRY_NAME
echo "Your registry name is: $REGISTRY_NAME"
このユニットで後ほど使用するために、レジストリ名と password
の値をメモしておきます。
Azure Functions プロジェクトを作成する
関数を実装するには C# を使用しています。 次のコマンドを実行して、プロジェクト テンプレートをインストールし、スケルトン プロジェクトを生成します。
dotnet new -i Microsoft.Azure.IoT.Edge.Function
dotnet new aziotedgefunction -n FilterFunction -r $REGISTRY_NAME.azurecr.io/filterfunction
cd FilterFunction
ls
次のコマンドを実行して、既存の FilterFunction.cs を、マシン温度テレメトリをフィルター処理する実装に置き換えます。
curl -O https://raw.githubusercontent.com/Azure-Samples/iot-central-docs-samples/main/iotedge/FilterFunction.cs
次に、イメージをビルドし、それをコンテナー レジストリにアップロードします。 このコマンドの実行には数分かかると予想されます。
az acr build --registry $REGISTRY_NAME --image filterfunction:v1 -f Dockerfile.amd64 .
次のコマンドを使用して、レジストリ内のイメージの一覧を表示できます。
az acr repository list --name $REGISTRY_NAME
配置マニフェストを更新する
IoT Edge デバイスで新しいフィルター モジュールを使用するには、新しいバージョンで配置マニフェストを更新します。
次のリンクを右クリックして [名前を付けてリンク先を保存] を選択し、新しい配置マニフェストとインターフェイス定義をローカル コンピューターにダウンロードします。
テキスト エディターで EnvironmentalSensorManifestFilter-1-4.json を開き、コンテナー レジストリのフィルター モジュールを使用するように更新します。
- 3 箇所の
<YOUR CONTAINER REGISTRY NAME>
を、コンテナー レジストリの名前に置き換えます。edgecentral27912
のような名前です。 <YOUR CONTAINER REGISTRY PASSWORD>
を、このユニットで前に記録したパスワードに置き換える。- 変更を保存します。
このバージョンの配置マニフェスト:
作成した Azure 関数が含まれるモジュールを追加します。
"filterfunction": { "version": "1.0", "type": "docker", "status": "running", "restartPolicy": "always", "settings": { "image": "<YOUR CONTAINER REGISTRY NAME>.azurecr.io/filterfunction:v1", "createOptions": "" }
フィルター処理されたテレメトリを Azure IoT Central アプリケーションに送信する前に、SimulatedTemperatureSensor モジュールからの出力を filterfunction モジュールにルーティングします。
"routes": { "FilterFunctionToIoTCentral": "FROM /messages/modules/filterfunction/outputs/* INTO $upstream", "sensorToFilterFunction": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filterfunction/inputs/input1\")" },
新しい配置マニフェストをアップロードするには:
Azure IoT Central アプリケーションで、[Edge マニフェスト] に移動し、[環境センサー] マニフェストを選択します。
[カスタマイズ] ページで、新しい EnvironmentalSensorManifestFilter-1-4.json ファイルをアップロードします。 [次へ] を選択します。
[確認と完了] ページには、新しい filterfunction モジュールが表示されます。 [保存] を選択します。
[デバイス] ページから [環境センサー エッジ デバイス] - store-001 デバイスに移動し、[モジュール] を選択します。
ページの上部付近で、[マニフェストの管理] > [エッジ マニフェストの割り当て] を選択します。 [環境センサー] マニフェストを選択し、[マニフェストの割り当て] を選択します。
モジュールの一覧に、実行中の filterfunction モジュールが含まれるようになりました。
新しいモジュールを使用するようにデバイス テンプレートを更新する
現在、IoT Edge デバイスにより、テレメトリ インターフェイスではなく filterfunction インターフェイスを介してテレメトリが送信されています。 そのため、デバイス テンプレートとビューを更新する必要があります。
[デバイス テンプレート] ページで、[環境センサー エッジ デバイス] を選択します。
[モジュール] を選択し、次に [マニフェストからモジュールをインポートする] を選びます。
[モジュールのインポート] ダイアログで、[環境センサー] を選択してから、[インポート] を選びます。
新しいモジュールによってテレメトリが Azure IoT Central に送信されるようになりました。 次に、テレメトリを指定してグラフを更新するインターフェイスを新しいフィルター モジュールに追加します。
- Module FilterFunction を選択し、[+ 継承されたインターフェイスの追加] を選択します。 このオプションを表示するには、省略記号 (...) を選択する必要がある場合があります。
- [インターフェイスのインポート] タイルを選択します。 前にダウンロードした TelemetryInterfaceFilter.json ファイルを選択します。
SimulatedTemperatureModule はテレメトリを Azure IoT Central に直接送信しなくなったため、元の Telemetry インターフェイスを削除できます。 このモジュールからの出力は、IoT Edge ランタイムによって FilterFunction モジュールにルーティングされます。
- SimulatedTemperatureSensor モジュールで Telemetry インターフェイスを選択します。
- [削除] を選択し、操作を確認します。
[IoT Edge デバイス テレメトリの表示] ビューを変更して、FilterFunction モジュールによって送信されたテレメトリを表示します。
- デバイス テンプレートで View IoT Edge device telemetry ビューを選択し、グラフ タイルの [編集] オプションを選択します。
- ambient/temperature、humidity、machine/temperature、pressure の各テレメトリ値を追加します。
- [更新]、[保存] の順に選択します。
- [発行] を選択して、デバイス テンプレートの新しいバージョンを発行します。
作業を確認
IoT Edge デバイスからフィルター処理されたテレメトリを表示するには:
[デバイス] ページで、store-001 デバイスを選択します。
View IoT Edge device telemetry ビューを選択します。
グラフでフィルター処理されたテレメトリを確認できます。 平均環境温度が 21.0 度未満の値は表示されません。
デバイスがテレメトリの送信を停止したように見える場合は、SimulatedTemperatureSensor モジュールが 500 件のメッセージを送信した後に停止したことが原因である可能性があります。 仮想マシンを再起動すると、カウントがリセットされ、テレメトリのフローが再び開始されます。
az vm restart --resource-group <rgn>[sandbox resource group name]</rgn> \
--name $(az vm list --resource-group <rgn>[sandbox resource group name]</rgn> --query [0].name -o tsv)