Azure Resource Manager テンプレートを使用して Azure IoT Hub を手動で移行する方法

Azure portal、Azure Resource Manager テンプレート、Azure IoT Hub サービス SDK を使用して、IoT ハブを新しいリージョン、新しいレベル、または新しい構成に移行します。

この記事の手順は、次の場合に役立ちます。

ハブを移行するには、元のハブへの管理アクセス権を持つサブスクリプションが必要です。 新しいリソース グループとリージョン、元のハブと同じサブスクリプション、または新しいサブスクリプションに新しいハブを配置することができます。 ハブ名はグローバルに一意である必要があるため、同じ名前を使用することはできません。

自動移行と手動移行の手順を比較する

この記事の結果は、Azure CLI を使用して IoT ハブを自動的に移行する方法と似ていますが、プロセスは異なります。 開始する前に、シナリオに適したプロセスを決定します。

  • 手動プロセスの場合 (この記事):

    • デバイス レジストリとルーティングおよびエンドポイントの情報を移行します。 新しい IoT ハブで他の構成詳細を手動で再作成する必要があります。
    • 多数のデバイス (たとえば、100,000 台を超える場合) を高速に移行できます。
    • Azure Storage アカウントを使用してデバイス レジストリを転送します。
    • ARM テンプレート出力からルーティングおよびファイル アップロードのエンドポイントの接続文字列をスクラブします。手動で追加し直す必要があります。
  • Azure CLI プロセスの場合:

    • デバイス レジストリ、ルーティングとエンドポイントの情報、IoT Edge のデプロイや自動デバイス管理構成などのその他の構成の詳細を移行します。
    • 少数のデバイス (たとえば最大 10,000 台) を簡単に移行できます。
    • Azure Storage アカウントを必要としません。
    • ルーティングとファイル アップロードのエンドポイントの接続文字列を収集して、ARM テンプレート出力に含めます。

考慮事項

IoT ハブを移行する前に、いくつかの点を考慮する必要があります。

  • 元の場所で使用できるすべての機能を新しい場所でも使用できることを確認します。 一部のサービスはプレビュー段階であり、すべての機能をどこでも利用できるわけではありません。

  • 移行されたバージョンを作成して確認する前に、元のリソースを削除しないでください。 ハブを削除すると、そのハブは永久に失われ、設定やデータを復旧してハブが正しく複製されていることを確認する方法はありません。

  • 元の IoT ハブのデータは移行されません。 このデータには、デバイス メッセージ、cloud-to-device (C2D) コマンド、およびジョブに関連する情報 (スケジュールや履歴) が含まれます。 メトリクスとログ記録も移行されません。

  • 移行によるダウンタイムをスケジュールする必要があります。 デバイスを新しいハブに複製するには時間がかかります。 Import/Export メソッドを使用する場合は、50 万デバイスを移動するのに 2 時間、100 万台のデバイスを移動するのに 4 時間かかることがベンチマーク テストによって明らかになりました。

  • デバイスをシャットダウンしたり変更したりすることなく、デバイスを新しいハブにコピーできます。

    • デバイスが最初に DPS を使用してプロビジョニングされていた場合は、新しい IoT ハブを指すように登録を更新します。 次に、デバイスを再プロビジョニングして、各デバイスに格納されている接続情報を更新します。

    • それ以外の場合は、Import/Export メソッドを使用してデバイスを移動してから、新しいハブを使用するにはデバイスを変更する必要があります。 たとえば、ツインの必要なプロパティから IoT Hub ホスト名を使用するようにデバイスを設定できます。 デバイスは IoT Hub ホスト名を取得し、古いハブからデバイスを切断し、新しいデバイスに再接続します。

  • 新しいリソースで使用できるように、すべての証明書を更新する必要があります。 また、ハブがどこかの DNS テーブルで定義されている場合は、その DNS 情報を更新する必要があります。

手法

