Azure Stack Edge 上の Ubuntu VM に IoT Edge をデプロイする

適用対象:Yes for Pro GPU SKUAzure Stack Edge Pro - GPUYes for Pro 2 SKUAzure Stack Edge Pro 2Yes for Pro R SKUAzure Stack Edge Pro RYes for Mini R SKUAzure Stack Edge Mini R

この記事では、Azure Stack Edge デバイスで稼働している Ubuntu VM に IoT Edge ランタイムをデプロイする方法について説明します。 新規の開発作業の場合は、この記事で説明されるセルフサービスのデプロイ方法が最新のソフトウェア バージョンを使用するため、この方法を使用してください。

大まかな流れ

フローの概要は次のとおりです。

  1. IoT Hub または Azure IoT Hub Device Provisioning Service (DPS) インスタンスを作成または識別します。
  2. Azure CLI を使用して Ubuntu 20.04 LTS VM イメージを取得します。
  3. Ubuntu イメージを Azure Stack Edge VM イメージ ライブラリにアップロードします。
  4. 次の手順を使用して、Ubuntu イメージを VM としてデプロイします。
    1. VM の名前、ユーザー名、パスワードを指定します。 別のディスクの作成は省略可能です。
    2. ネットワーク構成を設定します。
    3. [詳細設定] タブで準備された cloud-init スクリプトを指定します。

前提条件

開始する前に、以下の項目があることを確認します:

  • 有効化した Azure Stack Edge デバイス。 詳細の手順については、「Azure Stack Edge Pro GPU を有効化する」を参照してください。

  • 最新の Ubuntu 20.04 VM イメージ (Azure Marketplace のイメージまたは取り込むカスタム イメージ) にアクセスします。

    $urn = Canonical:0001-com-ubuntu-server-focal:20_04-lts:20.04.202007160

    Azure Marketplace イメージを検索する」の手順を使用して、VM イメージを取得します。

cloud-init スクリプトを準備する

IoT Edge ランタイムを Ubuntu VM にデプロイするには、VM のデプロイ中に cloud-init スクリプトを使用します。

次のいずれかのセクションにある手順を使用します。

対称キーのプロビジョニングを使用する

DPS を使用せずにデバイスを IoT Hub に接続するには、このセクションの手順を使用して、VM 作成の [詳細設定] ページに cloud-init スクリプトを準備し、IoT Edge ランタイムと Nvidia のコンテナー ランタイムをデプロイします。

  1. 既存の IoT Hub を使用するか、新しい Hub を作成します。 IoT Hub を作成するには次の手順に従います。

  2. IoT Hub に Azure Stack Edge デバイスを登録するには次の手順に従います。

  3. デバイスの IoT Hub からプライマリ接続文字列を取得し、[DeviceConnectionString] の下の場所に貼り付けます。

対称キー プロビジョニング用の cloud-init スクリプト


#cloud-config

runcmd:
  - dcs="<DeviceConnectionString>"
  - |
      set -x
      (

        # Wait for docker daemon to start

        while [ $(ps -ef | grep -v grep | grep docker | wc -l) -le 0 ]; do 
          sleep 3
        done
        
        if [ $(lspci | grep NVIDIA | wc -l) -gt 0 ]; then

          #install Nvidia drivers

          apt install -y ubuntu-drivers-common
         ubuntu-drivers devices
          ubuntu-drivers autoinstall

          # Install NVIDIA Container Runtime

          curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | apt-key add -
          distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
          curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | tee /etc/apt/sources.list.d/nvidia-container-runtime.list
          apt update
          apt install -y nvidia-container-runtime
        fi
        
        # Restart Docker

        systemctl daemon-reload
        systemctl restart docker

        # Install IoT Edge

        apt install -y aziot-edge

        if [ ! -z $dcs ]; then
          iotedge config mp --connection-string $dcs
          iotedge config apply
        fi
      if [ $(lspci | grep NVIDIA | wc -l) -gt 0 ]; then      
         reboot
      fi       ) &

