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

適用対象:IoT Edge 1.4 checkmark IoT Edge 1.4

重要

IoT Edge 1.4 がサポートされているリリースです。 以前のリリースの場合は、「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」を参照してください。

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 aziot-edged

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

[Service]
Environment="https_proxy=<proxy URL>"

バージョン 1.2 以降の IoT Edge では、IoT Hub または IoT Hub Device Provisioning Service でのデバイスのプロビジョニングを処理するために、IoT ID サービスが使用されます。 ターミナルでエディターを開き、IoT ID サービス デーモンを構成します。

sudo systemctl edit aziot-identityd

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

[Service]
Environment="https_proxy=<proxy URL>"

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

sudo systemctl daemon-reload

両方のデーモンに対する変更を有効にするには、IoT Edge システム サービスを再起動します。

sudo iotedge system restart

環境変数と新しい構成が存在することを確認します。

systemctl show --property=Environment aziot-edged
systemctl show --property=Environment aziot-identityd

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 デバイスで、構成ファイル /etc/aziot/config.toml を開きます。 構成ファイルにアクセスするには、管理者特権が必要です。 Linux システムの場合、好みのテキスト エディターでファイルを開く前に sudo コマンドを使用します。

  2. 構成ファイルで、[agent] セクションを見つけます。ここには、edgeAgent モジュールが起動時に使用するすべての構成情報が含まれています。 [agent] セクションにコメントがないことを確認します。 [agent] セクションがない場合は config.toml に追加します。 IoT Edge エージェント定義には、環境変数を追加できる [agent.env] サブセクションが含まれています。

  3. 環境変数セクションに 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>"
    
  4. 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>"
    
  5. 環境変数セクションに 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>"
    
  6. 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>"
    
  7. 変更を保存してエディターを閉じます。 最新の変更を適用します。

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

    sudo docker rm -f edgeAgent
    
  9. 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]\(ランタイムの設定\) を選択します。

Screenshot of how to configure advanced Edge Runtime settings.

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

Screenshot of how to set the https_proxy environment variable.

配置マニフェストに追加する他のモジュールはすべて、同じパターンに従います。 適用を選択して、変更を保存します。

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

Visual Studio Code のテンプレートを使用するか、または手動で JSON ファイルを作成して、IoT Edge デバイスの配置を作成した場合、各モジュール定義に環境変数を直接追加できます。 Azure portal で追加しなかった場合は、ここで JSON マニフェスト ファイルに追加します。 <proxy URL> は、実際の値に置き換えてください。

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

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

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

"edgeHub": {
    "type": "docker",
    "settings": {
        "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
        "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 での一般的な問題と解決」でインストールと構成に関するエラーをトラブルシューティングする