演習 - 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 を開き、コンテナー レジストリのフィルター モジュールを使用するように更新します。

  1. 3 箇所の <YOUR CONTAINER REGISTRY NAME> を、コンテナー レジストリの名前に置き換えます。 edgecentral27912 のような名前です。
  2. <YOUR CONTAINER REGISTRY PASSWORD> を、このユニットで前に記録したパスワードに置き換える。
  3. 変更を保存します。

このバージョンの配置マニフェスト:

  • 作成した 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\")"
      },
    

新しい配置マニフェストをアップロードするには:

  1. Azure IoT Central アプリケーションで、[Edge マニフェスト] に移動し、[環境センサー] マニフェストを選択します。

  2. [カスタマイズ] ページで、新しい EnvironmentalSensorManifestFilter-1-4.json ファイルをアップロードします。 [次へ] を選択します。

  3. [確認と完了] ページには、新しい filterfunction モジュールが表示されます。 [保存] を選択します。

  4. [デバイス] ページから [環境センサー エッジ デバイス] - store-001 デバイスに移動し、[モジュール] を選択します。

  5. ページの上部付近で、[マニフェストの管理] > [エッジ マニフェストの割り当て] を選択します。 [環境センサー] マニフェストを選択し、[マニフェストの割り当て] を選択します。

モジュールの一覧に、実行中の filterfunction モジュールが含まれるようになりました。

IoT Edge デバイスで実行されている FilterFunction モジュールを示すスクリーンショット。

新しいモジュールを使用するようにデバイス テンプレートを更新する

現在、IoT Edge デバイスにより、テレメトリ インターフェイスではなく filterfunction インターフェイスを介してテレメトリが送信されています。 そのため、デバイス テンプレートとビューを更新する必要があります。

  1. [デバイス テンプレート] ページで、[環境センサー エッジ デバイス] を選択します。

  2. [モジュール] を選択し、次に [マニフェストからモジュールをインポートする] を選びます。

    マニフェストからモジュールをインポートする方法を示すスクリーンショット。

  3. [モジュールのインポート] ダイアログで、[環境センサー] を選択してから、[インポート] を選びます。

デバイス テンプレートに追加された FilterFunction モジュールを示すスクリーンショット。

新しいモジュールによってテレメトリが Azure IoT Central に送信されるようになりました。 次に、テレメトリを指定してグラフを更新するインターフェイスを新しいフィルター モジュールに追加します。

  1. Module FilterFunction を選択し、[+ 継承されたインターフェイスの追加] を選択します。 このオプションを表示するには、省略記号 (...) を選択する必要がある場合があります。
  2. [インターフェイスのインポート] タイルを選択します。 前にダウンロードした TelemetryInterfaceFilter.json ファイルを選択します。

SimulatedTemperatureModule はテレメトリを Azure IoT Central に直接送信しなくなったため、元の Telemetry インターフェイスを削除できます。 このモジュールからの出力は、IoT Edge ランタイムによって FilterFunction モジュールにルーティングされます。

  1. SimulatedTemperatureSensor モジュールで Telemetry インターフェイスを選択します。
  2. [削除] を選択し、操作を確認します。

[IoT Edge デバイス テレメトリの表示] ビューを変更して、FilterFunction モジュールによって送信されたテレメトリを表示します。

  1. デバイス テンプレートで View IoT Edge device telemetry ビューを選択し、グラフ タイルの [編集] オプションを選択します。
  2. ambient/temperaturehumiditymachine/temperaturepressure の各テレメトリ値を追加します。
  3. [更新][保存] の順に選択します。
  4. [発行] を選択して、デバイス テンプレートの新しいバージョンを発行します。

作業を確認

IoT Edge デバイスからフィルター処理されたテレメトリを表示するには:

  1. [デバイス] ページで、store-001 デバイスを選択します。

  2. View IoT Edge device telemetry ビューを選択します。

    グラフでフィルター処理されたテレメトリを確認できます。 平均環境温度が 21.0 度未満の値は表示されません。

    21 未満の平均環境温度の値が含まれないテレメトリ プロットを示すスクリーンショット。

デバイスがテレメトリの送信を停止したように見える場合は、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)