자습서: 지역 대기 시간 프로비전

이 자습서에서는 할당 정책을 사용하여 여러 시뮬레이션된 대칭 키 디바이스를 IoT Hub 그룹에 안전하게 프로비저닝하는 방법을 보여 줍니다. IoT Hub DPS(Device Provisioning Service)는 기본 제공 할당 정책 및 사용자 지정 할당 정책에 대한 지원을 통해 다양한 할당 시나리오를 지원합니다.

지리적 위치/지역 대기 시간에 대한 프로비저닝은 일반적인 할당 시나리오입니다. 여러 위치 간에 디바이스를 이동하면서, 각 위치에 가장 가까운 IoT 허브로 디바이스를 프로비전하여 네트워크 대기 시간이 짧아집니다. 이 시나리오에서는 지역에 걸쳐 있는 IoT Hub 그룹이 등록을 위해 선택됩니다. 이러한 등록에 대해 기본 탑재 최저 대기 시간 할당 정책이 선택되었습니다. 이 정책에 따라 Device Provisioning Service는 디바이스 대기 시간을 평가하고 IoT Hub 그룹 중에서 가장 가까운 IoT Hub를 확인합니다.

이 자습서에서는 Azure IoT C SDK의 시뮬레이션된 디바이스 샘플을 사용하여 여러 지역에서 디바이스를 프로비전하는 방법을 보여 줍니다. 이 자습서에서 수행하는 단계는 다음과 같습니다.

  • Azure CLI를 사용하여 두 개의 지역별 IoT Hub(미국 서부 2미국 동부)를 만듭니다.
  • 지리적 위치(가장 짧은 대기 시간)를 기반으로 디바이스를 프로비전하는 등록 만들기
  • Azure CLI를 사용하여 같은 지역의 디바이스로 작동할 두 개의 지역별 Linux VM을 만듭니다(미국 서부 2미국 동부)
  • 두 Linux VM에서 Azure IoT C SDK에 대한 개발 환경 준비
  • 디바이스를 시뮬레이션하고 디바이스가 가장 가까운 지역의 IoT Hub에 프로비전되었는지 확인합니다.

Important

일부 지역에서는 때때로 Virtual Machines 만들기에 제한을 적용할 수 있습니다. 이 가이드를 작성할 때 westus2eastus 지역은 VM을 만들 수 있도록 허용했습니다. 해당 지역 중 하나에서 만들 수 없는 경우 다른 지역을 사용해 볼 수 있습니다. VM을 만들 때 Azure 지리적 지역을 선택하는 방법에 대한 자세한 내용은 Azure의 가상 머신에 대한 지역을 참조하세요

필수 조건

두 개의 지역별 IoT Hub 만들기

이 섹션에서는 Azure 리소스 그룹 및 두 개의 새로운 지역 IoT Hub 리소스를 만듭니다. 한 IoT 허브는 미국 서부 2 지역이며 다른 하나는 미국 동부 지역입니다.

Important

이 자습서에서 만든 모든 리소스에 대해 동일한 리소스 그룹을 사용하는 것이 좋습니다. 이렇게 하면 작업을 완료한 후 정리가 더 쉬워집니다.

  1. Azure Cloud Shell에서 다음 az group create 명령으로 리소스 그룹을 만듭니다.

    az group create --name contoso-us-resource-group --location eastus
    
  2. eastus 위치에 IoT Hub를 만들고 다음 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 Hub를 만들고 다음 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
    

    이 명령을 완료하는 데 몇 분 정도 걸릴 수 있습니다.

지역 대기 시간에 대한 등록 만들기

이 섹션에서는 테넌트 디바이스에 대한 새 등록 그룹을 만듭니다.

