チュートリアル: geo 待機時間用にプロビジョニングする

このチュートリアルでは、割り当てポリシーを利用して、IoT Hub のグループに複数のシミュレートされた対称キーのデバイスを安全にプロビジョニングする方法を説明します。 IoT Hub Device Provisioning Service (DPS) では、組み込みの割り当てポリシーと、カスタム割り当てポリシーへのサポートを通じて、さまざまな割り当てシナリオがサポートされています。

"位置情報または geo 待機時間" 用のプロビジョニングは、一般的な割り当てシナリオです。 デバイスが異なる場所の間を移動するときは、各場所に最も近い IoT ハブに対してデバイスをプロビジョニングすることにより、ネットワーク待ち時間が改善されます。 このシナリオでは、異なるリージョンに広がる IoT ハブのグループを、登録対象に選択します。 これらの登録に対して、組み込みの最短待機時間割り当てポリシーを選択します。 このポリシーを指定すると、Device Provisioning Service はデバイスの待機時間を評価して、IoT ハブのグループから最も近い IoT ハブを決定します。

このチュートリアルでは、Azure IoT C SDK のシミュレートされたデバイスのサンプルを使用して、複数リージョンでデバイスをプロビジョニングする方法を説明します。 このチュートリアルでは、以下の手順を実行します。

  • Azure CLI を使用して、2 つのリージョン (米国西部 2米国東部) に IoT ハブを作成します
  • 位置情報に基づいてデバイスをプロビジョニングする登録を作成します (最短待機時間)
  • Azure CLI を使用して、同じ 2 つのリージョン (米国西部 2米国東部) にデバイスとして機能する Linux VM を作成します
  • 両方の Linux VM 上に Azure IoT C SDK 用の開発環境をセットアップします
  • デバイスをシミュレートし、最も近いリージョンの IoT ハブにプロビジョニングされていることを確認します。

重要

一部のリージョンでは、Virtual Machines の作成に制限が適用されている場合があります。 このガイドの執筆時点では、westus2 および eastus リージョンで VM の作成が許可されています。 これらのリージョンのいずれかで作成できない場合は、別のリージョンを試してみてください。 VM を作成するときの Azure の地理的なリージョンの選択については、「Azure の仮想マシンのリージョン」を参照してください。

前提条件

  • 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 を実行します。

2 つのリージョンに IoT ハブを作成する

このセクションでは、1 つの Azure リソース グループと 2 つの新しいリージョン IoT ハブ リソースを作成します。 1 つの IoT ハブは米国西部 2 リージョン用、もう 1 つは米国東部リージョン用です。

重要

このチュートリアルで作成するすべてのリソースには、この同じリソース グループを使用することをお勧めします。 そうすれば、終わった後のクリーンアップが簡単になります。

  1. Azure Cloud Shell で、次の az group create コマンドを使用してリソース グループを作成します。

    az group create --name contoso-us-resource-group --location eastus
    
  2. eastus の場所に IoT ハブを作成し、次の az iot hub create コマンドを使用して作成したリソース グループに追加します ({unique-hub-name} は独自の一意の名前に置き換えます)。

    az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location eastus --sku S1
    

    このコマンドが完了するまでに数分かかる場合があります。

  3. 次は、westus2 の場所に IoT ハブを作成し、次の az iot hub create コマンドを使用して作成したリソース グループに追加します ({unique-hub-name} は独自の一意の名前に置き換えます)。

    az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location westus2 --sku S1
    

    このコマンドが完了するまでに数分かかる場合があります。

geo 待機時間の登録を作成する

このセクションでは、デバイス用の新しい登録グループを作成します。

