Azure Resource Manager 템플릿을 사용하여 Azure IoT Hub를 수동으로 마이그레이션하는 방법

Azure Portal, Azure Resource Manager 템플릿 및 Azure IoT Hub 서비스 SDK를 사용하여 IoT 허브를 새 지역, 새 계층 또는 새 구성으로 마이그레이션합니다.

이 문서의 단계는 다음과 같은 경우에 유용합니다.

  • 무료 계층에서 기본 또는 표준 계층 IoT 허브로 업그레이드합니다.
  • IoT 허브를 새 지역으로 이동합니다.
  • 백업으로 사용할 IoT 허브 상태 정보를 내보냅니다.
  • IoT 허브에 대한 파티션 수를 늘입니다.
  • 프로덕션 환경이 아닌 개발을 위한 허브를 설정합니다.
  • 맞춤형 다중 허브 고가용성을 구현할 수 있습니다. 자세한 내용은 IoT Hub 고가용성 및 재해 복구의 지역 간 HA를 달성하는 방법 섹션을 참조하세요.

허브를 마이그레이션하려면 원본 허브에 대한 관리자 액세스 권한이 있는 구독이 필요합니다. 새 허브를 새 리소스 그룹 및 지역, 원본 허브와 동일한 구독 또는 새 구독에 배치할 수 있습니다. 허브 이름은 전역적으로 고유해야 하기 때문에 동일한 이름을 사용할 수 없습니다.

자동 및 수동 마이그레이션 단계 비교

이 문서의 결과는 Azure CLI를 사용하여 IoT 허브를 자동으로 마이그레이션하는 방법과 비슷하지만, 프로세스가 다릅니다. 시작하기 전에 시나리오에 적합한 프로세스를 결정합니다.

  • 수동 프로세스(이 문서):

    • 디바이스 레지스트리와 라우팅 및 엔드포인트 정보를 마이그레이션합니다. 새 IoT Hub에서 다른 구성 세부 정보를 수동으로 다시 만들어야 합니다.
    • 다수의 디바이스(예: 100,000개 이상)를 마이그레이션하는 경우 더 빠릅니다.
    • Azure Storage 계정을 사용하여 디바이스 레지스트리를 전송합니다.
    • ARM 템플릿 출력에서 라우팅 및 파일 업로드 엔드포인트에 대한 연결 문자열을 스크럽하므로 수동으로 다시 추가해야 합니다.
  • Azure CLI 프로세스:

    • 디바이스 레지스트리, 라우팅 및 엔드포인트 정보, IoT Edge 배포 또는 자동 디바이스 관리 구성과 같은 기타 구성 세부 정보를 마이그레이션합니다.
    • 소수의 디바이스(예: 최대 10,000개)를 마이그레이션하는 경우 용이합니다.
    • Azure Storage 계정이 필요하지 않습니다.
    • 라우팅 및 파일 업로드 엔드포인트에 대한 연결 문자열을 수집하고 ARM 템플릿 출력에 포함합니다.

고려해야 할 사항

IoT 허브를 마이그레이션하기 전에 고려해야 할 여러 가지 사항이 있습니다.

  • 원래 위치에서 사용할 수 있는 모든 기능을 새 위치에서도 사용할 수 있어야 합니다. 일부 서비스는 미리 보기이므로 모든 기능을 어디서나 사용할 수 있는 것은 아닙니다.

  • 마이그레이션된 버전을 만들고 확인하기 전에는 원래 리소스를 제거하지 마세요. 허브를 제거하면 허브가 영원히 사라지며, 허브를 복구하고 설정 또는 데이터를 검사하여 허브가 올바르게 복제되었는지 확인할 수 있는 방법이 없습니다.

  • 원본 IoT 허브의 데이터는 마이그레이션되지 않습니다. 이 데이터에는 디바이스 메시지, C2D(클라우드-디바이스) 명령 및 작업 관련 정보(예: 일정 및 기록)가 포함됩니다. 메트릭 및 로깅 결과도 마이그레이션되지 않습니다.

  • 마이그레이션을 위한 가동 중지 시간을 예약해야 합니다. 디바이스를 새 허브에 복제하려면 시간이 걸립니다. Import/Export 방법을 사용하는 경우 디바이스 500,000대를 이동하는 데 약 2시간 정도 소요되고 100만 대를 이동하는 데 4시간 정도 소요되는 것으로 벤치마크 테스트 결과가 나왔습니다.

  • 디바이스를 종료하거나 변경하지 않고도 디바이스를 새 허브에 복사할 수 있습니다.

    • 디바이스가 원래 DPS를 사용하여 프로비전된 경우 새 IoT 허브를 가리키도록 등록을 업데이트합니다. 그런 다음 디바이스를 다시 프로비전하여 각 디바이스에 저장된 연결 정보를 업데이트합니다.

    • 그렇지 않은 경우 import/export 메서드를 사용하여 디바이스를 이동한 다음, 새 허브를 사용하도록 디바이스를 수정해야 합니다. 예를 들어 트윈 desired 속성의 IoT Hub 호스트 이름을 사용하도록 디바이스를 설정할 수 있습니다. 그러면 디바이스가 해당 IoT Hub 호스트 이름으로 사용하고, 이전 허브에서 디바이스 연결을 끊은 후 새 허브에 다시 연결합니다.

  • 인증서를 업데이트해야 합니다. 그래야만 새 리소스에 인증서를 사용할 수 있습니다. 또한 다른 곳의 DNS 테이블에 정의된 허브가 있을 수 있으며 해당 DNS 정보를 업데이트해야 합니다.

