Share via


クイック スタート: Bicep を使用して Azure IoT ハブとストレージ アカウントをデプロイする

このクイック スタートでは、Bicep を使用して、IoT ハブ、Azure Storage アカウント、および IoT ハブからストレージにメッセージを送信するルートを作成します。 ハブは、ハブに送信されたメッセージがルーティング条件を満たす場合にストレージ アカウントに自動的にルーティングされるように構成されます。 このクイックスタートの最後には、ストレージ アカウントを開いて、送信されたメッセージを確認することができます。

Bicep は、宣言型の構文を使用して Azure リソースをデプロイするドメイン固有言語 (DSL) です。 簡潔な構文、信頼性の高いタイプ セーフ、およびコードの再利用のサポートが提供されます。 Bicep により、Azure のコード ソリューションとしてのインフラストラクチャに最適な作成エクスペリエンスが実現します。

前提条件

Bicep ファイルを確認する

このクイックスタートで使用される Bicep ファイルは、Azure クイックスタート テンプレートから 101-iothub-auto-route-messages と呼ばれます。

Bicep ファイルには、次の 2 つの Azure リソースが定義されています。

  • Microsoft.Storage/storageAccounts: コンテナーを含むストレージ アカウント。
  • Microsoft.Devices/IotHubs: ストレージ コンテナーを指すエンドポイントと、フィルター処理されたメッセージをそのエンドポイントに送信するルートを持つ IoT ハブ。
@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 クイック スタート テンプレート リポジトリから メイン.bicep ファイルをダウンロードします。

  2. Azure CLI を使用して Bicep ファイルをデプロイしてリソースを作成します。

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

    デプロイが完了するまで、数分間かかります。 デプロイが完了すると、デプロイされたリソースの詳細を示す出力が表示されます。

device-to-cloud メッセージを送信する

このセクションでは、新しい IoT ハブにデバイスを登録し、そのデバイスから IoT Hub にメッセージを送信します。 IoT ハブで Bicep ファイルが構成したルートは、メッセージ プロパティが含まれている場合にのみメッセージをストレージに送信します level=storage。 このルーティング条件が期待どおりに動作することをテストするために、そのプロパティを含むいくつかのメッセージを送信し、一部のメッセージは送信しません。

ヒント

このクイック スタートでは、利便性のために Azure CLI のシミュレートされたデバイスを使用します。 ルーティング用のメッセージ プロパティを使用してデバイスからクラウドへのメッセージを送信するコード例については、Azure IoT SDK for .NET の 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. ストレージ アカウントをドリルダウンしてファイルを見つけます。

    Look at the storage account files

  3. いずれかのファイルを選択して [ダウンロード] を選択し、後で見つけやすい場所にそのファイルをダウンロードします。 これには、47 のような数値の名前があります。 末尾に " .txt" を追加し、ファイルをダブルクリックして開きます。

  4. 開いたファイルの各行は、異なるメッセージに対するものです。 また、各メッセージの本文は暗号化されています。 メッセージの本文に対してクエリを実行するためには、そのようになっている必要があります。

    View the sent messages

    Note

    これらのメッセージは UTF-8 および base64 でエンコードされます。 メッセージを読み返す場合は、base64 と utf-8 からデコードして ASCII として読み取る必要があります。 興味がある方は、ルーティングのチュートリアルで説明されている ReadOneRowFromFile メソッドを使用して、これらのメッセージ ファイルのうちから 1 つを読み取り、ASCII にデコードしてみてください。 ReadOneRowFromFile は、このクイックスタートで解凍した IoT C# SDK リポジトリにあります。 そのフォルダー の上部からのパスを次に示します。./iothub/device/samples/how to guides/HubRoutingSample/Program.cs ブール値 readTheFile を true に設定し、パスをディスク上のファイルにハードコードすると、ファイルの最初の行が開いて変換されます。

このクイック スタートでは、Bicep ファイルをデプロイして IoT ハブとストレージ アカウントを作成し、プログラムを実行してハブにメッセージを送信しました。 メッセージは、メッセージのプロパティに基づいてルーティングされ、表示できるストレージ アカウントに格納されます。

リソースをクリーンアップする

作成したリソースが不要になったら、リソース グループを削除してください。

az group delete --name exampleRG

次のステップ