わかりやすくするため、このチュートリアルでは対称キーの構成証明を登録で使用します。 ソリューションをさらに安全にするには、信頼チェーンで X.509 証明書構成証明を使用することを検討してください。

  1. Azure portal にサインインし、Device Provisioning Service インスタンスに移動します。

  2. ナビゲーション メニューの [設定] セクションから [Manage enrollments] (登録の管理) を選択します。

  3. [登録グループの追加] を選択します。

  4. [登録グループの追加] ページの [Registration + provisioning] (登録とプロビジョニング) タブで、次の情報を入力して登録グループの詳細を構成します。

    フィールド 説明
    構成証明 [Attestation mechanism] (構成証明メカニズム) として [対称キー] を選択します。
    Symmetric key settings (対称キーの設定) [Generate symmetric keys automatically] (対称キーを自動的に生成) ボックスをオンにします。
    グループ名 グループに contoso-us-devices という名前を付けるか、独自のグループ名を指定します。 登録グループ名は、英数字と特殊文字 ('-''.''_'':') から成る、大文字と小文字が区別されない文字列です (最大 128 文字)。 最後の文字は、英数字またはダッシュ ('-') である必要があります。
  5. [Next: IoT hubs] (次へ: IoT ハブ) を選択します。

  6. 次の手順に従って 2 つの IoT ハブを登録グループに追加します。

    1. [登録グループの追加] ページの [IoT ハブ] タブで、[Target IoT hubs] (ターゲット IoT ハブ) セクションの [IoT ハブへのリンクを追加します] を選択します。

    2. [IoT ハブへのリンクを追加します] ページで、eastus リージョンで作成した IoT ハブを選択して、それに iothubowner アクセス権を割り当てます。

    3. [保存] を選択します。

    4. [IoT ハブへのリンクを追加します] をもう一度選択し、同じ手順に従って、westus2 リージョンで作成した IoT ハブを追加します。

    5. [Target IoT hubs] (ターゲット IoT ハブ) ドロップダウン メニューで、両方の IoT ハブを選択します。

  7. [割り当てポリシー][最短待機時間] を選択します。

  8. [Review + create](レビュー + 作成) を選択します。

  9. [確認 + 作成] タブで、すべての値を確認してから [作成] を選択します。

  10. 登録グループが作成されたら、登録グループの一覧から contoso-us-devices という名前を選択します。

  11. 主キーをコピーします。 このキーは、後で両方のシミュレートされたデバイスに対する一意のデバイス キーを生成するために使用されます。

リージョンの Linux VM を作成する

このセクションでは、リージョンの Linux 仮想マシン (VM) を 2 つ (米国西部 2 に 1 つ、米国東部 2 に 1 つ) 作成します。 これらの VM は、各リージョンからデバイス シミュレーション サンプルを実行して、両方のリージョンからのデバイス プロビジョニングをデモンストレーションします。

クリーンアップを容易にするため、これらの VM は、作成された IoT ハブを格納しているものと同じリソース グループ contoso-us-resource-group に追加します。

  1. Azure Cloud Shell で次のコマンドを実行して、米国東部リージョンの VM を作成します。実行前に、コマンドの次のパラメーターを変更します。

    --name: 自分の米国東部リージョンのデバイスの VM に対する一意名を入力します。

    --admin-username: 自分の管理者ユーザー名を使用します。

    --admin-password: 自分の管理者パスワードを使用します。

    az vm create \
    --resource-group contoso-us-resource-group \
    --name ContosoSimDeviceEast \
    --location eastus \
    --image Canonical:UbuntuServer:18.04-LTS:18.04.201809110 \
    --admin-username contosoadmin \
    --admin-password myContosoPassword2018 \
    --authentication-type password
    --public-ip-sku Standard
    

    このコマンドが完了するまでに数分かかります。

  2. コマンドが完了したら、米国東部リージョンの VM の publicIpAddress の値をコピーします。

  3. Azure Cloud Shell で次のコマンドを実行して、米国西部 2 リージョンの VM を作成します。実行前に、コマンドの次のパラメーターを変更します。

    --name: 自分の米国西部 2 リージョンのデバイスの VM に対する一意名を入力します。

    --admin-username: 自分の管理者ユーザー名を使用します。

    --admin-password: 自分の管理者パスワードを使用します。

    az vm create \
    --resource-group contoso-us-resource-group \
    --name ContosoSimDeviceWest2 \
    --location westus2 \
    --image Canonical:UbuntuServer:18.04-LTS:18.04.201809110 \
    --admin-username contosoadmin \
    --admin-password myContosoPassword2018 \
    --authentication-type password
    --public-ip-sku Standard
    

    このコマンドが完了するまでに数分かかります。

  4. コマンドが完了したら、米国西部 2 リージョンの VM の publicIpAddress の値をコピーします。

  5. コマンド ライン シェルを 2 つ開きます。

  6. SSH を使用して各シェルでリージョン VM の 1 つに接続します。

    管理者のユーザー名と、コピーしたパブリック IP アドレスを、SSH へのパラメーターとして渡します。 メッセージが表示されたら、管理者のパスワードを入力します。

    ssh contosoadmin@1.2.3.4
    
    contosoadmin@ContosoSimDeviceEast:~$
    
    ssh contosoadmin@5.6.7.8
    
    contosoadmin@ContosoSimDeviceWest:~$
    