방법

이것은 IoT 허브를 마이그레이션하는 데 권장되는 일반적인 방법입니다.

  1. 허브 및 해당 설정을 Resource Manager 템플릿으로 내보냅니다.

  2. 템플릿을 필요한 대로 변경합니다(예: 마이그레이션된 허브의 모든 이름 및 위치 업데이트). 메시지 라우팅 엔드포인트에 사용되는 템플릿의 모든 리소스와 관련하여 해당 리소스에 대한 템플릿의 키를 업데이트합니다.

  3. 새 위치의 새 리소스 그룹으로 템플릿을 가져옵니다. 이 단계에서는 새 IoT 허브를 만듭니다.

  4. 필요한 대로 디버그합니다.

  5. 템플릿으로 내보내지지 않은 항목을 추가합니다.

    예를 들어 소비자 그룹은 템플릿으로 내보내지지 않습니다. 소비자 그룹을 템플릿에 수동으로 추가하거나 허브가 생성된 후 Azure Portal을 사용해야 합니다.

  6. 원본 허브에서 새 허브로 디바이스를 복사합니다. 이 프로세스는 IoT 허브에 등록된 디바이스 관리 섹션에서 다룹니다.

메시지 라우팅을 처리하는 방법

허브에서 메시지 라우팅을 사용하는 경우 허브에 대한 템플릿을 내보낼 때 라우팅 구성이 포함되지만 리소스 자체는 포함되지 않습니다. IoT 허브를 새 지역으로 마이그레이션하는 경우 라우팅 리소스를 새 위치로 이동할지 아니면 그대로 두고 "있는 그대로" 계속 사용할지 선택해야 합니다. 메시지를 다른 지역의 엔드포인트 리소스로 라우팅하면 약간의 성능 저하가 발생할 수 있습니다.

허브에서 메시지 라우팅을 사용하는 경우 다음과 같은 두 가지 옵션이 있습니다.

  • 라우팅 엔드포인트에 사용되는 리소스를 새 위치로 이동합니다.

    1. Azure Portal에서 수동으로 또는 Resource Manager 템플릿을 사용하여 새 리소스를 직접 만듭니다.

    2. 리소스는 전역적으로 고유한 이름을 사용해야 하므로 새 위치에 리소스를 만들 때 모든 리소스의 이름을 바꿉니다.

    3. 새 허브를 만들기 전에 새 허브의 템플릿에서 리소스 이름과 리소스 키를 업데이트합니다. 새 허브를 만들 때 리소스가 있어야 합니다.

  • 라우팅 엔드포인트에 사용되는 리소스를 이동하지 마세요. "원래 위치"에 두고 사용합니다.

    1. 템플릿을 편집하는 단계에서 허브를 만들기 전에 각 라우팅 리소스의 키를 검색하여 템플릿에 배치해야 합니다.

    2. 허브는 여전히 원래 라우팅 리소스를 참조하고, 구성된 대로 메시지를 라우팅합니다. 허브와 라우팅 엔드포인트 리소스가 동일한 위치에 있지 않기 때문에 성능이 약간 저하됩니다.

허브를 다른 지역으로 마이그레이션할 준비

이 섹션에서는 허브를 마이그레이션하기 위한 구체적인 지침을 제공합니다.

