IoT Edge デバイスを構成してプロキシ サーバー経由で通信する

適用対象: [はい] アイコン IoT Edge 1.1

重要

IoT Edge 1.1 のサポート終了日は、2022 年 12 月 13 日でした。 本製品、サービス、テクノロジ、または API のサポート内容については、Microsoft 製品のライフサイクルに関するページをご確認ください。 最新バージョンの IoT Edge への更新の詳細については、「 Update IoT Edge」を参照してください。

IoT Edge デバイスでは、HTTPS 要求を送信して IoT Hub と通信します。 お使いのデバイスがプロキシ サーバーを使用するネットワークに接続されている場合、IoT Edge ランタイムを構成してサーバー経由で通信する必要があります。 また、プロキシ サーバーは、IoT Edge ハブ経由でルーティングされない HTTP または HTTPS 要求を行った場合、個々 の IoT Edge モジュールに影響を及ぼす可能性があります。

この記事では、プロキシ サーバーの内側で IoT Edge デバイスを構成して管理する以下の 4 つの手順について説明します。

  1. デバイスに IoT Edge ランタイムをインストールする

    IoT Edge のインストール スクリプトによってインターネットからパッケージとファイルが取得されるので、デバイスではこれらの要求を行うためにプロキシ サーバーを介して通信する必要があります。 Windows デバイスの場合、インストール スクリプトにはオフライン インストール オプションもあります。

    この手順は、最初に設定するときに IoT Edge デバイスを構成するための 1 回限りのプロセスです。 IoT Edge ランタイムを更新するときにも同じ接続が必要です。

  2. デバイスで IoT Edge とコンテナー ランタイムを構成する

    IoT Edge は、IoT Hub との通信を担当します。 コンテナー ランタイムはコンテナー管理を担当しているため、コンテナー レジストリと通信します。 これらのコンポーネントはいずれも、プロキシ サーバー経由で Web 要求を行う必要があります。

    この手順は、最初に設定するときに IoT Edge デバイスを構成するための 1 回限りのプロセスです。

  3. デバイス上の構成ファイルで IoT Edge エージェントのプロパティを構成する

    IoT Edge デーモンでは、最初に edgeAgent モジュールの起動が行われます。 次に、edgeAgent モジュールによって IoT Hub から配置マニフェストが取得され、他のすべてのモジュールの起動が行われます。 IoT Edge エージェントが IoT Hub に初めて接続するには、デバイス上で手動で edgeAgent モジュールの環境変数を構成します。 最初の接続後は、edgeAgent モジュールをリモートで構成できます。

    この手順は、最初に設定するときに IoT Edge デバイスを構成するための 1 回限りのプロセスです。

  4. 今後のすべてのモジュールのデプロイのために、プロキシ経由で通信するすべてのモジュールの環境変数を設定する

    IoT Edge デバイスが設定され、プロキシ サーバー経由で IoT Hub に接続されたら、今後すべてのモジュールのデプロイで接続を維持する必要があります。

    この手順は、リモートで実行される継続的なプロセスです。これにより、すべての新しいモジュールで、またはデプロイの更新ごとに、プロキシ サーバー経由で通信するデバイスの機能が維持されます。

プロキシの URL を確認する

この記事の手順を始める前に、プロキシ URL について理解しておく必要があります。

プロキシ URL の形式は、protocol://proxy_host:proxy_port です。

  • protocol は HTTP または HTTPS のいずれかです。 Docker デーモンはコンテナー レジストリの設定に応じてどちらのプロトコルも使用できますが、IoT Edge デーモンとランタイム コンテナーは常に HTTP を使用してプロキシに接続する必要があります。

  • proxy_host は、プロキシ サーバーのアドレスです。 プロキシ サーバーで認証が必要な場合は、プロキシ ホストの一部として、user:password@proxy_host の形式で資格情報を指定できます。

  • proxy_port は、ネットワーク トラフィックにプロキシが応答するネットワーク ポートです。

プロキシ経由で IoT Edge をインストールする

IoT Edge デバイスが Windows または Linux のどちらで動作している場合でも、プロキシ サーバー経由でインストール パッケージにアクセスする必要があります。 オペレーティング システムに応じて、プロキシ サーバー経由で IoT Edge ランタイムをインストールする手順を実行します。

Linux デバイス

Linux デバイス上に IoT Edge ランタイムをインストールしている場合、プロキシ サーバーを経由してインストール パッケージにアクセスするように、パッケージ マネージャーを構成します。 たとえば、http-proxy を使用するように apt-get を設定します。 パッケージ マネージャーが構成されたら、通常どおり「Azure IoT Edge ランタイムをインストールする」の手順に従います。

