【Azure IoT Hub】SAS Token은 New-AzIotHubSasToken이 아닌 az iot hub generate-sas-token에서 발행한다

tl;dr


  • New-AzIotHubSasToken 대신 az iot hub generate-sas-token 를 사용합시다.
  • 또한 AzureRM은 2020 년 12 월에 지원이 종료됩니다.

    경위



    일본에서 전개하고 있는 서비스를 중국에서도 전개하게 되었습니다.
    Azure IoT Hub에 REST API를 통해 액세스하는 위치가 있었으므로 리소스 배포 후 SAS Token을 얻으면 성공적으로 연결할 수 없습니다. (전, 어떻게 만들었나?)

    또한 다음 명령은 모두 PowerShell입니다.

    시도 1: Azure 포털에서 Azure Cloud Shell 실행



    아래 이미지를 보면 알 수 있듯이 중국 리전에서는 Cloud Shell이 ​​배포되지 않은 것 같습니다.
    아, 어쩌지…


    시도 2 : New-AzIotHubSasToken 명령으로 SAS Token 게시



    우연히 PC에 들어간 것이 AzureRM이었습니다.
    그렇기 때문에, 매우 훌륭하게 벽에 맞춰 버렸습니다.

    절차



    로그인
    connect-azaccount -environment azurechinacloud
    

    중국 지역은 -environment azurechinacloud 필수입니다.
    엔드포인트에 대한 자세한 내용은 Azure와 독립적인 클라우드에서 Azure PowerShell로 스토리지 관리 > 엔드포인트 접미사을 참조하십시오.

    의기양양과 IoT Hub의 SAS Token을 발행합니다.
    New-AzIotHubSasToken
      -ResourceGroupName "{resourceGroupName}"
      -IotHubName "{iotHubName}"
      -Duration 31104000
      -KeyName "iothubowner"
    

    액세스할 수 있는지 시도해 봅니다.
    Invoke-WebRequest
      https://{iotHubName}.azure-devices.cn/twins/{deviceName}?api-version=2018-06-30
      -Headers @{
        "Authorization"="SharedAccessSignature sr={iotHubName}.azure-devices.cn&sig=x&se=x&skn=iothubowner"
      }
    

    오류가 있습니다.
    {
        "Message": "ErrorCode:IotHubUnauthorizedAccess;Unauthorized",
        "ExceptionMessage": "Tracking ID:00000000000000000000000000000000-G:7-TimeStamp:08/25/2020 00:00:00"
    }
    

    Unauthorized ··.
    SAS Token이 잘못되었기 때문에 원인이지만 SAS Token을 보내지 않아도 (비어도) 동일한 메시지가 반환되므로 처음에는 무엇이 원인인지 알지 못했습니다.

    시도 3: az iot hub generate-sas-token 명령으로 SAS Token 발급



    절차



    Azure CLI(Azure PowerShell Az 모듈) 설치
    - Azure CLI 설치

    로그인하고 구독을 지정합니다.
    az login --tenant {tenantName}
    az account set --subscription {subscriptionId}
    

    의심 어깨가 되면서 SAS Token을 발행해 보겠습니다.
    az iot hub generate-sas-token -n {iotHubName}
    

    액세스할 수 있는지 시도해 봅니다.
    Invoke-WebRequest
      https://{iotHubName}.azure-devices.cn/twins/{deviceName}?api-version=2018-06-30
      -Headers @{
        "Authorization"="SharedAccessSignature sr={iotHubName}.azure-devices.cn&sig=x&se=x&skn=iothubowner"
      }
    

    오, 잘 작동했습니다.
    StatusCode        : 200
    StatusDescription : OK
    Content           : {"deviceId":"x","etag":"x","deviceEtag":"x","status":"enabled
                        ","statusUpdateTime":"0001-01-01T00:00:00Z","connectionState":"Disconnected","lastActivityTime":"20
                        20...
    RawContent        : HTTP/1.1 200 OK
                        Vary: Origin
                        x-ms-request-id: 00000000-0000-0000-0000-000000000000
                        Content-Length: 1199
                        Content-Type: application/json; charset=utf-8
                        Date: Tue, 25 Aug 2020 00:00:00 GMT
                        Server: ...
    Forms             : {}
    Headers           : {[Vary, Origin], [x-ms-request-id, 00000000-0000-0000-0000-000000000000], [Content-Length, 1199], [
                        Content-Type, application/json; charset=utf-8]...}
    Images            : {}
    InputFields       : {}
    Links             : {}
    ParsedHtml        : mshtml.HTMLDocumentClass
    RawContentLength  : 1199
    

    덤: Visual Studio Code 확장(vscode-azure-iot-toolkit)으로 SAS Token 발급



    Visual Studio Code의 확장 기능을 사용하면 매우 쉽게 SAS Token을 게시할 수 있습니다.

    하지만 장치별 SAS Token은 제대로 작동하지 않습니다.
    왜?

    장치 트윈을 얻는 방법


    curl -X GET "https://{iotHubName}.azure-devices.cn/twins/{deviceName}?api-version=2018-06-30"
         -H "Authorization: SharedAccessSignature sr=x&sig=x&se=x&skn=iothubowner"
    

    잡기



    덧붙여서, 이 건을 조사하고 있으면, 자신이 쓴 기사를 찾아 「커맨드 바꾸었던 정도로 발행된 Token 바뀌는 것이 아닐까」라고 생각해, 시험하는 것이 늦었습니다.

    과거의 나, 미안해.
  • Azure Iot Hub의 직접 메소드를 REST API에서 호출

  • 출력은 정말 중요합니다.
    그리고, 편견과 선입관을 가지지 않고, 기사를 읽어 봅시다.

    이상.

    좋은 웹페이지 즐겨찾기