apt:
  preserve_sources_list: true
  sources:
    msft.list:
      source: "deb https://packages.microsoft.com/ubuntu/20.04/prod focal main"
      key: |
        -----BEGIN PGP PUBLIC KEY BLOCK-----
        Version: GnuPG v1.4.7 (GNU/Linux)

        mQENBFYxWIwBCADAKoZhZlJxGNGWzqV+1OG1xiQeoowKhssGAKvd+buXCGISZJwT
        LXZqIcIiLP7pqdcZWtE9bSc7yBY2MalDp9Liu0KekywQ6VVX1T72NPf5Ev6x6DLV
        7aVWsCzUAF+eb7DC9fPuFLEdxmOEYoPjzrQ7cCnSV4JQxAqhU4T6OjbvRazGl3ag
        OeizPXmRljMtUUttHQZnRhtlzkmwIrUivbfFPD+fEoHJ1+uIdfOzZX8/oKHKLe2j
        H632kvsNzJFlROVvGLYAk2WRcLu+RjjggixhwiB+Mu/A8Tf4V6b+YppS44q8EvVr
        M+QvY7LNSOffSO6Slsy9oisGTdfE39nC7pVRABEBAAG0N01pY3Jvc29mdCAoUmVs
        ZWFzZSBzaWduaW5nKSA8Z3Bnc2VjdXJpdHlAbWljcm9zb2Z0LmNvbT6JATUEEwEC
        AB8FAlYxWIwCGwMGCwkIBwMCBBUCCAMDFgIBAh4BAheAAAoJEOs+lK2+EinPGpsH
        /32vKy29Hg51H9dfFJMx0/a/F+5vKeCeVqimvyTM04C+XENNuSbYZ3eRPHGHFLqe
        MNGxsfb7C7ZxEeW7J/vSzRgHxm7ZvESisUYRFq2sgkJ+HFERNrqfci45bdhmrUsy
        7SWw9ybxdFOkuQoyKD3tBmiGfONQMlBaOMWdAsic965rvJsd5zYaZZFI1UwTkFXV
        KJt3bp3Ngn1vEYXwijGTa+FXz6GLHueJwF0I7ug34DgUkAFvAs8Hacr2DRYxL5RJ
        XdNgj4Jd2/g6T9InmWT0hASljur+dJnzNiNCkbn9KbX7J/qK1IbR8y560yRmFsU+
        NdCFTW7wY0Fb1fWJ+/KTsC4=
        =J6gs
        -----END PGP PUBLIC KEY BLOCK----- 
packages:
  - moby-cli
  - moby-engine
write_files:
  - path: /etc/systemd/system/docker.service.d/override.conf
    permissions: "0644"
    content: |
      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime --log-driver local

DPS を使用する

デバイスを DPS および IoT Central に接続するには、このセクションの手順を使用します。 VM を作成するときに IoT Edge ランタイムをデプロイするための script.sh ファイルを準備します。

  1. 既存の IoT Hub と DPS を使用するか、新しい IoT Hub を作成します。

  2. DPS リソースに移動し、個々の登録を作成します。 

    1. [デバイス プロビジョニング サービス]>[登録の管理]>[個々の登録の追加] を選択します。
    2. [構成証明の種類と IoT Edge デバイスの対称キー][True] が選択されていることを確認します。 既定では [False] が選択されています。
    3. DPS リソース ページから次の情報を取得します。
      • 登録 ID。 IoT Hub のデバイス ID と同じ ID を使用することをお勧めします。
      • [概要] メニューで使用できる ID スコープ
      • [個別登録] メニューのプライマリ SAS キー
  3. IoT Hub (ID スコープ) と DPS (登録 ID、対称キー) の値をコピーして、スクリプト引数に貼り付けます。

IoT Hub DPS 用 cloud-init スクリプト


#cloud-config

runcmd:
    - dps_idscope="<DPS IDScope>"
    - registration_device_id="<RegistrationID>"
    - key="<Symmetric Key>"
    - |
      set -x
      (
      
      wget https://github.com/Azure/iot-edge-config/releases/latest/download/azure-iot-edge-installer.sh -O azure-iot-edge-installer.sh \
      && chmod +x azure-iot-edge-installer.sh \
      && sudo -H ./azure-iot-edge-installer.sh -s $dps_idscope -r $registration_device_id -k $key \
      && rm -rf azure-iot-edge-installer.sh
      
      # Wait for docker daemon to start

      while [ $(ps -ef | grep -v grep | grep docker | wc -l) -le 0 ]; do 
        sleep 3
      done

      systemctl stop aziot-edge

      if [ $(lspci | grep NVIDIA | wc -l) -gt 0 ]; then

        #install Nvidia drivers

        apt install -y ubuntu-drivers-common
        ubuntu-drivers devices
        ubuntu-drivers autoinstall

        # Install NVIDIA Container Runtime

        curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | apt-key add -
        distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
        curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | tee /etc/apt/sources.list.d/nvidia-container-runtime.list
        apt update
        apt install -y nvidia-container-runtime
      fi

      # Restart Docker

      systemctl daemon-reload
      systemctl restart docker

      systemctl start aziot-edge    
      if [ $(lspci | grep NVIDIA | wc -l) -gt 0 ]; then      
         reboot
      fi
      ) &
