クイック スタート: 接続されたレジストリを IoT Edge デバイスにデプロイする

このクイック スタートでは、Azure CLI を使用して、接続されたレジストリをモジュールとして Azure IoT Edge デバイスにデプロイします。 IoT Edge デバイスは、クラウド内の親 Azure コンテナー レジストリにアクセスできます。

IoT Edge での接続済みレジストリの使用の概要については、「Azure IoT Edge で接続済みレジストリを使用する」を参照してください。 このシナリオは、IoT Edge 階層の最上位レイヤーのデバイスに対応しています。

前提条件

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

  • Azure IoT Hub と IoT Edge デバイス。 デプロイ手順については、「クイック スタート: 初めての IoT Edge モジュールを Linux 仮想デバイスにデプロイする」を参照してください。

    重要

    IoT Edge デバイスにデプロイされているモジュールに後からアクセスするには、デバイス上でポート 8000、5671、および 8883 を開いていることを確認してください。 構成手順については、「Azure portal を使用して仮想マシンへのポートを開く方法」を参照してください。

  • Azure 内のコネクテッド レジストリ リソース。 デプロイ手順については、Azure CLI または Azure portal を使用するクイック スタートを参照してください。

    • このシナリオでは、ReadWrite または ReadOnly モードのどちらの接続されたレジストリも使用できます。
    • この記事のコマンドで、接続されたレジストリの名前は CONNECTED_REGISTRY_RW という環境変数に格納されています。

クラウド レジストリにイメージをインポートする

az acr import コマンドを使用して、次のコンテナー イメージをクラウド レジストリにインポートします。 これらのイメージを既にインポートしている場合は、この手順をスキップします。

接続されたレジストリのイメージ

入れ子になった IoT Edge のシナリオをサポートするには、接続されたレジストリのランタイムのコンテナー イメージがプライベート Azure コンテナー レジストリで使用できる必要があります。 接続されたレジストリのイメージをプライベート レジストリにインポートするには、az acr import コマンドを使用します。

# Use the REGISTRY_NAME variable in the following Azure CLI commands to identify the registry
REGISTRY_NAME=<container-registry-name>

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/acr/connected-registry:0.8.0

IoT Edge と API プロキシのイメージ

入れ子になった IoT Edge で接続されたレジストリをサポートするには、IoT Edge と API プロキシのモジュールをデプロイする必要があります。 これらのイメージをプライベート レジストリにインポートします。

IoT Edge API プロキシ モジュールを使用すると、同じポート (443 など) で HTTPS プロトコルを使用して複数のサービスを公開できます。

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/azureiotedge-agent:1.2.4

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/azureiotedge-hub:1.2.4

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/azureiotedge-api-proxy:1.1.2

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/azureiotedge-diagnostics:1.2.4

Hello-world イメージ

接続されたレジストリをテストするには、hello-world イメージをインポートします。 このリポジトリは、接続されたレジストリに同期され、接続されたレジストリのクライアントによってプルされます。

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/hello-world:1.1.2

接続済みレジストリの構成を取得する

接続されたレジストリを IoT Edge デバイスにデプロイする前に、Azure 内の接続されたレジストリ リソースから構成設定を取得する必要があります。

接続されたレジストリをインストールするのに必要な設定情報を取得するには、az acr connected-registry get-settings コマンドを使用します。 次の例では、HTTPS を親プロトコルとして指定します。 親レジストリがクラウド レジストリの場合は、このプロトコルが必要です。

az acr connected-registry get-settings \
  --registry $REGISTRY_NAME \
  --name $CONNECTED_REGISTRY_RW \
  --parent-protocol https

既定では、設定情報に同期トークンのパスワードは含まれていません。接続済みレジストリをデプロイするには、これも必要です。 必要に応じて、--generate-password 1 または generate-password 2 パラメーターを渡してパスワードの 1 つを生成します。 生成されたパスワードを安全な場所に保存します。 もう一度取得することはできません。

警告