Azure IoT C SDK の開発環境を準備する

このセクションでは、各 VM で Azure IoT C SDK を複製します。 SDK には、各リージョンからのデバイス プロビジョニングをシミュレートするサンプルが含まれています。

VM ごとに、次の手順を実行します。

  1. 次のコマンドを使用して CMakeg++gccGit をインストールします。

    sudo apt-get update
    sudo apt-get install cmake build-essential libssl-dev libcurl4-openssl-dev uuid-dev git-all
    
  2. SDK の最新リリースのタグ名を見つけてコピーします。

  3. 両方の VM で C 用 Azure IoT Device SDK を複製します。 -b パラメーターの値として、前の手順で見つけたタグを使用します (例: lts_01_2023)。

    git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git
    cd azure-iot-sdk-c
    git submodule update --init
    

    この操作は、完了するまでに数分かかります。

  4. リポジトリの内部に新しい cmake フォルダーを作成し、そのフォルダーに移動します。

    mkdir ~/azure-iot-sdk-c/cmake
    cd ~/azure-iot-sdk-c/cmake
    
  5. 次のコマンドを実行して、開発クライアント プラットフォームに固有の SDK のバージョンをビルドします。

    cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON  ..
    
  6. ビルドが成功すると、最後のいくつかの出力行は次のようになります。

    -- IoT Client SDK Version = 1.7.0
    -- Provisioning SDK Version = 1.7.0
    -- Looking for include file stdint.h
    -- Looking for include file stdint.h - found
    -- Looking for include file stdbool.h
    -- Looking for include file stdbool.h - found
    -- target architecture: x86_64
    -- Performing Test CXX_FLAG_CXX11
    -- Performing Test CXX_FLAG_CXX11 - Success
    -- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version "1.1.1")
    -- Found CURL: /usr/lib/x86_64-linux-gnu/libcurl.so (found version "7.58.0")
    -- Found CURL: /usr/lib/x86_64-linux-gnu/libcurl.so
    -- target architecture: x86_64
    -- iothub architecture: x86_64
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/contosoadmin/azure-iot-sdk-c/azure-iot-sdk-c
    

一意のデバイス キーを派生させる

グループ登録で対称キーの構成証明を使用する場合、登録グループのキーを直接は使用しません。 その代わりに、各デバイスの登録グループ キーから固有のキーを派生させます。

チュートリアルのこの部分では、グループ マスター キーからデバイス キーを生成し、デバイス用の一意の登録 ID の HMAC-SHA256 を計算します。 結果は Base64 形式に変換されます。

重要

デバイス コードにはグループのマスター キーを含めないでください。

