Azure CLIを使用してIoT Edge モジュールを大規模にデプロイおよび監視する

適用対象:IoT Edge 1.6 チェックマーク IoT Edge 1.6

重要

サポートされているリリースはIoT Edge 1.6 LTSです。 IoT Edge 1.5 LTSのサポートは2026年11月10日に終了します。IoT Edge 1.4 LTSは2024年11月12日にサービス終了を迎えました。 以前のリリースを使用している場合は、「Update IoT Edgeを参照してください。

Azure CLIを使用して、Azure IoT Edge自動展開を作成し、多数のデバイスのデプロイを一度に管理します。 IoT Edgeの自動デプロイは、Azure IoT Hubの device management 機能の一部です。 デプロイを使用すると、複数のモジュールを複数のデバイスにデプロイし、モジュールの状態と正常性を追跡し、必要に応じ変更を加えます。

この記事では、Azure CLIと IoT 拡張機能を設定します。 次に、一連のIoT Edge デバイスにモジュールをデプロイし、CLI コマンドを使用して進行状況を監視します。

前提条件

  • Azure サブスクリプションの IoT ハブ

  • 1 つ以上のIoT Edge デバイス。

    IoT Edgeデバイスを設定していない場合は、Azure仮想マシンにデバイスを作成できます。 仮想 Linux デバイスの作成または 仮想Windows デバイスの作成のいずれかのクイック スタート記事の手順に従います。

  • Azure CLI が環境内にあります。 Azure CLIバージョンは 2.0.70 以降である必要があります。 az --versionを使用して確認します。 このバージョンでは、az 拡張機能のコマンドがサポートされ、Knack コマンド フレームワークが導入されています。

  • Azure CLI の IoT 拡張機能。

配置マニフェストを構成する

配置マニフェストは、デプロイするモジュール、モジュール間のデータ フロー方法、およびモジュール ツインの必要なプロパティについて説明する JSON ドキュメントです。 詳細については、モジュールをデプロイし、IoT Edgeを参照してください。

Azure CLI を使用してモジュールをデプロイするには、デプロイ マニフェストを .json ファイルとしてローカルに保存します。 次のセクションのファイル パスは、コマンドを実行してデバイスに構成を適用するときに使用します。

1 つのモジュールを例にした基本的な配置マニフェストを次に示します。

{
  "content": {
    "modulesContent": {
      "$edgeAgent": {
        "properties.desired": {
          "schemaVersion": "1.1",
          "runtime": {
            "type": "docker",
            "settings": {
              "minDockerVersion": "v1.25",
              "loggingOptions": "",
              "registryCredentials": {}
            }
          },
          "systemModules": {
            "edgeAgent": {
              "type": "docker",
              "settings": {
                "image": "mcr.microsoft.com/azureiotedge-agent:1.6",
                "createOptions": "{}"
              }
            },
            "edgeHub": {
              "type": "docker",
              "status": "running",
              "restartPolicy": "always",
              "settings": {
                "image": "mcr.microsoft.com/azureiotedge-hub:1.6",
                "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
              }
            }
          },
          "modules": {
            "SimulatedTemperatureSensor": {
              "version": "1.6",
              "type": "docker",
              "status": "running",
              "restartPolicy": "always",
              "settings": {
                "image": "mcr.microsoft.com/azureiotedge-simulated-temperature-sensor:1.6",
                "createOptions": "{}"
              }
            }
          }
        }
      },
      "$edgeHub": {
        "properties.desired": {
          "schemaVersion": "1.1",
          "routes": {
            "upstream": "FROM /messages/* INTO $upstream"
          },
          "storeAndForwardConfiguration": {
            "timeToLiveSecs": 7200
          }
        }
      },
      "SimulatedTemperatureSensor": {
        "properties.desired": {
          "SendData": true,
          "SendInterval": 5
        }
      }
    }
  }
}

このサンプル 配置マニフェストでは、IoT Edge エージェントとハブにスキーマ バージョン 1.1 を使用します。 スキーマ バージョン 1.1 は、IoT Edge バージョン 1.0.10 と共にリリースされます。 これにより、モジュールの起動順序やルートの優先順位付けなどの機能を使用できます。

多層デプロイ

階層型デプロイは、互いに積み重ねることができる自動デプロイの一種です。 階層的な展開について詳しくは、単一デバイスまたは大規模な IoT Edge の自動展開を理解するをご覧ください。

自動デプロイと同様に、Azure CLIを使用して階層化されたデプロイを作成および管理できます。いくつかの違いがあります。 階層展開を作成した後、Azure CLIは、すべてのデプロイの場合と同じように、階層化されたデプロイに対して機能します。 階層展開を作成するには、create コマンドに --layered フラグを追加します。