원래 허브를 리소스 템플릿으로 내보내기

  1. Azure Portal에 로그인합니다.

  2. 이동하려는 IoT 허브로 이동합니다.

  3. 허브에 대한 속성 및 설정 목록에서 템플릿 내보내기를 선택합니다.

    Screenshot showing the command for exporting the template for the IoT hub.

  4. 다운로드를 선택하여 템플릿을 다운로드합니다. 파일을 다시 찾을 수 있는 위치에 저장합니다.

    Screenshot showing the command for downloading the template for the IoT hub.

템플릿 보기

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": "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 토픽 및 Event Hubs 연결에도 동일하게 적용됩니다.

템플릿을 로드하여 새 허브 만들기

편집된 템플릿을 사용하여 새 허브를 만듭니다. 이동하려는 라우팅 리소스가 있는 경우 새 위치에 리소스를 설정하고 템플릿의 참조를 일치하도록 업데이트해야 합니다. 라우팅 리소스를 이동하지 않는 경우 업데이트된 키를 사용하는 템플릿에 라우팅 리소스가 있어야 합니다.

  1. Azure Portal에 로그인합니다.

  2. 리소스 만들기를 선택합니다.

  3. 검색 상자에서 템플릿 배포(사용자 지정 템플릿을 사용하여 배포)를 검색하고 선택합니다. 템플릿 배포 화면에서 만들기를 선택합니다.

  4. 사용자 지정 배포 페이지에서 편집기에서 사용자 고유의 템플릿 빌드를 선택합니다. 그러면 파일에서 템플릿을 업로드할 수 있습니다.

    Screenshot showing the command for building your own template.

  5. 파일 로드를 선택합니다.

    Screenshot showing the command for uploading a template file.

  6. 편집한 새 템플릿을 찾아 선택한 다음, 열기를 선택합니다. 그러면 편집 창에 템플릿이 로드됩니다. 저장을 선택합니다.

    Screenshot showing loading the template.

  7. 사용자 지정 배포 페이지에서 다음 필드를 채우세요.

    구독: 사용할 구독을 선택합니다.

    리소스 그룹: 기존 리소스 그룹을 선택하거나 새 리소스 그룹을 만듭니다.

    지역: 기존 리소스 그룹을 선택한 경우 리소스 그룹의 위치와 일치하도록 지역이 채워집니다. 새 리소스 그룹을 만든 경우 이것은 해당 리소스 그룹의 위치입니다.

    연결 문자열: 허브의 연결 문자열을 입력합니다.

    허브 이름: 새 허브에 이름을 지정합니다.

    Screenshot showing the custom deployment page

  8. 검토 + 만들기 단추를 선택합니다.

  9. 생성 단추를 선택합니다. 포털은 템플릿의 유효성을 검사하고 새 허브를 배포합니다. 라우팅 구성 데이터가 있는 경우 해당 데이터는 새 허브에 포함되지만 이전 위치의 리소스를 가리킵니다.

    Screenshot showing the final custom deployment page

IoT 허브에 등록된 디바이스 관리

새 허브가 가동 중이므로, 이제 원본 허브의 모든 디바이스를 새 허브에 복사해야 합니다.

디바이스를 복사하는 여러 방법이 있습니다. 처음에 디바이스를 프로비저닝할 때 DPS(Device Provisioning Service)를 사용했을 수도 있고 사용하지 않았을 수도 있습니다. 그렇게 했다면 이 프로세스는 어렵지 않습니다. 그렇지 않은 경우 이 프로세스는 복잡할 수 있습니다.

디바이스를 프로비저닝할 때 DPS를 사용하지 않은 경우 다음 섹션을 건너뛰고 Import/Export를 사용하여 디바이스를 새 허브로 이동하는 것부터 시작하면 됩니다.

DPS를 사용하여 새 허브에서 디바이스 다시 프로비전

DPS를 사용하여 디바이스를 새 위치로 이동하려면 디바이스를 다시 프로비전하는 방법을 참조하세요. 모두 마쳤으면 Azure Portal에서 디바이스를 살펴보고 디바이스가 새 위치에 있는지 확인할 수 있습니다.

Azure Portal을 사용하여 새 허브로 이동합니다. 허브를 선택하고 IoT 디바이스를 선택합니다. 새 허브에 다시 프로비전된 디바이스가 표시됩니다. 새 허브의 속성을 볼 수도 있습니다.

라우팅을 구현한 경우 메시지가 리소스로 올바르게 라우팅되는지 테스트합니다.

DPS를 사용한 후 변경 내용 롤백