これは、IoT ハブを移行するために推奨される一般的な方法です。

  1. ハブとその設定を Resource Manager テンプレートにエクスポートします。

  2. テンプレートに必要な変更を加えます。たとえば、移行されたハブの名前と場所をすべて更新します。 メッセージ ルーティング エンドポイントに使用されるテンプレート内のリソースについては、そのリソースのテンプレート内のキーを更新します。

  3. 新しい場所の新しいリソース グループにテンプレートをインポートします。 この手順により、新しい IoT ハブが作成されます。

  4. 必要に応じてデバッグします。

  5. テンプレートにエクスポートされていないものを追加します。

    たとえば、コンシューマー グループはテンプレートにエクスポートされません。 コンシューマー グループを手動でテンプレートに追加するか、ハブの作成後に Azure portal を使用する必要があります。

  6. 元のハブから新しいハブにデバイスをコピーします。 このプロセスについては、「IoT ハブに登録されたデバイスを管理する」のセクションを参照してください。

メッセージ ルーティングを処理する方法

ハブでメッセージ ルーティングが使用されている場合、ハブのテンプレートのエクスポートにはルーティング構成が含まれますが、リソース自体は含まれません。 IoT ハブを新しいリージョンに移行する場合は、ルーティング リソースを新しい場所に移動するか、元の場所に残して "そのまま" 使用し続けるかを選択する必要があります。 別のリージョンのエンドポイント リソースにメッセージをルーティングすることで、パフォーマンスが低下する場合があります。

ハブでメッセージ ルーティングを使用している場合は、2 つの選択肢があります。

  • ルーティング エンドポイントに使用されているリソースを新しい場所に移動します。

    1. 新しいリソースは、Azure portal で手動で作成するか、Resource Manager テンプレートを使用して作成します。

    2. 新しい場所にリソースを作成する際は、グローバルに一意の名前が付けられているため、すべてのリソースの名前を変更します。

    3. 新しいハブを作成する前に、新しいハブのテンプレートでリソース名とリソース キーを更新します。 リソースは、新しいハブの作成時には存在している必要があります。

  • ルーティング エンドポイントに使用されるリソースは移動しないでください。 "元の位置で" 使用してください。

    1. テンプレートを編集する手順では、新しいハブを作成する前に、各ルーティング リソースのキーを取得し、それらをテンプレートに含める必要があります。

    2. ハブは引き続き元のルーティング リソースを参照し、構成されたとおりにメッセージをルーティングします。 ハブとルーティング エンドポイント リソースが同じ場所にないため、パフォーマンスがわずかに低下します。

ハブを別のリージョンに移行するための準備

このセクションでは、ハブを移行するための具体的な手順について説明します。

元のハブをリソース テンプレートにエクスポートする

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

  2. 移動させる IoT ハブに移動します。

  3. ハブのプロパティと設定の一覧から [テンプレートのエクスポート] を選択します。

    IoT ハブのテンプレートをエクスポートするためのコマンドを示すスクリーンショット。

  4. [ダウンロード] を選択してテンプレートをダウンロードします。 ファイルを、後で見つけられる場所に保存します。

    IoT ハブのテンプレートをダウンロードするためのコマンドを示すスクリーンショット。

テンプレートを見る

ダウンロードしたテンプレートに移動します。これは zip ファイルに含まれています。 Zip ファイルを開き、template.json という名前のファイルを見つけます。