2 つ目の違いは、配置マニフェストの作成方法です。 標準の自動デプロイには、システム ランタイム モジュールと任意のユーザー モジュールを含める必要があります。 階層化デプロイには、ユーザー モジュールのみを含めることができます。 また、階層展開では、システム ランタイム モジュールなど、すべてのIoT Edge デバイスの必要なコンポーネントを提供するために、デバイスに標準の自動デプロイも必要です。

例として、1 つのモジュールを含む基本的な階層化配置マニフェストを次に示します。

{
  "content": {
    "modulesContent": {
      "$edgeAgent": {
        "properties.desired.modules.SimulatedTemperatureSensor": {
          "settings": {
            "image": "mcr.microsoft.com/azureiotedge-simulated-temperature-sensor:1.6",
              "createOptions": "{}"
          },
          "type": "docker",
          "status": "running",
          "restartPolicy": "always",
          "version": "1.6"
        }
      },
      "$edgeHub": {
        "properties.desired.routes.upstream": "FROM /messages/* INTO $upstream"
      },
      "SimulatedTemperatureSensor": {
        "properties.desired": {
          "SendData": true,
          "SendInterval": 5
        }
      }
    }
  }
}

この多層配置マニフェストの形式は、標準的な配置マニフェストとは若干異なります。 ランタイム モジュールの必要なプロパティは階層化されており、ドット表記を使用します。 この書式設定は、Azure ポータルが階層化されたデプロイを認識するために必要です。 次に例を示します。

  • properties.desired.modules.<module_name>
  • properties.desired.routes.<route_name>

前の例は、モジュールの properties.desired 階層展開設定を示しています。 この階層展開が、同じモジュールが既に適用されているデバイスを対象とする場合は、既存の必要なプロパティが上書きされます。 必要なプロパティを上書きするのではなく更新するには、新しいサブセクションを定義します。 次に例を示します。

"SimulatedTemperatureSensor": {
  "properties.desired.layeredProperties": {
    "SendData": true,
    "SendInterval": 5
  }
}

次の構文を使用して、同じ内容を表現することもできます。

"SimulatedTemperatureSensor": {
  "properties.desired.layeredProperties.SendData" : true,
  "properties.desired.layeredProperties.SendInterval": 5
}

現時点では、すべての階層化されたデプロイには、有効な edgeAgent オブジェクトが含まれている必要があります。 多層デプロイで更新されるのがモジュールのプロパティだけだとしても、空のオブジェクトを追加してください。 たとえば、 "$edgeAgent":{}と指定します。 空のedgeAgent オブジェクトを含む階層展開は、 モジュール ツインの対象として表示edgeAgent適用されません。

階層展開を作成するには:

  • --layered フラグを Azure CLI create コマンドに追加します。
  • システム モジュールは含めないでください。
  • $edgeAgent$edgeHubの下で完全なドット表記を使用します。

階層展開でのモジュール ツインの構成の詳細については、「 階層型デプロイ」を参照してください。

タグを使用してデバイスを識別する

展開を作成する前に、影響を与えるデバイスを指定する必要があります。 Azure IoT Edgeは、デバイス ツインで tag を使用してデバイスを識別します。

各デバイスには、対象のソリューションにとって意味のある方法で定義した複数のタグを設定することができます。 たとえば、スマート ビルのキャンパスを管理する場合は、次のタグをデバイスに追加できます。

"tags":{
  "location":{
    "building": "20",
    "floor": "2"
  },
  "roomtype": "conference",
  "environment": "prod"
}

デバイス ツインとタグの詳細については、「 IoT Hubを参照してください。

デプロイメントの作成

配置マニフェストとその他のパラメーターを含む配置を作成して、ターゲット デバイスにモジュールをデプロイします。

az iot edge deployment create コマンドを実行してデプロイを作成します。

az iot edge deployment create --deployment-id <deployment-id> --hub-name <hub-name> --content <file-path> --labels "<labels>" --target-condition "<target-query>" --priority <priority>

--layered フラグを追加して、階層化デプロイを作成します。