변경 내용을 롤백하려면 디바이스를 새 허브에서 기존 허브로 다시 프로비전합니다.

이제 허브와 허브의 디바이스 마이그레이션이 완료되었습니다. 정리로 건너뛰어도 됩니다.

import-export를 사용하여 디바이스를 새 허브로 이동

애플리케이션은 .NET Core를 대상으로 하기 때문에 Windows 또는 Linux에서 애플리케이션을 실행할 수 있습니다. 샘플을 다운로드하고, 연결 문자열을 검색하고, 실행하려는 비트의 플래그를 설정하고, 실행할 수 있습니다. 코드를 열지 않고도 이 작업을 수행할 수 있습니다.

샘플 다운로드

  1. C#용 Azure IoT SDK에서 IoT C# 샘플을 사용합니다. Zip 파일을 다운로드하고 컴퓨터에 압축을 풉니다.

  2. 관련 코드는 ./iothub/service/samples/how to guides/ImportExportDevicesSample에 있습니다. 애플리케이션을 실행하기 위해 코드를 보거나 편집할 필요는 없습니다.

  3. 애플리케이션을 실행하려면 3개의 연결 문자열과 5개의 옵션을 지정합니다. 이 데이터를 명령줄 인수로 전달하거나, 환경 변수를 사용하거나, 두 가지 방법을 조합하여 사용합니다. 여기서는 옵션을 명령줄 인수로 전달하고 연결 문자열을 환경 변수로 전달하겠습니다.

    이렇게 하는 이유는 연결 문자열이 길어서 보기 불편하고 변경될 가능성이 별로 없기 때문입니다. 하지만 원한다면 옵션을 변경하고 애플리케이션을 두 번 이상 실행할 수 있습니다. 환경 변수의 값을 변경하려면 사용 중인 명령 창과 Visual Studio 또는 Visual Studio Code를 닫아야 합니다.

옵션

애플리케이션을 실행할 때 지정하는 5가지 옵션은 다음과 같습니다.

  • addDevices(인수 1) - 자동으로 생성되는 가상 디바이스를 추가하려면 이 옵션을 True로 설정합니다. 이러한 디바이스는 원본 허브에 추가됩니다. 추가하려는 디바이스 수를 지정하려면 numToAdd(인수 2)도 설정합니다. 단일 허브에 등록할 수 있는 디바이스의 최대 수는 1,000,000개입니다. 이 옵션의 목적은 테스트용입니다. 특정 수의 디바이스를 생성한 다음, 다른 허브에 복사할 수 있습니다.

  • copyDevices(인수 3) - 한 허브에서 다른 허브로 디바이스를 복사하려면 이 옵션을 True로 설정합니다.

  • deleteSourceDevices(인수 4) - 원본 허브에 등록된 디바이스를 모두 삭제하려면 이 옵션을 True로 설정합니다. 모든 디바이스가 전송된 것이 확실할 때까지 기다렸다가 실행하는 것이 좋습니다. 디바이스를 삭제한 후에는 다시 가져올 수 없습니다.

  • deleteDestDevices(인수 5) - 대상 허브에 등록된 디바이스를 모두 삭제하려면 이 옵션을 True로 설정합니다. 디바이스를 두 번 이상 복사하려는 경우에 설정하는 것이 좋습니다.

기본 명령은 로컬 csproj 파일을 빌드하여 실행하도록 .NET에 지시하는 dotnet run입니다. 끝부분에 명령줄 인수를 추가한 후 실행합니다.