次の例は、ルーティング構成のない汎用ハブを対象としています。 これは、westus リージョンの ContosoHub と呼ばれる S1 レベルのハブ (1 ユニット) です。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "IotHubs_ContosoHub_connectionString": {
            "type": "SecureString"
        },
        "IotHubs_ContosoHub_containerName": {
            "type": "SecureString"
        },
        "IotHubs_ContosoHub_name": {
            "defaultValue": "ContosoHub",
            "type": "String"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Devices/IotHubs",
            "apiVersion": "2021-07-01",
            "name": "[parameters('IotHubs_ContosoHub_name')]",
            "location": "westus",
            "sku": {
                "name": "S1",
                "tier": "Standard",
                "capacity": 1
            },
            "identity": {
                "type": "None"
            },
            "properties": {
                "ipFilterRules": [],
                "eventHubEndpoints": {
                    "events": {
                        "retentionTimeInDays": 1,
                        "partitionCount": 4
                    }
                },
                "routing": {
                    "endpoints": {
                        "serviceBusQueues": [],
                        "serviceBusTopics": [],
                        "eventHubs": [],
                        "storageContainers": []
                    },
                    "routes": [],
                    "fallbackRoute": {
                        "name": "$fallback",
                        "source": "DeviceMessages",
                        "condition": "true",
                        "endpointNames": [
                            "events"
                        ],
                        "isEnabled": true
                    }
                },
                "storageEndpoints": {
                    "$default": {
                        "sasTtlAsIso8601": "PT1H",
                        "connectionString": "[parameters('IotHubs_ContosoHub_connectionString')]",
                        "containerName": "[parameters('IotHubs_ContosoHub_containerName')]"
                    }
                },
                "messagingEndpoints": {
                    "fileNotifications": {
                        "lockDurationAsIso8601": "PT1M",
                        "ttlAsIso8601": "PT1H",
                        "maxDeliveryCount": 10
                    }
                },
                "enableFileUploadNotifications": false,
                "cloudToDevice": {
                    "maxDeliveryCount": 10,
                    "defaultTtlAsIso8601": "PT1H",
                    "feedback": {
                        "lockDurationAsIso8601": "PT1M",
                        "ttlAsIso8601": "PT1H",
                        "maxDeliveryCount": 10
                    }
                },
                "features": "None",
                "disableLocalAuth": false,
                "allowedFqdnList": []
            }
        }
    ]
}

テンプレートの編集

テンプレートを使用して新しいリージョンに新しいハブを作成する前に、いくつかの変更を行う必要があります。 テンプレートを編集するには、Visual Studio Code またはテキスト エディターを使用します。

