다음을 통해 공유


빠른 시작: Bicep을 사용하여 Azure IoT 허브 및 스토리지 계정 배포

이 빠른 시작에서는 Bicep을 사용하여 IoT 허브, Azure Storage 계정 및 IoT 허브에서 스토리지로 메시지를 보내는 경로를 만듭니다. 허브가 라우팅 조건을 충족하는 경우 허브로 전송된 메시지가 스토리지 계정으로 자동으로 라우팅되도록 구성됩니다. 이 빠른 시작이 완료되면 스토리지 계정을 열어 보낸 메시지를 확인할 수 있습니다.

Bicep은 선언적 구문을 사용하여 Azure 리소스를 배포하는 DSL(도메인 특정 언어)입니다. 간결한 구문, 신뢰할 수 있는 형식 안전성 및 코드 다시 사용에 대한 지원을 제공합니다. Bicep은 Azure에서 코드형 인프라 솔루션에 대한 최고의 제작 환경을 제공합니다.

사전 요구 사항

Bicep 파일 검토

이 빠른 시작에 사용된 Bicep 파일의 이름은 Azure 빠른 시작 템플릿101-iothub-auto-route-messages입니다.

Bicep 파일에는 두 개의 Azure 리소스가 정의되어 있습니다.

@description('Define the project name or prefix for all objects.')
@minLength(1)
@maxLength(11)
param projectName string = 'contoso'

@description('The datacenter to use for the deployment.')
param location string = resourceGroup().location

@description('The SKU to use for the IoT Hub.')
param skuName string = 'S1'

@description('The number of IoT Hub units.')
param skuUnits int = 1

@description('Partitions used for the event stream.')
param d2cPartitions int = 4

var iotHubName = '${projectName}Hub${uniqueString(resourceGroup().id)}'
var storageAccountName = '${toLower(projectName)}${uniqueString(resourceGroup().id)}'
var storageEndpoint = '${projectName}StorageEndpont'
var storageContainerName = '${toLower(projectName)}results'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'Storage'
  properties: {
    allowBlobPublicAccess: false
    minimumTlsVersion: 'TLS1_2'
    supportsHttpsTrafficOnly: true
  }
}

resource container 'Microsoft.Storage/storageAccounts/blobServices/containers@2023-01-01' = {
  name: '${storageAccountName}/default/${storageContainerName}'
  properties: {
    publicAccess: 'None'
  }
  dependsOn: [
    storageAccount
  ]
}

resource IoTHub 'Microsoft.Devices/IotHubs@2023-06-30' = {
  name: iotHubName
  location: location
  sku: {
    name: skuName
    capacity: skuUnits
  }
  properties: {
    eventHubEndpoints: {
      events: {
        retentionTimeInDays: 1
        partitionCount: d2cPartitions
      }
    }
    routing: {
      endpoints: {
        storageContainers: [
          {
            connectionString: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
            containerName: storageContainerName
            fileNameFormat: '{iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm}'
            batchFrequencyInSeconds: 100
            maxChunkSizeInBytes: 104857600
            encoding: 'JSON'
            name: storageEndpoint
          }
        ]
      }
      routes: [
        {
          name: 'ContosoStorageRoute'
          source: 'DeviceMessages'
          condition: 'level="storage"'
          endpointNames: [
            storageEndpoint
          ]
          isEnabled: true
        }
      ]
      fallbackRoute: {
        name: '$fallback'
        source: 'DeviceMessages'
        condition: 'true'
        endpointNames: [
          'events'
        ]
        isEnabled: true
      }
    }
    messagingEndpoints: {
      fileNotifications: {
        lockDurationAsIso8601: 'PT1M'
        ttlAsIso8601: 'PT1H'
        maxDeliveryCount: 10
      }
    }
    enableFileUploadNotifications: false
    cloudToDevice: {
      maxDeliveryCount: 10
      defaultTtlAsIso8601: 'PT1H'
      feedback: {
        lockDurationAsIso8601: 'PT1M'
        ttlAsIso8601: 'PT1H'
        maxDeliveryCount: 10
      }
    }
  }
}

output name string = IoTHub.name
output resourceId string = IoTHub.id
output resourceGroupName string = resourceGroup().name
output location string = location

Bicep 파일 배포

이 섹션에서는 Bicep 파일을 배포하는 단계를 제공합니다.

  1. Azure 빠른 시작 템플릿 리포지토리에서 main.bicep 파일을 다운로드합니다.

  2. Azure CLI를 사용하여 Bicep 파일을 배포하여 리소스를 만듭니다.

    az group create --name ContosoResourceGrp --location eastus
    az deployment group create --resource-group exampleRG --template-file main.bicep
    

    배포를 완료하려면 몇 분이 걸립니다. 배포가 완료되면 배포된 리소스를 자세히 설명하는 출력이 표시됩니다.

디바이스-클라우드 메시지 보내기