パスワードを再生成すると、同期トークンの資格情報がローテーションされます。 以前のパスワードを使用してデバイスを構成した場合は、構成を更新する必要があります。

コマンドの出力には、レジストリ接続文字列と、関連する設定が含まれます。 次の出力例は、myconnectedregistry という名前の接続されたレジストリと親レジストリ contosoregistry の接続文字列を示しています。

{
  "ACR_REGISTRY_CONNECTION_STRING": "ConnectedRegistryName=myconnectedregistry;SyncTokenName=myconnectedregistry-sync-token;SyncTokenPassword=xxxxxxxxxxxxxxxx;ParentGatewayEndpoint=contosoregistry.eastus.data.azurecr.io;ParentEndpointProtocol=https"
}

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

配置マニフェストは、IoT Edge デバイスにデプロイするモジュールを記述した JSON ドキュメントです。 詳しくは、「IoT Edge モジュールをどのように使用、構成、および再利用できるかを理解する」を参照してください。

Azure CLI を使用して接続されたレジストリおよび API プロキシ モジュールをデプロイするには、次の配置マニフェストを manifest.json ファイルとしてローカルに保存します。 コマンドを実行して構成をデバイスに適用するときには、次のセクションのファイル パスを使用します。

接続されたレジストリ モジュールの設定

  • 前のセクションのトークン資格情報と接続文字列を使用して、env ノード内の関連する JSON 値を更新します。

  • 次の環境変数は、env ノードでは省略可能です。

    変数 説明
    ACR_REGISTRY_LOGIN_SERVER 一意のホスト名または FQDN を指定します。 使用された場合、接続されたレジストリでは、このログイン サーバー値に対して行われた要求のみが受け入れられます。

    値が指定されていない場合、接続されたレジストリには、任意のログイン サーバー値を使用してアクセスできます。
    ACR_REGISTRY_CERTIFICATE_VOLUME 接続されたレジストリに HTTPS 経由でアクセスできる場合は、HTTPS 証明書が格納されているボリュームをポイントします。

    設定されていない場合、既定の場所は /var/acr/certs です。
    ACR_REGISTRY_DATA_VOLUME 接続されたレジストリによってイメージが格納される既定の場所 /var/acr/data を上書きします。

    この場所は、コンテナーのボリューム バインドと一致している必要があります。

    重要

    接続されたレジストリが 80 および 443 とは異なるポートでリッスンする場合は、ACR_REGISTRY_LOGIN_SERVER 値 (指定されている場合) にポートを含める必要があります。 例: 192.168.0.100:8080.

  • API プロキシ モジュールが使用されていない場合は、接続されたレジストリの HostPort バインドを設定する必要があります。 例:

     "createOptions": "{\"HostConfig\":{\"Binds\":[\"/home/azureuser/connected-registry:/var/acr/data\"],\"PortBindings\":{\"8080/tcp\":[{\"HostPort\":\"8080\"}]}}}"
    