명령줄은 다음 예제와 비슷합니다.

    // 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 허브에 대한 연결 문자열과 임시 작업 파일에 사용할 수 있는 스토리지 계정에 대한 연결 문자열이 필요합니다. 이러한 값은 환경 변수에 저장됩니다.

  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. 환경 변수를 설정하는 명령을 한 번에 하나씩 복사하여 명령 프롬프트 창에 붙여넣고 Enter 키를 선택합니다. 모두 마쳤으면 명령 프롬프트 창에 SET을 입력하여 환경 변수 및 해당 값을 확인합니다. 이러한 항목을 명령 프롬프트 창에 복사한 후에는 새 명령 프롬프트 창을 열지 않는 한 다시 복사하지 않아도 됩니다.

  3. 현재 위치가 ./ImportExportDevicesSample(ImportExportDevicesSample.csproj 파일이 있는 위치)이 될 때까지 명령 프롬프트 창에서 디렉터리를 변경합니다. 그런 후 다음을 입력하고 명령줄 인수를 포함시킵니다.

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

    dotnet 명령은 애플리케이션을 빌드하고 실행합니다. 애플리케이션을 실행할 때 옵션을 전달하므로 애플리케이션을 실행할 때마다 해당 값을 변경할 수 있습니다. 예를 들어 애플리케이션을 한 번 실행하고 새 디바이스를 만들어서 다시 실행한 다음, 해당 디바이스를 새 허브로 복사하는 방식을 사용할 수 있습니다. 모든 단계를 동일한 실행에서 수행할 수도 있지만, 마이그레이션이 끝났다는 것을 확인하기 전에는 디바이스를 삭제하지 않는 것이 좋습니다. 다음은 디바이스 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. ImportExportDevicesSample 폴더의 Program.cs 맨 위에서 5개 옵션에 대한 변수를 설정합니다.

    // 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 스토리지 계정으로 이동한 후 devicefiles 컨테이너의 ImportErrors.log를 검사하여 가져오기/내보내기 오류를 확인합니다. 이 파일이 비어 있으면(크기가 0이면) 오류가 없는 것입니다. 동일한 디바이스를 두 번 이상 가져오려고 시도하면 두 번째 시도에서 디바이스가 거부되고 로그 파일에 오류 메시지가 추가됩니다.

변경 내용 커밋

허브를 새 위치로 복사하고 디바이스를 새 허브로 마이그레이션했습니다. 이제 디바이스가 새 허브에서 작동하도록 변경 작업을 수행해야 합니다.

변경 내용을 커밋하려면 다음 단계를 수행해야 합니다.

  • 각 디바이스를 업데이트하여 새 허브의 IoT Hub 호스트 이름을 가리키도록 IoT Hub 호스트 이름을 변경합니다. 디바이스를 처음 프로비전할 때 사용한 것과 동일한 방법을 사용하여 이 작업을 수행해야 합니다.

  • 이전 허브를 참조하는 모든 애플리케이션이 새 허브를 가리키도록 변경합니다.

  • 모두 마치면 새 허브가 작동합니다. 이전 허브는 활성 디바이스가 없고 연결되지 않은 상태입니다.

변경 내용 롤백

변경 내용을 롤백하기로 결정하는 경우 다음 단계를 수행합니다.

  • 각 디바이스를 업데이트하여 이전 허브의 IoT Hub 호스트 이름을 가리키도록 IoT Hub 호스트 이름을 변경합니다. 디바이스를 처음 프로비전할 때 사용한 것과 동일한 방법을 사용하여 이 작업을 수행해야 합니다.

  • 새 허브를 참조하는 모든 애플리케이션이 이전 허브를 가리키도록 변경합니다. 예를 들어 Azure Analytics를 사용하는 경우 Azure Stream Analytics 입력을 다시 구성해야 할 수도 있습니다.

  • 새 허브를 삭제합니다.

  • 라우팅 리소스가 있는 경우에는 이전 허브의 구성이 올바른 라우팅 구성을 가리켜야 하며, 허브를 다시 시작한 후에도 이러한 리소스와 함께 작동해야 합니다.

결과 확인

결과를 확인하려면 새 위치의 허브를 가리키도록 IoT 솔루션을 변경하고 실행합니다. 다시 말해서, 이전 허브에서 수행한 작업을 새 허브에서 똑같이 수행하고 올바르게 작동하는지 확인합니다.

라우팅을 구현한 경우 메시지가 리소스로 올바르게 라우팅되는지 테스트합니다.

정리

새 허브가 작동 중이고 디바이스가 올바르게 작동하는 것을 확인하기 전에는 리소스를 정리하지 마세요. 또한 해당 기능을 사용하는 경우에는 라우팅을 테스트해야 합니다. 준비되면 다음 단계를 수행하여 이전 리소스를 정리합니다.

  • 이전 허브를 아직 삭제하지 않은 경우 삭제합니다. 그러면 허브의 모든 활성 디바이스가 제거됩니다.

  • 라우팅 리소스를 새 위치로 이동한 경우 이전 라우팅 리소스를 삭제해도 됩니다.

다음 단계

IoT 허브를 새 지역의 새 허브로 마이그레이션하고 디바이스를 완료했습니다. IoT 허브에서 ID 레지스트리에 대한 대량 작업을 수행하는 방법에 대한 자세한 내용은 대량으로 IoT Hub 디바이스 ID 가져오기 및 내보내기를 참조하세요.