ハブの名前と保存先を編集する

  1. 上部にあるコンテナー名パラメーター セクションを削除します。 ContosoHub には、関連付けられたコンテナーがありません。

    "parameters": {
      ...
        "IotHubs_ContosoHub_containerName": {
            "type": "SecureString"
        },
      ...
    },
    
  2. storageEndpoints プロパティを削除します。

    "properties": {
      ...
        "storageEndpoints": {
        "$default": {
            "sasTtlAsIso8601": "PT1H",
            "connectionString": "[parameters('IotHubs_ContosoHub_connectionString')]",
            "containerName": "[parameters('IotHubs_ContosoHub_containerName')]"
        }
      },
      ...
    
    
  3. ハブを新しいリージョンに移動する場合は、[リソース]location プロパティを変更します。

    "location": "westus",
    

ルーティング エンドポイント リソースを更新する

ルーティングが構成されているハブの Resource Manager テンプレートをエクスポートすると、リソースのキーがエクスポートされたテンプレートで提供されていないことがわかります。 リソースの配置はアスタリスクで示されます。 新しいハブのテンプレートをインポートしてハブを作成するに、ポータルでこれらのリソースに移動してキー を取得し、記入する必要があります。

ルーティング リソースも移動した場合は、各エンドポイントの名前、ID、リソース グループも更新します。

  1. 任意のルーティング リソースに必要なキーを取得し、それらをテンプレートに配置します。 リソースからキーを取得するには、Azure portal を使用します。

    • たとえば、メッセージをストレージ コンテナーにルーティングする場合は、ポータルでストレージ アカウントを検索します。 [設定] セクションで、[アクセス キー] を選択し、いずれかのキーをコピーします。 テンプレートを始めてエクスポートする場合、次のようなキーが表示されます。

      "connectionString": "DefaultEndpointsProtocol=https;
      AccountName=fabrikamstorage1234;AccountKey=****",
      "containerName": "fabrikamresults",
      

      ストレージ アカウントのアカウント キーを取得した後、アスタリスクの代わりに AccountKey=**** 句のテンプレートに配置します。

    • Service Bus キューの場合は、SharedAccessKeyName に一致する共有アクセス キーを取得します。 json のキーと SharedAccessKeyName は次のとおりです。

      "connectionString": "Endpoint=sb://fabrikamsbnamespace1234.servicebus.windows.net:5671/;
      SharedAccessKeyName=iothubroutes_FabrikamResources;
      SharedAccessKey=****;
      EntityPath=fabrikamsbqueue1234",
      
    • Service Bus トピックとイベント ハブ接続についても同じことが当てはまります。

テンプレートを読み込んで、新しいハブを作成する

編集したテンプレートを使用して、新しいハブを作成します。 ルーティング リソースを移動する場合は、新しい場所でリソースを設定し、テンプレート内の参照が一致するように更新する必要があります。 ルーティング リソースを移動しない場合は、更新されたキーを含むテンプレート内に存在する必要があります。

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

  2. [リソースの作成] を選択します。

  3. 検索ボックスで、「テンプレートのデプロイ (カスタム テンプレートを使用してデプロイ)」を検索して選択します。 テンプレートのデプロイの画面で、[作成] を選択します。

  4. [カスタム デプロイ] ページで、[エディターで独自のテンプレートを作成する] を選択します。これにより、ファイルからテンプレートをアップロードできます。

    独自のテンプレートを作成するためのコマンドを示すスクリーンショット。

  5. [ファイルの読み込み] を選択します。

    テンプレート ファイルをアップロードするためのコマンドを示すスクリーンショット。

  6. 編集した新しいテンプレートを参照して選択し、[開く] を選択します。 編集ウィンドウにテンプレートが読み込まれます。 [保存] を選択します。

    テンプレートの読み込みを示すスクリーンショット。

  7. カスタム デプロイ ページで次のフィールドに入力します。

    [サブスクリプション] : 使用するサブスクリプションを選択します。

    リソース グループ: 既存のリソース グループを選択するか、新しいリソース グループを作成します。

    [リージョン] : 既存のリソース グループを選択した場合は、リソース グループの場所と一致するようにデータが入力されます。 新しいリソース グループを作成した場合は、その場所になります。

    [接続文字列] : ハブの接続文字列が入力されます。

    [ハブ名]: 新しいハブに名前を付けます。

    [カスタム デプロイ] ページのスクリーンショット

  8. [確認および作成] ボタンを選択します。

  9. [作成] ボタンを選択します。 ポータルでテンプレートが検証され、新しいハブがデプロイされます。 ルーティング構成データがある場合は新しいハブに追加されますが、以前の場所のリソースを参照します。

    最後の [カスタム デプロイ] ページのスクリーンショット

IoT ハブに登録されたデバイスを管理する

新しいハブを作成して実行したので、元のハブから新しいハブにすべてのデバイスをコピーする必要があります。

デバイスをコピーするには、複数の方法があります。 デバイスを始めて作成した際にデバイス プロビジョニング サービス (DPS) 使用したかどうかによって異なります。 した場合、このプロセスは難しくありません。 しなかった場合、このプロセスは複雑になる可能性があります。

デバイスをプロビジョニングするために DPS を使用しなかった場合は、次のセクションをスキップし、Import/Export を使用してデバイスを新しいハブに移動することから始めます。

DPS を使用して新しいハブでデバイスを再プロビジョニングする

DPS を使用してデバイスを新しい場所に移動する方法については、「デバイスを再プロビジョニングする方法」を参照してください。 完了すると Azure portal でデバイスを表示できるため、新しい場所にデバイスがあることを確認できます。

Azure portal を使用して新しいハブにアクセスします。 ハブを選択し、[IoT デバイス] を選択します。 新しいハブに再プロビジョニングされたデバイスが表示されます。 また、新しいハブのプロパティを表示することもできます。

ルーティングを実装している場合は、メッセージがリソースに正しくルーティングされていることをテストして確認します。

DPS を使用した後に変更をロールバックする

変更をロール バックする場合は、デバイスを新しいハブから古いものに再プロビジョニングします。

これで、ハブとデバイスの移行が完了しました。 クリーンアップまでスキップできます。

インポート/エクスポートを使用して新しいハブにデバイスを移動する

アプリケーションは .NET Core を対象としているので、Windows または Linux で実行できます。 サンプルをダウンロードし、接続文字列を取得し、実行するビットのフラグを設定して実行できます。 これを行うには、コードを開く必要はありません。

サンプルのダウンロード

  1. Azure IoT SDK for C# の IoT C# サンプルを使用します。 Zip ファイルをダウンロードし、コンピューターに解凍します。

  2. 関連するコードは ./iothub/service/samples/how to guides/ImportExportDevicesSample にあります。 アプリケーションを実行するためにコードを表示または編集する必要はありません。

  3. アプリケーションを実行するには、3 つの接続文字列と 5 つのオプションを指定します。 このデータをコマンド ライン引数として渡すか、環境変数を使用するか、または 2 つを組み合わせて使用します。 ここでは、オプションをコマンド ライン引数として、接続文字列を環境変数として渡します。

    これは、接続文字列は長くて扱いづらく、変更される可能性はほとんどありませんが、オプションを変更してアプリケーションを複数回実行する必要があるためです。 環境変数の値を変更するには、コマンド ウィンドウと、使用している Visual Studio または Visual Studio Code を閉じる必要があります。

オプション

アプリケーションの実行時に指定する 5 つのオプションを次に示します。

  • addDevices (引数 1) - ユーザー向けに生成された仮想デバイスを追加する場合は、このオプションを True に設定します。 これらのデバイスは、ソース ハブに追加されます。 また、numToAdd (引数 2) を設定して、追加するデバイスの数を指定します。 1 つのハブに登録できるデバイスの最大数は、1,000,000 です。 このオプションの目的は、テストすることです。 特定の数のデバイスを生成し、別のハブにコピーできます。

  • copyDevices (引数 3) - あるハブから別のハブにデバイスをコピーするには、このオプションを True に設定します。

  • deleteSourceDevices (引数 4) - ソース ハブに登録されているすべてのデバイスを削除する場合は、このオプションを True に設定します。 これを実行する前に、すべてのデバイスが転送されていることを確認するまで待つことをお勧めします。 デバイスを削除すると、デバイスを復元することはできません。

  • deleteDestDevices (引数 5) - 宛先ハブに登録されているすべてのデバイスを削除する場合は、このオプションを True に設定します。 デバイスを複数回コピーする場合は、この操作を実行することをお勧めします。

基本的なコマンドは dotnet run で、これはローカルの csproj ファイルをビルドして実行するよう .NET に指示します。 コマンド ライン引数は、実行する前に最後に追加します。

コマンド ラインは次の例のようになります。

    // Format: dotnet run add-devices num-to-add copy-devices delete-source-devices delete-destination-devices

    // Add 1000 devices, don't copy them to the other hub, or delete them. 
    // The first argument is true, numToAdd is 50, and the other arguments are false.
    dotnet run true 1000 false false false 

    // Copy the devices you just added to the other hub; don't delete anything.
    // The first argument is false, numToAdd is 0, copy-devices is true, and the delete arguments are both false
    dotnet run false 0 true false false 

接続文字列用の環境変数を使用する

  1. サンプルを実行するには、古い IoT ハブと新しい IoT ハブへの接続文字列、および一時作業ファイル用のストレージ アカウントが必要です。 これらの値は、環境変数に格納されます。

  2. 接続文字列の値を取得するには、Azure portal にサインインします。

  3. 接続文字列を、取得できる場所 (メモ帳など) に置いておきます。 以下の内容をコピーして、接続文字列を直接貼り付けることができます。 等号の前後にスペースを追加したり、変数名を変更したりしないでください。 また、接続文字列を二重引用符で囲む必要はありません。 ストレージ アカウントの接続文字列を引用符で囲むと、スクリプトは失敗します。

    Windows で環境変数を設定する:

    SET IOTHUB_CONN_STRING=<put connection string to original IoT hub here>
    SET DEST_IOTHUB_CONN_STRING=<put connection string to destination IoT hub here>
    SET STORAGE_ACCT_CONN_STRING=<put connection string to the storage account here>
    

    Linux で環境変数を設定する:

    export IOTHUB_CONN_STRING="<put connection string to original IoT hub here>"
    export DEST_IOTHUB_CONN_STRING="<put connection string to destination IoT hub here>"
    export STORAGE_ACCT_CONN_STRING="<put connection string to the storage account here>"
    
  4. IoT ハブの接続文字列については、ポータルの各ハブにアクセスしてください。 ハブは、[リソース] で検索できます。 リソース グループがわかっている場合は、[リソース グループ] にアクセスしてリソース グループを選択し、そのリソース グループのアセットの一覧からハブを選択します。

  5. ハブの設定から [共有アクセス ポリシー] を選択し、[iothubowner] を選択していずれかの接続文字列をコピーします。 宛先ハブでも同じ操作を行います。 ハブを適切な SET コマンドに追加します。

  6. ストレージ アカウントの接続文字列については、[リソース] またはその [リソース グループ] の下からストレージ アカウントを見つけて開きます。

  7. [設定] セクションの下にある [アクセス キー] を選択し、いずれかの接続文字列をコピーします。 適切な SET コマンドの接続文字列をテキスト ファイルに配置します。

これで、SET コマンドを使用して環境変数がファイル内に作成され、コマンド ライン引数がわかるようになりました。 ここで、サンプルを実行してみましょう。

サンプル アプリケーションを実行し、コマンド ライン引数を使用する

  1. コマンド プロンプト ウィンドウを開きます。 [Windows] を選択し、「command prompt」と入力して、コマンド プロンプト ウィンドウを表示します。

  2. 環境変数を設定するコマンドを一度に 1 つずつコピーし、コマンド プロンプト ウィンドウに貼り付けて Enter キーを押します。 操作が完了したら、コマンド プロンプト ウィンドウに「SET」と入力して、環境変数とその値を確認します。 これらをコマンド プロンプト ウィンドウにコピーした後は、新しいコマンド プロンプト ウィンドウを開かない限りもう一度コピーする必要はありません。

  3. コマンド プロンプト ウィンドウで、./ ImportExportDevicesSample.csproj ファイルがある ImportExportDevicesSample にたどり着くまでディレクトリを変更します。 次に、以下の内容を入力し、コマンド ライン引数を含めます。

    // Format: dotnet run add-devices num-to-add copy-devices delete-source-devices delete-destination-devices
    dotnet run arg1 arg2 arg3 arg4 arg5
    

    dotnet コマンドは、アプリケーションをビルドして実行します。 アプリケーションを実行するときにオプションを渡すため、アプリケーションを実行するたびにこれらの値を変更できます。 たとえば、一度実行して新しいデバイスを作成し、再度実行して、それらのデバイスを新しいハブにコピーするなどが可能です。 また、1 回の実行ですべての手順を実行することもできます。ただし、移行が完了するまでデバイスを削除しないことをお勧めします。 次に、1000 デバイスを作成し、そのデバイスを他のハブにコピーする例を示します。

    // Format: dotnet run add-devices num-to-add copy-devices delete-source-devices delete-destination-devices
    
    // Add 1000 devices, don't copy them to the other hub or delete them. 
    dotnet run true 1000 false false false 
    
    // Do not add any devices. Copy the ones you just created to the other hub; don't delete anything.
    dotnet run false 0 true false false 
    

    デバイスが正常にコピーされたことを確認したら、次のように、ソース ハブからデバイスを削除できます。

    // Format: dotnet run add-devices num-to-add copy-devices delete-source-devices delete-destination-devices
    // Delete the devices from the source hub.
    dotnet run false 0 false true false 
    

Visual Studio を使用してサンプル アプリケーションを実行する

  1. Visual Studio でアプリケーションを実行する場合は、現在のディレクトリを azureiot.sln ファイルが格納されているフォルダーに変更します。 次に、コマンド プロンプト ウィンドウでこのコマンドを実行して、Visual Studio でソリューションを開きます。 この操作は、変数が認識されるよう、環境変数を設定したコマンド ウィンドウで行う必要があります。

    azureiot.sln
    
  2. プロジェクト "ImportExportDevicesSample" を右クリックし、[スタートアップ プロジェクトに設定] を選択します。

  3. Program.cs の先頭にある変数を、5 つのオプションの ImportExportDevicesSample フォルダーに設定します。

    // Add randomly created devices to the source hub.
    private static bool addDevices = true;
    //If you ask to add devices, this will be the number added.
    private static int numToAdd = 0; 
    // Copy the devices from the source hub to the destination hub.
    private static bool copyDevices = false;
    // Delete all of the devices from the source hub. (It uses the IoTHubConnectionString).
    private static bool deleteSourceDevices = false;
    // Delete all of the devices from the destination hub. (Uses the DestIotHubConnectionString).
    private static bool deleteDestDevices = false;
    
  4. F5 キーを選択してアプリケーションを実行します。 実行が完了したら、結果を表示できます。

結果の確認

Azure portal でデバイスを表示できるため、新しい場所にデバイスがあることを確認できます。

  1. Azure portal を使用して新しいハブにアクセスします。 ハブを選択し、[IoT デバイス] を選択します。 古いハブから新しいハブにコピーしたデバイスが表示されます。 また、新しいハブのプロパティを表示することもできます。

  2. インポート/エクスポート エラーを確認するには、Azure portal で Azure ストレージ アカウントに移動し、ImportErrors.logdevicefiles コンテナーを探します。 このファイルが空の場合 (サイズが 0 の場合)、エラーが発生しなかったことを意味します。 同じデバイスを 1 回以上インポートしようとすると、デバイスは 2 回目以降拒否され、エラー メッセージがログ ファイルに追加されます。

変更をコミットする

この時点で、ハブを新しい場所にコピーし、デバイスを新しいハブに移行しました。 次に、デバイスが新しいハブで動作するように変更を行う必要があります。

変更をコミットするには、次の手順を実行する必要があります。

  • 各デバイスを更新して、IoT Hub ホスト名が新しいハブを指すように IoT Hub ホスト名を変更します。 この操作は、最初にデバイスをプロビジョニングしたときに使用した方法を使用して行う必要があります。

  • 古いハブを参照しているすべてのアプリケーションを、新しいハブを指すように変更します。

  • 完了すると、新しいハブが起動して実行されます。 古いハブにはアクティブなデバイスがなく、切断状態になっている必要があります。

変更をロールバックする

変更をロール バックする場合は、次の手順を実行します。

  • 各デバイスを更新して、IoT Hub ホスト名が古いハブを指すように IoT Hub ホスト名を変更します。 この操作は、最初にデバイスをプロビジョニングしたときに使用した方法を使用して行う必要があります。

  • 新しいハブを参照しているすべてのアプリケーションを、古いハブを指すように変更します。 たとえば、Azure Analytics を使用している場合は、Azure Stream Analytics の入力の再構成が必要になることがあります。

  • 新しい Hub を削除します。

  • ルーティング リソースがある場合は、古いハブの構成が正しいルーティング構成を参照している必要があり、ハブの再起動後もそれらのリソースを使用する必要があります。

結果を確認する

結果を確認するには、新しい場所にあるハブをポイントするよう IoT ソリューションを変更して実行します。 言い換えると、前のハブで実行していた同じ操作を新しいハブで実行し、正常に動作することを確認してください。

ルーティングを実装している場合は、メッセージがリソースに正しくルーティングされていることをテストして確認します。

クリーンアップする

新しいハブが稼働していて、デバイスが正常に動作していることを確認するまで、クリーンアップしないでください。 また、機能を使用している場合は、必ずルーティングをテストしてください。 準備ができたら、次の手順を実行して、古いリソースをクリーンアップします。

  • まだの場合は、古いハブを削除します。 これにより、ハブからすべてのアクティブなデバイスが削除されます。

  • 新しい場所に移動したルーティング リソースがある場合は、古いルーティング リソースを削除できます。

次のステップ

IoT ハブを新しいリージョンにある新しいハブに移行し、デバイスで完了しました。 IoT ハブで ID レジストリに対して一括操作を実行する方法の詳細については、「IoT Hub デバイス ID の一括でのインポートおよびエクスポート」を参照してください。