이 섹션에서는 새 IoT 허브에 디바이스를 등록한 다음 해당 디바이스에서 IoT Hub로 메시지를 보냅니다. IoT 허브에 구성된 Bicep 파일이 메시지 속성 level=storage를 포함하는 경우에만 스토리지로 메시지를 보내는 경로입니다. 이 라우팅 조건이 예상대로 작동하는지 테스트하기 위해 해당 속성과 함께 일부 메시지를 보내고 일부는 속성 없이 보냅니다.

이 빠른 시작에서는 편의를 위해 Azure CLI 시뮬레이션된 디바이스를 사용합니다. 라우팅을 위한 메시지 속성이 있는 디바이스-클라우드 메시지를 보내는 코드 예제는 .NET용 Azure IoT SDK의 HubRoutingSample을 참조하세요.

  1. 템플릿에서 만든 IoT 허브의 이름을 검색합니다.

    이전 섹션에서 기본 명령을 사용한 경우 리소스가 ContosoResourceGrp 리소스 그룹에 생성되었습니다. 다른 리소스 그룹을 사용한 경우 일치하도록 다음 명령을 업데이트합니다.

    az iot hub list --resource-group ContosoResourceGrp --output table
    
  2. 출력에서 IoT 허브의 이름을 복사합니다. contosoHub{randomidentifier} 형식으로 지정해야 합니다.

  3. 허브에 디바이스를 추가합니다.

    az iot hub device-identity create --device-id contosoDevice --hub-name {YourIoTHubName} 
    
  4. 디바이스를 시뮬레이션하고 디바이스-클라우드 메시지를 보냅니다.

    --data 매개 변수를 사용하면 메시지 본문을 설정할 수 있습니다.

    az iot device simulate \
      --device-id contosoDevice \
      --hub-name {YourIoTHubName} \
      --data "This message won't be routed."
    

    시뮬레이터는 100개의 메시지를 보낸 다음 연결을 해제합니다. 이 빠른 시작의 목적을 위해 100개를 모두 기다릴 필요는 없습니다.

    Azure CLI는 메시지를 보낼 때 메시지를 인쇄하지 않습니다. 허브에 도착하는 메시지를 확인하려면 Visual Studio Code용 Azure IoT Hub 확장을 설치하고 이를 사용하여 기본 제공 엔드포인트를 모니터링할 수 있습니다.

  5. 스토리지로 라우팅할 디바이스-클라우드 메시지를 보냅니다.

    --properties 매개 변수를 사용하면 메시지, 애플리케이션 또는 시스템 속성을 기본 메시지에 추가할 수 있습니다. 이 빠른 시작의 경우 IoT 허브의 경로에서 메시지 속성 level=storage가 포함된 메시지를 찾습니다.

    az iot device simulate \
      --device-id contosoDevice \
      --hub-name {YourIoTHubName} \
      --properties level=storage \
      --data "This message will be routed to storage."
    

라우팅된 메시지 검토

  1. Azure Portal에 로그인하고 리소스 그룹을 선택한 다음 스토리지 계정을 선택합니다.

  2. 파일을 찾을 때까지 스토리지 계정을 드릴다운합니다.

    스토리지 계정 파일 보기

  3. 파일 중 하나를 선택하고, 다운로드를 선택하여 파일을 나중에 찾을 수 있는 위치에 다운로드합니다. 47과 같은 숫자의 이름이 있습니다. .txt를 끝에 추가한 다음, 파일을 두 번 클릭하여 엽니다.

  4. 파일을 열면 각 행은 다른 메시지에 대한 것입니다. 각 메시지의 본문도 암호화됩니다. 이는 메시지 본문에 대한 쿼리를 수행하는 데 반드시 필요한 것입니다.

    보낸 메시지 보기

    참고 항목

    이러한 메시지는 UTF-8 및 base64로 인코딩됩니다. 메시지를 다시 읽는 경우 ASCII로 읽으려면 base64 및 utf-8에서 디코딩해야 합니다. 관심이 있는 경우 라우팅 자습서의 ReadOneRowFromFile 메서드를 사용하여 이러한 메시지 파일 중 하나에서 한 항목을 읽어 ASCII로 디코딩할 수 있습니다. ReadOneRowFromFile은 이 빠른 시작을 위해 압축을 푼 IoT C# SDK 리포지토리에 있습니다. 다음은 해당 폴더 상단의 경로입니다. ./iothub/device/samples/how to guides/HubRoutingSample/Program.cs 부울 readTheFile을 true로 설정하고 경로를 다음으로 하드코딩합니다. 파일을 디스크에 저장하고 파일의 첫 번째 행을 열고 변환합니다.

이 빠른 시작에서 Bicep 파일을 배포하여 IoT 허브 및 스토리지 계정을 만들고, 프로그램을 실행하여 메시지를 허브에 보내는 프로그램을 실행했습니다. 메시지는 메시지 속성에 따라 라우팅되고 메시지를 볼 수 있는 스토리지 계정에 저장됩니다.

리소스 정리

만든 리소스가 더 이상 필요하지 않은 경우 해당 리소스 그룹을 삭제합니다.

az group delete --name exampleRG

다음 단계