az iot edge deployment create コマンドでは、次のパラメーターを使用します。

  • --layered: デプロイを階層化されたデプロイとして識別する省略可能なフラグ。
  • --deployment-id: IoT ハブで作成されたデプロイの名前。 最大 128 文字の小文字で一意の名前を使用します。 スペースと無効な文字を使用しないでください: & ^ [ ] { } \ | " < > /。 このパラメーターは必須です。
  • --content: 配置マニフェスト JSON へのファイル パス。 このパラメーターは必須です。
  • --hub-name: デプロイが作成される IoT ハブの名前。 ハブは現在のサブスクリプションにある必要があります。 az account set -s <subscription-name>を実行して、現在のサブスクリプションを変更します。
  • --labels: デプロイの追跡に役立つ名前と値のペア。 ラベルでは、名前と値に JSON 形式が使用されます。 たとえば、 {"HostPlatform":"Linux", "Version":"3.0.1"}と指定します。
  • --target-condition: この展開の対象となるデバイスを決定する条件。 条件は、デバイス ツイン タグか、デバイス ツインから報告されるプロパティに基づいて指定し、式の形式に一致させる必要があります。 たとえば、 tags.environment='test' and properties.reported.devicemodel='4000x'と指定します。 ターゲット条件を指定しない場合、展開はどのデバイスにも適用されません。
  • --priority: 正の整数。 2 つ以上のデプロイが同じデバイスを対象とする場合は、優先度が最も高いデプロイが適用されます。
  • --metrics: 報告されたプロパティ edgeHub クエリを実行してデプロイの状態を追跡するメトリック。 メトリックでは、JSON 入力またはファイル パスが使用されます。 たとえば、 '{"queries": {"mymetric": "SELECT deviceId FROM devices WHERE properties.reported.lastDesiredStatus.code = 200"}}'と指定します。

Azure CLIを使用してデプロイを監視するには、「Monitor IoT Edge deployment」を参照してください。

新しいIoT Edge展開を作成すると、IoT Hubが新しい構成を処理し、対象のデバイスに新しい必要なプロパティを送信するまでに最大 5 分かかることがあります。

デプロイメントの変更

デプロイを変更すると、その変更はすべての対象デバイスに直ちにレプリケートされます。

ターゲット条件を更新すると、次の変更が発生します。

  • デバイスが古いターゲット条件を満たしていないが、新しいターゲット条件を満たしていて、この展開がそのデバイスの最も高い優先順位である場合、この展開はデバイスに適用されます。
  • 現在この展開を実行しているデバイスがターゲット条件を満たさなくなった場合、この展開はアンインストールされ、 次に優先度の高い 展開が実行されます。
  • 現在この展開を実行しているデバイスがターゲット条件を満たさなくなり、他の展開のターゲット条件を満たしていない場合、デバイスで変更は行われません。 デバイスは現在のモジュールを現在の状態で実行し続けますが、このデプロイの一部として管理されなくなります。 デバイスは、別の展開のターゲット条件を満たした後、この展開をアンインストールし、新しい展開を引き受けます。

配置マニフェストで定義されたモジュールとルートを含むデプロイの内容は更新できません。 展開の内容を更新するには、優先順位の高い同じデバイスを対象とする新しい展開を作成します。 ターゲット条件、ラベル、メトリック、優先順位など、既存のモジュールの特定のプロパティを変更できます。

az iot edge deployment update コマンドを使用してデプロイを更新します。

az iot edge deployment update --deployment-id <deployment-id> --hub-name <hub-name> --set <property1.property2='value'>

deployment update コマンドでは、次のパラメーターを使用します。

  • --deployment-id: IoT ハブ内のデプロイの名前。
  • --hub-name: デプロイが存在する IoT ハブの名前。 ハブは現在のサブスクリプションにある必要があります。 別のサブスクリプションに切り替えるには、 az account set -s <subscription-name>を実行します。
  • --set: 展開のプロパティを変更します。 次のプロパティを変更できます。
    • targetCondition (例: targetCondition=tags.location.state='Oregon')
    • labels
    • priority
  • --add: ターゲット条件やラベルを含む新しいプロパティを展開に追加します。
  • --remove: ターゲット条件やラベルを含む既存のプロパティを削除します。

デプロイメントの削除

展開を削除すると、デバイスは次に優先順位の高い展開を使用します。 デバイスが別のデプロイのターゲット条件を満たしていない場合、デプロイを削除してもモジュールは削除されません。

az iot edge deployment delete コマンドを実行してデプロイを削除します。

az iot edge deployment delete --deployment-id <deployment-id> --hub-name <hub-name>

deployment delete コマンドでは、次のパラメーターを使用します。

  • --deployment-id。IoT ハブに存在するデプロイの名前。
  • --hub-name。 デプロイが存在する IoT ハブの名前。 ハブは現在のサブスクリプションにある必要があります。 コマンド az account set -s [subscription name]を使用して、目的のサブスクリプションに切り替えます。

次のステップ

IoT Edge デバイスへのモジュールのデプロイについて説明します。