IoT Edge for Linux on Windows を使用する Windows デバイス

IoT Edge for Linux on Windows を使用して IoT Edge ランタイムをインストールする場合は、Linux 仮想マシンに IoT Edge が既定でインストールされます。 追加のインストールまたは更新の手順は必要ありません。

Windows コンテナーを使用する Windows デバイス

Windows デバイス上に IoT Edge ランタイムをインストールしている場合、プロキシ サーバーを 2 回通過する必要があります。 最初の接続では、インストーラー スクリプト ファイルをダウンロードするためのもので、2 回目の接続はインストール中に必要なコンポーネントをダウンロードします。 Windows 設定でプロキシ情報を構成するか、または PowerShell コマンドにプロキシ情報を直接含めることができます。

以下の手順は、-proxy 引数を使用した Windows インストールの例です。

  1. Invoke-WebRequest コマンドは、インストーラー スクリプトにアクセスするためにプロキシ情報が必要です。 次に、Deploy-IoTEdge コマンドで、インストール ファイルをダウンロードするためにプロキシ情報が必要になります。

    . {Invoke-WebRequest -proxy <proxy URL> -useb aka.ms/iotedge-win} | Invoke-Expression; Deploy-IoTEdge -proxy <proxy URL>
    
  2. Initialize IoTEdge コマンドはプロキシ サーバーを経由する必要がないため、2 番目の手順では、Invoke-WebRequest のプロキシ情報のみが必要になります。

    . {Invoke-WebRequest -proxy <proxy URL> -useb aka.ms/iotedge-win} | Invoke-Expression; Initialize-IoTEdge
    

プロキシ サーバーの資格情報が複雑で URL に含めることができない場合は、-InvokeWebRequestParameters 内で -ProxyCredential パラメーターを使用してください。 たとえば、 にします。

