クイック スタート: 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 Quickstart Templates リポジトリから main.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 にメッセージを送信します。 Bicep ファイルによって IoT ハブで構成されたルートは、メッセージにメッセージ プロパティ 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. ストレージ アカウントをドリルダウンしてファイルを見つけます。

    ストレージ アカウントのファイルを確認する

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

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

    送信されたメッセージを確認する

    Note

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

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

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

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

az group delete --name exampleRG

次のステップ