write_files:
  - path: /etc/systemd/system/docker.service.d/override.conf
    permissions: "0644"
    content: |
      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime --log-driver local

IoT Edge ランタイムをデプロイする

IoT Edge ランタイムをデプロイすることは、上記の cloud-init スクリプトを使用して VM を作成する操作の一部です。

VM と IoT Edge ランタイムをデプロイする手順の概要を次に示します。

  1. Azure Marketplace から Ubuntu VM イメージを取得します。 詳細な手順については、「Azure Marketplace イメージを使用して Azure Stack Edge 用の VM イメージを作成する」の手順に従います。

    1. Azure portal で Azure Marketplace に移動します。
    2. Azure CLI がインストールされている Azure Cloud Shell またはクライアントに接続します。 詳細な手順については、「Azure Cloud Shell での Bash のクイックスタート」を参照してください。

    Note

    シェル セッションを閉じると、シェル セッション中に作成されたすべての変数が削除されます。 セッションをもう一度開くには、変数を再作成する必要があります。

    c. 次のコマンドを実行して、サブスクリプションを設定します。

    az account set –subscription <subscription id>
    
  2. Azure Marketplace イメージを検索する」の手順を使用して、Azure Marketplace で Ubuntu 20.04 LTS イメージを検索します。

    Ubuntu 20.04 LTS イメージの例:

    $urn = Canonical:0001-com-ubuntu-server-focal:20_04-lts:20.04.202007160
    
  3. Marketplace イメージから新しいマネージド ディスクを作成します。 詳細な手順については、「Azure Marketplace イメージを使用して Azure Stack Edge 用の VM イメージを作成する」を参照してください。

  4. マネージド ディスクから Azure Storage アカウントに VHD をエクスポートします。 詳細な手順については、「マネージド ディスクから Azure Storage に VHD をエクスポートする」を参照してください。

  5. VM イメージを使用して Ubuntu VM を作成するには、次の手順に従います。

    1. [詳細設定] タブで cloud-init スクリプトを指定します。VM を作成するには、「Azure portal 経由で GPU VM をデプロイする」または「Azure portal 経由で VM をデプロイする」を参照してください。

      Screenshot of the Advanced tab of VM configuration in the Azure portal.

    2. cloud-init で適切なデバイス接続文字列を指定して、IoT Hub または DPS デバイスに接続します。 詳細な手順については、「対称キーを使用したプロビジョニング」または「IoT Hub DPS を使用したプロビジョニング」を参照してください。

      Screenshot of the Custom data field of VM configuration in the Azure portal.

VM の作成時に cloud-init を指定しなかった場合は、VM の作成後に IoT Edge ランタイムを手動でデプロイする必要があります。

  1. SSH 経由で VM に接続します。
  2. VM にコンテナー エンジンをインストールします。 詳細な手順については、「対称キーを使用して Linux 上に IoT Edge デバイスを作成してプロビジョニングする」または「クイックスタート - Azure portal を使用して IoT Hub DPS をセットアップする」を参照してください。

IoT Edge ランタイムを確認する

IoT Edge ランタイムが稼働していることを確認するには、次の手順に従います。

  1. Azure portal で IoT Hub リソースに移動します。

  2. IoT Edge デバイスを選択します。

  3. IoT Edge ランタイムが稼働していることを確認します。

    Screenshot of the IoT Edge runtime status in the Azure portal.

    IoT Edge デバイス構成のトラブルシューティングを行う方法については、「IoT Edge デバイスのトラブルシューティング」を参照してください。

IoT Edge ランタイムの更新

VM を更新するには、「IoT Edge を更新する」の手順に従います。 Azure IoT Edge の最新バージョンを見つけるには、Azure IoT Edge リリースに関する記事を参照してください。

次のステップ

Ubuntu VM にIoT Edge モジュールをデプロイして実行するには、「IoT Edge モジュールをデプロイする」の手順を参照してください。

Nvidia の DeepStream モジュールをデプロイするには、「GPU を使用して Azure Stack Edge Pro上の Ubuntu VM に Nvidia DeepStream モジュールをデプロイする」を参照してください。

NVIDIA DIGITS をデプロイするには、「あらかじめ用意されている NVIDIA モジュールで GPU を有効にする」を参照してください。