API プロキシ モジュールの設定

  • API プロキシは、NGINX_DEFAULT_PORT として構成されたポート 8000 でリッスンします。 API プロキシ設定の詳細については、IoT Edge の GitHub リポジトリを参照してください。
{
    "modulesContent": {
        "$edgeAgent": {
            "properties.desired": {
                "modules": {
                    "connected-registry": {
                        "settings": {
                            "image": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io/acr/connected-registry:0.8.0",
                            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/home/azureuser/connected-registry:/var/acr/data\"]}}"
                        },
                        "type": "docker",
                        "env": {
                            "ACR_REGISTRY_CONNECTION_STRING": {
                                "value": "ConnectedRegistryName=<REPLACE_WITH_CONNECTED_REGISTRY_NAME>;SyncTokenName=<REPLACE_WITH_SYNC_TOKEN_NAME>;SyncTokenPassword=REPLACE_WITH_SYNC_TOKEN_PASSWORD;ParentGatewayEndpoint=<REPLACE_WITH_CLOUD_REGISTRY_NAME>.<REPLACE_WITH_CLOUD_REGISTRY_REGION>.data.azurecr.io;ParentEndpointProtocol=https"
                            }
                        },
                        "status": "running",
                        "restartPolicy": "always",
                        "version": "1.0"
                    },
                    "IoTEdgeAPIProxy": {
                        "settings": {
                            "image": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io/azureiotedge-api-proxy:1.1.2",
                            "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"8000/tcp\":[{\"HostPort\":\"8000\"}]}}}"
                        },
                        "type": "docker",
                        "env": {
                            "NGINX_DEFAULT_PORT": {
                                "value": "8000"
                            },
                            "CONNECTED_ACR_ROUTE_ADDRESS": {
                                "value": "connected-registry:8080"
                            },
                            "BLOB_UPLOAD_ROUTE_ADDRESS": {
                                "value": "AzureBlobStorageonIoTEdge:11002"
                            }
                        },
                        "status": "running",
                        "restartPolicy": "always",
                        "version": "1.0"
                    }
                },
                "runtime": {
                    "settings": {
                        "minDockerVersion": "v1.25",
                        "registryCredentials": {
                            "cloudregistry": {
                                "address": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io",
                                "password": "<REPLACE_WITH_SYNC_TOKEN_PASSWORD>",
                                "username": "<REPLACE_WITH_SYNC_TOKEN_NAME>"
                            }
                        }
                    },
                    "type": "docker"
                },
                "schemaVersion": "1.1",
                "systemModules": {
                    "edgeAgent": {
                        "settings": {
                            "image": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io/azureiotedge-agent:1.2.4",
                            "createOptions": ""
                        },
                        "type": "docker",
                        "env": {
                            "SendRuntimeQualityTelemetry": {
                                "value": "false"
                            }
                        }
                    },
                    "edgeHub": {
                        "settings": {
                            "image": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io/azureiotedge-hub:1.2.4",
                            "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"443/tcp\":[{\"HostPort\":\"443\"}],\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}]}}}"
                        },
                        "type": "docker",
                        "status": "running",
                        "restartPolicy": "always"
                    }
                }
            }
        },
        "$edgeHub": {
            "properties.desired": {
                "routes": {
                    "route": "FROM /messages/* INTO $upstream"
                },
                "schemaVersion": "1.1",
                "storeAndForwardConfiguration": {
                    "timeToLiveSecs": 7200
                }
            }
        }
    }
}

接続されたレジストリと API プロキシ モジュールを IoT Edge にデプロイする

次のコマンドを使用し、前のセクションで作成した配置マニフェストを使用して、接続されたレジストリと API プロキシ モジュールを IoT Edge デバイスにデプロイします。 IoT Edge の最上位レイヤー デバイスの ID と IoT Hub の名前を、示された場所に指定します。

# Set the IOT_EDGE_TOP_LAYER_DEVICE_ID and IOT_HUB_NAME environment variables for use in the following Azure CLI command
IOT_EDGE_TOP_LAYER_DEVICE_ID=<device-id>
IOT_HUB_NAME=<hub-name>

az iot edge set-modules \
  --device-id $IOT_EDGE_TOP_LAYER_DEVICE_ID \
  --hub-name $IOT_HUB_NAME \
  --content manifest.json

詳細については、「Azure CLI を使用して Azure IoT Edge モジュールをデプロイする」を参照してください。

接続されたレジストリの状態を確認するには、次の az acr connected-registry show コマンドを使用します。 接続されたレジストリの名前は、 $CONNECTED_REGISTRY_RW の値です。

az acr connected-registry show \
  --registry $REGISTRY_NAME \
  --name $CONNECTED_REGISTRY_RW \
  --output table

デプロイが正常に完了すると、接続済みレジストリで Online 状態が示されます。

次のステップ

このクイック スタートでは、接続されたレジストリを IoT Edge デバイスにデプロイする方法を学習しました。 次のガイドに進んで、新しくデプロイされた接続されたレジストリからイメージをプルする方法、または入れ子になった IoT Edge デバイス上に接続されたレジストリをデプロイする方法を学習してください。