$proxyCredential = (Get-Credential).GetNetworkCredential()
. {Invoke-WebRequest -proxy <proxy URL> -ProxyCredential $proxyCredential -useb aka.ms/iotedge-win} | Invoke-Expression; `
Deploy-IoTEdge -InvokeWebRequestParameters @{ '-Proxy' = '<proxy URL>'; '-ProxyCredential' = $proxyCredential }

プロキシのパラメーターについて詳しくは、「Invoke-WebRequest」を参照してください。 Windows インストール パラメーターの詳細については、「Windows 上の IoT Edge 用の PowerShell スクリプト」を参照してください。

IoT Edge と Moby を構成する

IoT Edge は、IoT Edge デバイス上で実行されている 2 つのデーモンに依存しています。 Moby デーモンは、コンテナー レジストリからコンテナー イメージをプルするための Web 要求を行います。 IoT Edge デーモンは、IoT Hub と通信するための Web 要求を行います。

Moby と IoT Edge の両方のデーモンは、継続的なデバイス機能のためにプロキシ サーバーを使用するように構成する必要があります。 この手順は、デバイスの初期設定中に IoT Edge デバイス上で行われます。

Moby デーモン

Moby は Docker 上に構築されるため、環境変数を使用して Moby デーモンを構成するには、Docker のドキュメントを参照してください。 ほとんどのコンテナー レジストリ (DockerHub および Azure Container Registry を含む) では HTTPS 要求をサポートしているので、設定する必要があるパラメーターは HTTPS_PROXY です。 トランスポート層セキュリティ (TLS) をサポートしていないレジストリからイメージをプルしている場合は、HTTP_PROXY パラメーターを設定する必要があります。

お使いの IoT Edge デバイス オペレーティング システムに該当する記事を選択します。

IoT Edge デーモン

IoT Edge デーモンは、Moby デーモンとほぼ同じ方法で構成されています。 お使いのオペレーティング システムに基づいて、次の手順に従って、サービス用に環境変数を設定します。

IoT Edge デーモンは、常に HTTPS を使用して IoT Hub に要求を送信します。

Linux

IoT Edge デーモンを構成するために、ターミナルでエディターを開きます。

sudo systemctl edit iotedge

次のテキストを入力して、<proxy URL> をお使いのプロキシ サーバーのアドレスとポートに置き換えます。 その後、保存して終了します。

[Service]
Environment=https_proxy=<proxy URL>

サービス マネージャーを更新して、IoT Edge 用の新しい構成を選択します。

sudo systemctl daemon-reload

IoT Edge を再起動して、変更を有効にします。

sudo systemctl restart iotedge

環境変数が作成され、新しい構成が読み込まれたことを確認します。

systemctl show --property=Environment iotedge

IoT Edge for Linux on Windows を使用する Windows

IoT Edge for Linux on Windows 仮想マシンにログインします。

Connect-EflowVm

上記の Linux セクションと同じ手順に従って、IoT Edge デーモンを構成します。

Windows コンテナーを使用する Windows

管理者として PowerShell ウィンドウを開き、次のコマンドを実行して、新しい環境変数でレジストリを編集します。 <proxy url> をお使いのプロキシ サーバーのアドレスとポートに置き換えます。

reg add HKLM\SYSTEM\CurrentControlSet\Services\iotedge /v Environment /t REG_MULTI_SZ /d https_proxy=<proxy URL>

IoT Edge を再起動して、変更を有効にします。

Restart-Service iotedge

IoT Edge エージェントを構成する

IoT Edge エージェントは、すべての IoT Edge デバイス上で最初に起動するモジュールです。 最初は、IoT Edge 構成ファイルの情報に基づいて起動されます。 その後、IoT Edge エージェントは IoT Hub に接続して、デバイスへの配置が必要な他のモジュールを宣言する配置マニフェストを取得します。

この手順は、デバイスの初期設定中に IoT Edge デバイス上で 1 回行われます。

  1. お使いの IoT Edge デバイス上で、config.yaml ファイルを開きます。 Linux システムの場合、このファイルは /etc/iotedge/config.yaml に配置されています。 Windows システムの場合、このファイルは C:\ProgramData\iotedge\config.yaml に配置されています。 構成ファイルは保護されているため、アクセスするには管理者権限が必要です。 Linux システムの場合、好みのテキスト エディターでファイルを開く前に sudo コマンドを使用します。 Windows の場合、管理者としてメモ帳などのテキスト エディターを開いてから、ファイルを開きます。

  2. config.yaml ファイルで、Edge Agent module spec セクションを探します。 IoT Edge エージェント定義には、環境変数を追加できる env パラメーターが組み込まれています。

  3. env パラメーターのプレースホルダ―である中かっこを削除して、新しい行に新しい変数を追加します。 YAML では、インデントはスペース 2 つであることに注意してください。

    https_proxy: "<proxy URL>"
    
  4. IoT Edge ランタイムでは既定で、AMQP を使用して IoT Hub と通信します。 一部のプロキシ サーバーでは、AMQP ポートをブロックします。 この場合は、WebSocket 経由で AMQP を使用するように、edgeAgent を構成することも必要になります。 2 番目の環境変数を追加します。

    UpstreamProtocol: "AmqpWs"
    

    環境変数を使用した edgeAgent 定義

  5. config.yaml への変更を保存して、エディターを閉じます。 IoT Edge を再起動して、変更を有効にします。

    • Linux と IoT Edge for Linux on Windows:

      sudo systemctl restart iotedge
      
    • Windows コンテナーを使用する Windows:

      Restart-Service iotedge
      
  1. 環境変数セクションに https_proxy パラメーターを追加し、その値としてプロキシ URL を設定します。

    [agent]
    name = "edgeAgent"
    type = "docker"
    
    [agent.config]
    image = "mcr.microsoft.com/azureiotedge-agent:1.4"
    
    [agent.env]
    # "RuntimeLogLevel" = "debug"
    # "UpstreamProtocol" = "AmqpWs"
    "https_proxy" = "<proxy URL>"
    
  2. IoT Edge ランタイムでは既定で、AMQP を使用して IoT Hub と通信します。 一部のプロキシ サーバーでは、AMQP ポートをブロックします。 この場合は、WebSocket 経由で AMQP を使用するように、edgeAgent を構成することも必要になります。 UpstreamProtocol パラメーターをコメント解除します。

    [agent.config]
    image = "mcr.microsoft.com/azureiotedge-agent:1.4"
    
    [agent.env]
    # "RuntimeLogLevel" = "debug"
    "UpstreamProtocol" = "AmqpWs"
    "https_proxy" = "<proxy URL>"
    
  3. 変更を保存してエディターを閉じます。 最新の変更を適用します。

    sudo iotedge config apply
    
  4. Envセクションでdocker inspect edgeAgentを使用してプロキシ設定が反映されていることを確認します。 そうでない場合は、コンテナーを再作成する必要があります。

    sudo docker rm -f edgeAgent
    
  5. IoT Edge ランタイムは 1 分以内にedgeAgentを再作成する必要があります。 いったんedgeAgentコンテナーが再実行されると、docker inspect edgeAgent、また、プロキシ設定が構成ファイルにマッチするのを確認します。

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

プロキシ サーバーを利用するように IoT Edge デバイスが構成されたら、以降のデプロイ マニフェストでも引き続き、HTTPS_PROXY 環境変数を宣言する必要があります。 配置マニフェストを編集するには、Azure portal ウィザードを使用するか、配置マニフェストの JSON ファイルを編集します。

edgeAgent と edgeHub の 2 つのランタイム モジュールは、IoT Hub との接続を維持できるよう、必ずプロキシ サーバー経由で通信するように構成してください。 edgeAgent モジュールからプロキシ情報を削除した場合、前のセクションで説明したように、接続を再確立する唯一の方法は、デバイス上の構成ファイルを編集することです。

edgeAgent モジュールと edgeHub モジュールに加えて、他のモジュールにはプロキシ構成が必要になる場合があります。 BLOB ストレージなど、IoT Hub に加えて Azure リソースにアクセスする必要があるモジュールには、デプロイ マニフェスト ファイルで HTTPS_PROXY 変数が指定されている必要があります。

次の手順は、IoT Edge デバイスの有効期間を通して適用できます。

Azure Portal

モジュールの設定ウィザードを使用して IoT Edge デバイスの配置を作成する場合は、どのモジュールにも [環境変数] セクションがあり、ここでプロキシ サーバー接続を構成できます。

IoT Edge エージェントおよび IoT Edge ハブ モジュールを構成するには、ウィザードの最初の手順で [Runtime Settings]\(ランタイムの設定\) を選択します。

Edge ランタイムの詳細設定を構成する

IoT Edge エージェントおよび IoT Edge ハブ モジュールの両方の定義に、https_proxy 環境変数を追加します。 お使いの IoT Edge デバイス上の構成ファイルに UpstreamProtocol 環境変数を含めた場合は、IoT Edge エージェント モジュールの定義にもこの環境変数を追加します。

https_proxy environment 変数を設定する

配置マニフェストに追加する他のモジュールはすべて、同じパターンに従います。

JSON 配置マニフェスト ファイル

Visual Studio Code のテンプレートを使用するか、または手動で JSON ファイルを作成して、IoT Edge デバイスの配置を作成した場合、各モジュール定義に環境変数を直接追加できます。

次の JSON 形式を使用します。

"env": {
    "https_proxy": {
        "value": "<proxy URL>"
    }
}

環境変数が含まれる場合、モジュール定義は次の edgeHub 例のようになります。

"edgeHub": {
    "type": "docker",
    "settings": {
        "image": "mcr.microsoft.com/azureiotedge-hub:1.1",
        "createOptions": "{}"
    },
    "env": {
        "https_proxy": {
            "value": "http://proxy.example.com:3128"
        }
    },
    "status": "running",
    "restartPolicy": "always"
}

お使いの IoT Edge デバイス上の config.yaml ファイルに UpstreamProtocol 環境変数を含めた場合は、IoT Edge エージェント モジュールの定義にもこの環境変数を追加します。

"env": {
    "https_proxy": {
        "value": "<proxy URL>"
    },
    "UpstreamProtocol": {
        "value": "AmqpWs"
    }
}

トラフィック検査プロキシの使用

Zscaler のような一部のプロキシでは、TLS で暗号化されたトラフィックを検査できます。 TLS トラフィックの検査中にプロキシによって返される証明書は、ターゲット サーバーからの証明書ではなく、プロキシの独自のルート証明書によって署名された証明書です。 既定では、このプロキシの証明書は IoT Edge モジュール (edgeAgentedgeHub を含む) によって信頼されておらず、TLS ハンドシェイクは失敗します。

これを解決するには、プロキシのルート証明書がオペレーティング システムと IoT Edge モジュールの両方で信頼されている必要があります。

  1. ホスト オペレーティング システムの信頼されたルート証明書ストアでプロキシ証明書を構成します。 ルート証明書をインストールする方法の詳細については、「ルート CA を OS 証明書ストアにインストールする」を参照してください。

  2. 信頼バンドル内の証明書を参照して、プロキシ サーバー経由で通信するように IoT Edge デバイスを構成します。 信頼バンドルを構成する方法の詳細については、「信頼されたルート CA (信頼バンドル) を管理する」を参照してください。

IoT Edge によって管理されていないコンテナーに対してトラフィック検査プロキシのサポートを構成するには、プロキシ プロバイダーにお問い合わせください。

IoT Edge が通信する宛先の完全修飾ドメイン名 (FQDN)

プロキシにファイアウォールがあり、インターネット接続のためのすべての FQDN を許可リストに登録する必要がある場合は、「IoT Edge デバイスからの接続を許可する」の一覧で、追加する FQDN を確認してください。

次のステップ

IoT Edge ランタイムのロールに関する詳細を確認する

Azure IoT Edge での一般的な問題と解決」でインストールと構成に関するエラーをトラブルシューティングする