간단한 설명을 위해 이 자습서에서는 등록에 대칭 키 증명을 사용합니다. 더 안전한 솔루션을 위해 신뢰 체인과 함께 X.509 인증서 증명을 사용하는 것이 좋습니다.

  1. Azure Portal에 로그인하고, Device Provisioning Service 인스턴스로 이동합니다.

  2. 탐색 메뉴의 설정 섹션에서 등록 관리를 선택합니다.

  3. 등록 그룹 추가를 선택합니다.

  4. 등록 그룹 추가 페이지의 등록 + 프로비저닝 탭에서 다음 정보를 제공하여 등록 그룹 세부 정보를 구성합니다.

    필드 설명
    증명 증명 메커니즘으로 대칭 키를 선택합니다.
    대칭 키 설정 대칭 키 자동 생성 확인란을 선택합니다.
    그룹 이름 그룹 이름을 contoso-us-devices로 지정하거나 고유한 그룹 이름을 제공합니다. 등록 그룹 이름은 영숫자 문자의 대/소문자를 구분하지 않는 문자열(최대 128자 길이)과 특수 문자인 '-', '.', '_', ':'입니다. 마지막 문자는 영숫자 또는 대시('-')여야 합니다.
  5. 다음: IoT 허브를 선택합니다.

  6. 다음 단계를 사용하여 등록 그룹에 두 개의 IoT Hub를 추가합니다.

    1. 등록 그룹 추가 페이지의 IoT Hub 탭으로 이동하여 대상 IoT Hub 섹션에서 IoT Hub에 대한 링크 추가를 선택합니다.

    2. IoT Hub에 대한 링크 추가 페이지에서 eastus 지역에서 만든 IoT Hub를 선택하고 iothubowner 액세스 권한을 할당합니다.

    3. 저장을 선택합니다.

    4. IoT Hub에 대한 링크 추가를 다시 선택하고 동일한 단계에 따라 westus2 지역에서 만든 IoT Hub를 추가합니다.

    5. 대상 IoT Hub 드롭다운 메뉴에서 두 IoT Hub를 모두 선택합니다.

  7. 할당 정책에서 가장 낮은 대기 시간을 선택합니다.

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

  9. 검토 + 만들기 탭에서 모든 값을 확인한 다음 만들기를 선택합니다.

  10. 등록 그룹이 만들어지면 등록 그룹 목록에서 해당 이름 contoso-us-devices를 선택합니다.

  11. 기본 키 이 키는 나중에 시뮬레이션된 디바이스에 대한 고유한 디바이스 키를 생성하는 데 사용됩니다.

지역별 Linux VM 만들기

이 섹션에서는 미국 서부 2미국 동부 2에 하나씩 두 개의 지역 Linux VM(가상 머신)을 만듭니다. 이러한 VM은 각 지역에서 디바이스 시뮬레이션 샘플을 실행하여 두 지역의 디바이스에 대한 디바이스 프로비저닝을 보여 줍니다.

보다 쉽게 정리하기 위해 이러한 VM은 만들어진 IoT Hub 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. 두 개의 명령줄 셸을 엽니다.

  6. SSH를 사용하여 각 셸에서 지역별 VM 중 하나에 연결합니다.

    관리 사용자 이름과 복사했던 공용 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. 다음 명령을 사용하여 CMake, g++, gcc, Git을 설치합니다.

    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 디바이스 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 형식으로 변환됩니다.

Important

디바이스 코드에 그룹 마스터 키는 포함하지 않습니다.

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 Service 인스턴스에 보내는 디바이스 부팅 시퀀스를 시뮬레이트합니다. 부팅 시퀀스를 통해 디바이스가 인식되고 대기 시간에 따라 가장 가까운 IoT Hub에 할당됩니다.

  1. Azure Portal에서 Device Provisioning Service에 대한 개요 탭을 선택하고 ID 범위 값을 기록해 둡니다.

    Extract Device Provisioning Service endpoint information from the portal blade.

  2. 두 VMS에서 편집을 위해 ~/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 Hub에 할당됩니다.

    시뮬레이션 실행:

    ~/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이라는 동일한 리소스 그룹에 표시된 대로 이 자습서에서 모든 리소스를 만들었다고 가정합니다.

Important

리소스 그룹을 삭제하면 다시 되돌릴 수 없습니다. 리소스 그룹 및 그 안에 포함된 모든 리소스가 영구적으로 삭제됩니다. 잘못된 리소스 그룹 또는 리소스를 자동으로 삭제하지 않도록 해야 합니다. 보관할 리소스가 포함된 기존 리소스 그룹 내에 IoT Hub를 만든 경우 리소스 그룹을 삭제하지 말고 IoT Hub 리소스만 삭제하면 됩니다.

이름별로 리소스 그룹을 삭제하려면:

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

  2. 리소스 그룹을 선택합니다.

  3. 이름별 필터... 텍스트 상자에 리소스 contoso-us-resource-group을 포함하는 리소스 그룹의 이름을 입력합니다.

  4. 결과 목록의 리소스 그룹 오른쪽에서 ...를 클릭한 다음, 리소스 그룹 삭제를 클릭합니다.

  5. 리소스 그룹을 삭제할지 확인하는 메시지가 표시됩니다. 리소스 그룹의 이름을 다시 입력하여 확인한 다음, 삭제를 선택합니다. 잠시 후, 리소스 그룹 및 해당 그룹에 포함된 모든 리소스가 삭제됩니다.

다음 단계

사용자 지정 할당 정책에 대해 자세히 알아보려면 다음을 참조하세요.