eastuswestus2両方のデバイスの場合:

  1. openssl を使用して、一意のキーを生成します。 次の Bash シェル スクリプトを使用します ({primary-key} を先ほどコピーした登録グループの主キーに置き換え、{contoso-simdevice} を各デバイスに独自の一意の登録 ID に置き換えます。 登録 ID は、英数字と特殊文字 ('-''.''_'':') から成る、大文字と小文字が区別されない文字列です (最大 128 文字)。 最後の文字は、英数字またはダッシュ ('-') である必要があります。

    KEY={primary-key}
    REG_ID={contoso-simdevice}
    
    keybytes=$(echo $KEY | base64 --decode | xxd -p -u -c 1000)
    echo -n $REG_ID | openssl sha256 -mac HMAC -macopt hexkey:$keybytes -binary | base64
    
  2. このスクリプトにより、次のようなキーが出力されます。

    p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=
    
  3. これで、各デバイスには、プロビジョニング プロセス中に登録グループで対称キーの構成証明を実行するための独自の派生デバイス キーと一意の登録 ID が割り当てられました。

各リージョンからデバイスをシミュレートする

このセクションでは、両方のリージョン VM について、Azure IoT C SDK のプロビジョニング サンプルを更新します。

サンプル コードでは、Device Provisioning Services のインスタンスにプロビジョニング要求を送信するデバイスのブート シーケンスがシミュレートされます。 ブート シーケンスにより、デバイスが認識され、待機時間に基づいて最も近い IoT ハブに割り当てられます。

  1. Azure portal で、Device Provisioning Service の [概要] タブを選択し、 [ID スコープ] の値を書き留めます。

    ポータルのブレードから Device Provisioning Service のエンドポイント情報を抽出する。

  2. 両方の VM で ~/azure-iot-sdk-c/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample.c を開いて編集します。

    vi ~/azure-iot-sdk-c/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample.c
    
  3. 両方の VM で定数 id_scope を探し、先ほどコピーした ID スコープの値で置き換えます。

    static const char* id_scope = "0ne00002193";
    
  4. 両方の VM で、同じファイル内の main() 関数の定義を探します。 次に示すように、登録グループの構成証明の方法に合わせて hsm_type 変数が SECURE_DEVICE_TYPE_SYMMETRIC_KEY に設定されていることを確認します。

    両方の VM でファイルに変更を保存します。

    SECURE_DEVICE_TYPE hsm_type;
    //hsm_type = SECURE_DEVICE_TYPE_TPM;
    //hsm_type = SECURE_DEVICE_TYPE_X509;
    hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
    
  5. 両方の VM で、prov_dev_client_sample.c でコメントになっている prov_dev_set_symmetric_key_info() の呼び出しを探します。

    // Set the symmetric key if using they auth type
    //prov_dev_set_symmetric_key_info("<symm_registration_id>", "<symmetric_Key>");
    

    関数呼び出しのコメントを解除し、各デバイスについて、プレースホルダーの値 (山かっこを含む) を、前のセクションで派生させた一意の登録 ID とデバイス派生キーに置き換えます。 次に示すキーは例です。 先ほど生成したキーを使用してください。

    米国東部:

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("contoso-simdevice-east", "p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=");
    

    米国西部:

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("contoso-simdevice-west", "J5n4NY2GiBYy7Mp4lDDa5CbEe6zDU/c62rhjCuFWxnc=");
    
  6. 両方の VM 上のファイルを保存します。

  7. 両方の VM で、次に示すサンプル フォルダーに移動し、サンプルをビルドします。

    cd ~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/
    cmake --build . --target prov_dev_client_sample --config Debug
    
  8. ビルドが成功したら、両方の VM で prov_dev_client_sample.exe を実行して、各リージョンからデバイスをシミュレートします。 シミュレートされたデバイスのリージョンに最も近い IoT ハブに、各デバイスが割り当てられることに注意してください。

    シミュレーションを実行する:

    ~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample
    

    米国東部の VM からの出力例:

    contosoadmin@ContosoSimDeviceEast:~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample$ ./prov_dev_client_sample
    Provisioning API Version: 1.2.9
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-east-hub.azure-devices.net, deviceId: contoso-simdevice-east
    Press enter key to exit:
    
    

    米国西部の VM からの出力例:

    contosoadmin@ContosoSimDeviceWest:~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample$ ./prov_dev_client_sample
    Provisioning API Version: 1.2.9
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-west-hub.azure-devices.net, deviceId: contoso-simdevice-west
    Press enter key to exit:
    

リソースをクリーンアップする

このチュートリアルで作成したリソースを引き続き使用する場合は、リソースをそのままにしておいてください。 それ以外の場合は、次の手順でこのチュートリアルで作成したすべてのリソースを削除することで、不要な課金を回避できます。

以下の手順では、このチュートリアルの説明に従って contoso-us-resource-group という名前の同じリソース グループにすべてのリソースが作成されていることを前提にしています。

重要

リソース グループを削除すると、元に戻すことができません。 リソース グループとそこに含まれるすべてのリソースは完全に削除されます。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。 IoT ハブを、保持したいリソースが含まれている既存のリソース グループ内に作成した場合は、リソース グループを削除するのではなく、IoT Hub リソースだけを削除してください。

名前でリソース グループを削除するには

  1. Azure portal にサインインします。

  2. [リソース グループ] を選択します。

  3. [名前でフィルター] テキスト ボックスに、リソースが含まれているリソース グループの名前 contoso-us-resource-group を入力します。

  4. 結果一覧のでリソース グループの [...] をクリックし、[リソース グループの削除] をクリックします。

  5. リソース グループの削除の確認を求めるメッセージが表示されます。 確認のためにもう一度リソース グループの名前を入力し、 [削除] を選択します。 しばらくすると、リソース グループとそこに含まれているすべてのリソースが削除されます。

次のステップ

詳細については、「 カスタム割り当てポリシー」を参照してください