Event Hubs に IoT データをエクスポートする

この記事では、Event Hubs にデータを送信するようにデータ エクスポートを構成する方法について説明します。

この機能を使用して、フィルター処理およびエンリッチ化された IoT データを IoT Central アプリケーションから連続エクスポートします。 データ エクスポートを使用すると、ウォーム パスの分析情報、分析、およびストレージ用に、クラウド ソリューションの他の部分にほぼリアルタイムで変更がプッシュされます。

たとえば、次のように操作できます。

  • テレメトリ、プロパティ変更、デバイスの接続性、デバイスのライフサイクル、デバイスのテンプレートのライフサイクル、および監査ログ データを、JSON 形式で、ほぼリアルタイムで継続的にエクスポートする
  • データ ストリームをフィルター処理して、カスタム条件に一致するデータをエクスポートする
  • デバイスからのカスタム値とプロパティ値を使用してデータ ストリームをエンリッチ化する
  • データ ストリームを変換して、形態とコンテンツを変更します。

ヒント

データ エクスポートを有効にすると、その時点以降のデータのみが取得されます。 より多くの履歴データを保持するには、データ エクスポートを早い段階で有効にしてください。 データ エクスポートが無効になっていたときからのデータを手動でエクスポートするには、「IoT Central REST API を使ってデバイスのクエリを実行する方法」を参照してください。

Note

状況によっては、メッセージがエクスポートされるまでに最大 60 秒かかる場合があります。 これは、IoT Central が基になる IoT ハブからメッセージを受信した時点から、メッセージが宛先エンドポイントに配信されるまでの時間です。

前提条件

データ エクスポート機能を使用するには、データ エクスポートのアクセス許可が必要です。

Event Hubs エクスポート先を設定する

データは、IoT Central からほぼリアルタイムでエクスポートされます。 データはメッセージ本文に含まれ、UTF-8 としてエンコードされた JSON 形式です。

メッセージの注釈またはシステム プロパティ バッグ内には、メッセージ本文の対応するフィールドと同じ値を持つ iotcentral-device-idiotcentral-application-idiotcentral-message-source、および iotcentral-message-type フィールドがあります。

接続オプション

エクスポート先が Event Hubs の場合、"接続文字列" またはマネージド ID を使用して接続を構成することができます。

セキュリティは、マネージド ID の方が優れています。その理由は次のとおりです。

  • IoT Central アプリケーションの接続文字列にリソースの資格情報が格納されません。
  • 資格情報は、IoT Central アプリケーションの有効期間に自動的に関連付けられます。
  • マネージド ID では、セキュリティ キーの定期的なローテーションが自動的に行われます。

現在、IoT Central では、システム割り当てマネージド ID が使用されます。

マネージド ID を構成する場合、構成には スコープ" と ロール が含まれます:

  • スコープでは、マネージド ID を使用できる場所を定義します。 たとえば、スコープとして Azure リソース グループを使用できます。 この場合、IoT Central アプリケーションとエクスポート先の両方が同じリソース グループに含まれている必要があります。
  • ロールでは、エクスポート先のサービスで IoT Central アプリケーションに付与されるアクセス許可を定義します。 たとえば、IoT Central アプリケーションがイベント ハブにデータを送信するには、マネージド ID に Azure Event Hubs のデータ送信者ロールの割り当てが必要です。

次のビデオでは、システム割り当てマネージド ID の詳細について説明します。

注意

BLOB ストレージにエクスポートするには、ビデオに示すように、ストレージ アカウント共同作成者を使用しないでください。 代わりにストレージ BLOB データ共同作成者ロールを使用してください。

Event Hubs の宛先を作成する

この記事では、Azure CLI でマネージド ID を作成する方法について説明します。 また、Azure portal を使用して、マネージド ID を作成することもできます。

エクスポート先とする既存の Event Hubs 名前空間がない場合は、Azure Cloud Shell bash 環境で次のスクリプトを実行します。 このスクリプトにより、リソース グループ、Event Hubs 名前空間、イベント ハブが作成されます。 その後、このスクリプトによって IoT Central アプリケーションのマネージド ID が有効になり、イベント ハブにアクセスするために必要なロールが割り当てられます。

# Replace the Event Hubs namespace name with your own unique value
EHNS=your-event-hubs-namespace-$RANDOM

# Replace the IoT Central app name with the name of your
# IoT Central application.
CA=your-iot-central-app

EH=exportdata
RG=centralexportresources
LOCATION=eastus

RGID=$(az group create -n $RG --location $LOCATION --query "id" --output tsv)
az eventhubs namespace create --name $EHNS --resource-group $RG -l $LOCATION
az eventhubs eventhub create --name $EH --resource-group $RG --namespace-name $EHNS

# This assumes your IoT Central application is in the 
# default `IOTC` resource group.
az iot central app identity assign --name $CA --resource-group IOTC --system-assigned
PI=$(az iot central app identity show --name $CA --resource-group IOTC --query "principalId" --output tsv)

az role assignment create --assignee $PI --role "Azure Event Hubs Data Sender" --scope $RGID

az role assignment list --assignee $PI --all -o table

echo "Host name: $EHNS.servicebus.windows.net"
echo "Event Hub: $EH"

イベント ハブをさらにセキュリティで保護し、マネージド ID を使用する信頼されたサービスからのアクセスのみを許可するには、「Azure Virtual Network 上のセキュリティで保護された宛先にデータをエクスポートする」を参照してください。

IoT Central の [データ エクスポート] ページで Event Hubs をエクスポート先として作成するには:

  1. [+ New destination](+ 新しい宛先) を選択します。

  2. 宛先の種類として [Azure Event Hubs] を選択します。

  3. 認可の種類として [システム割り当てマネージド ID] を選択します。

  4. Event Hubs リソースのホスト名を入力します。 次に、大文字と小文字を区別してイベントハブ名を入力します。 ホスト名は、contoso-waste.servicebus.windows.net のようになります。

  5. [保存] を選択します。

宛先サービスにデータが到着しない場合は、「Azure IoT Central アプリケーションからのデータ エクスポートに関する問題のトラブルシューティング」を参照してください。

データ エクスポートの設定

データのエクスポート先を準備したので、IoT Central アプリケーションでデータのエクスポートを設定します。

  1. ご使用の IoT Central アプリケーションにサインインします。

  2. 左側のペインで、[データのエクスポート] を選択します。

    ヒント

    左側のペインに [データのエクスポート] が表示されない場合は、アプリでデータ エクスポートを構成するアクセス許可がありません。 データ エクスポートの設定について、管理者に問い合わせてください。

  3. [+ 新しいエクスポート] を選択します。

  4. 新しいエクスポートの表示名を入力し、データ エクスポートが [有効] になっていることを確認します。

  5. エクスポートするデータの種類を選択します。 次の表は、サポートされるデータ エクスポートの型の一覧を示します。

    データの種類 説明 データ形式
    テレメトリ デバイスからのテレメトリ メッセージがほぼリアルタイムでエクスポートされます。 エクスポートされた各メッセージには、元のデバイス メッセージの完全な内容が正規化されて含まれます。 テレメトリ メッセージの形式
    プロパティ変更 デバイスとクラウドのプロパティに対する変更がほぼリアルタイムでエクスポートされます。 読み取り専用のデバイス プロパティでは、報告された値に対する変更がエクスポートされます。 読み取り/書き込みプロパティの場合、報告された値と必要な値の両方がエクスポートされます。 プロパティ変更メッセージの形式
    デバイスの接続性 デバイスの接続イベントと非接続イベントをエクスポートします。 デバイス接続メッセージの形式
    デバイスのライフサイクル デバイスの登録、削除、プロビジョニング、有効化、無効化、displayNameChanged、および deviceTemplateChanged のイベントをエクスポートします。 デバイスのライフサイクル変更メッセージの形式
    デバイス テンプレートのライフサイクル created、updated、および deleted など、発行されたデバイス テンプレートの変更をエクスポートします。 デバイス テンプレートのライフサイクル変更メッセージの形式
    監査ログ アプリケーション内のエンティティに対してユーザーが開始した更新のログ。 詳細については、「監査ログを使用して IoT Central アプリケーションのアクティビティを追跡する」を参照してください 監査ログ メッセージの形式
  6. 必要に応じて、フィルターを追加して、エクスポートするデータの量を減らします。 使用できるフィルターの種類は、データ エクスポートの種類ごとに異なります。

    データの種類 使用可能なフィルター
    テレメトリ
    • デバイス名、デバイス ID、デバイス テンプレート、デバイスがシミュレートされているかどうかでフィルター処理します
    • フィルター条件を満たすテレメトリのみが含まれるようにストリームをフィルター処理します
    • フィルター条件に一致するプロパティを持つデバイスのテレメトリのみが含まれるようにストリームをフィルター処理します
    • フィルター条件を満たし、"メッセージ プロパティ" を含むテレメトリのみが含まれるようにストリームをフィルター処理します。 "メッセージ プロパティ" ("アプリケーション プロパティ" とも呼ばれます) は、各テレメトリ メッセージのキーと値のペアのバッグとして送信されます。 メッセージ プロパティ フィルターを作成するには、検索するメッセージ プロパティ キーを入力し、条件を指定します。 指定したフィルター条件に一致するプロパティを持つテレメトリ メッセージのみがエクスポートされます。 アプリケーション プロパティの詳細については、IoT Hub のドキュメントを参照してください
    プロパティ変更
    • デバイス名、デバイス ID、デバイス テンプレート、デバイスがシミュレートされているかどうかでフィルター処理します
    • フィルター条件を満たすプロパティ変更のみが含まれるようにストリームをフィルター処理します
    デバイスの接続性
    • デバイス名、デバイス ID、デバイス テンプレート、組織、デバイスがシミュレートされているかどうかでフィルター処理します
    • フィルター条件に一致するプロパティを持つデバイスの変更のみが含まれるようにストリームをフィルター処理します
    デバイスのライフサイクル
    • デバイス名、デバイス ID、デバイス テンプレート、デバイスがプロビジョニング、有効化、またはシミュレートされているかどうかでフィルター処理します
    • フィルター条件に一致するプロパティを持つデバイスの変更のみが含まれるようにストリームをフィルター処理します
    デバイス テンプレートのライフサイクル
    • デバイス テンプレートでフィルター処理します
    監査ログ 該当なし
  7. 必要に応じて、余分なキーと値のペアのメタデータを使用して、エクスポートされたメッセージを強化します。 次のエンリッチメントは、テレメトリ、プロパティ変更、デバイスの接続性、デバイスのライフサイクルの各データ エクスポートの種類で使用できます。

    • カスタム文字列: 各メッセージにカスタムの静的文字列を追加します。 任意のキーを入力し、任意の文字列値を入力します。
    • プロパティ: 各メッセージに追加されます。
      • デバイス名、デバイス テンプレート名、有効、組織、プロビジョニング済み、シミュレート済みなどのデバイス メタデータ。
      • 各メッセージに対してデバイスから報告された現在のプロパティまたはクラウド プロパティの値。 エクスポートされたメッセージが、指定したプロパティを持たないデバイスからのものである場合、エクスポートされたメッセージにはそのエンリッチメントがありません。

エクスポート先を構成します。

  1. [+ Destination]\(+ エクスポート先\) を選択し、既に作成してあるエクスポート先を追加するか [新規作成する] を選択します。

  2. エクスポート前にデータを変換するには、[+ 変換] を選択します。 詳しくは、「IoT Central アプリケーション内のデータをエクスポート用に変換する」を参照してください。

  3. [+ Destination]\(+ エクスポート先\) を選択して、1 回のエクスポートに最大 5 つのエクスポート先を追加します。

  4. エクスポートの設定が完了したら、[保存] を選択します。 数分後に、エクスポート先にデータが表示されます。

エクスポートの監視

エクスポートの状態は、IoT Central の [Data export]\(データのエクスポート\) ページで確認できます。 Azure Monitor を使用して、エクスポートするデータの量とエクスポート エラーを確認することもできます。 エクスポートとデバイスの正常性のメトリックには、Azure portal 内のグラフ、REST API、または PowerShell や Azure CLI のクエリを使ってアクセスできます。 現時点では、Azure Monitor で次のデータ エクスポート メトリックを監視できます。

  • フィルター適用前のエクスポート対象受信メッセージの数。
  • フィルターを通過したメッセージの数。
  • 宛先に正常にエクスポートされたメッセージの数。
  • 見つかったエラーの数。

詳細については、「アプリケーションの正常性を監視する」を参照してください。

データ形式

以降のセクションでは、エクスポート データの形式について説明します。

テレメトリ形式

エクスポートされた各メッセージには、メッセージ本文でデバイスから送信された、完全なメッセージが正規化された形式で含まれます。 メッセージは JSON 形式で、UTF-8 としてエンコードされます。 各メッセージに含まれる情報は次のとおりです。

  • applicationId: IoT Central アプリケーションの ID。
  • messageSource: メッセージのソース - telemetry
  • deviceId: テレメトリ メッセージを送信したデバイスの ID。
  • schema: ペイロード スキーマの名前とバージョン。
  • templateId: デバイスに割り当てられているデバイス テンプレートの ID。
  • enqueuedTime: IoT Central がこのメッセージを受信した時刻。
  • enrichments: エクスポートに設定されたエンリッチメント。
  • module: このメッセージを送信した IoT Edge モジュール。 このフィールドは、メッセージが IoT Edge モジュールから送信された場合にのみ表示されます。
  • component: このメッセージを送信したコンポーネント。 このフィールドは、メッセージで送信された機能がデバイス テンプレートでコンポーネントとしてモデル化されている場合にのみ表示されます。
  • messageProperties: デバイスによってメッセージと共に送信されるその他のプロパティ。 これらのプロパティはアプリケーション プロパティと呼ばれることもあります。 詳細については IoT Hub のドキュメントを参照してください

メッセージ プロパティ

テレメトリ メッセージには、テレメトリ ペイロードに加え、メタデータのプロパティが含まれています。 前のスニペットは、deviceIdenqueuedTime など、システム メッセージの例を示しています。 システム メッセージ プロパティの詳細については、「D2C IoT Hub メッセージのシステム プロパティ」を参照してください。

テレメトリ メッセージにカスタム メタデータを追加する必要がある場合、テレメトリ メッセージにプロパティを追加できます。 たとえば、デバイスでメッセージが作成されるとき、タイムスタンプを追加する必要があります。

次のコード スニペットは、デバイス上でメッセージを作成するとき、それに iothub-creation-time-utc プロパティを追加する方法を示しています。

重要

このタイムスタンプの形式は、タイムゾーン情報を含まない UTC であることが必要です。 たとえば、2021-04-21T11:30:16Z は有効で、2021-04-21T11:30:16-07:00 は無効です。

async function sendTelemetry(deviceClient, index) {
  console.log('Sending telemetry message %d...', index);
  const msg = new Message(
    JSON.stringify(
      deviceTemperatureSensor.updateSensor().getCurrentTemperatureObject()
    )
  );
  msg.properties.add("iothub-creation-time-utc", new Date().toISOString());
  msg.contentType = 'application/json';
  msg.contentEncoding = 'utf-8';
  await deviceClient.sendEvent(msg);
}

プロパティ変更の形式

各メッセージまたはレコードは、デバイスとクラウドのプロパティの変更を表します。 エクスポートされたメッセージに含まれる情報は次のとおりです。

  • applicationId: IoT Central アプリケーションの ID。
  • messageSource: メッセージのソース - properties
  • messageType: cloudPropertyChangedevicePropertyDesiredChange、または devicePropertyReportedChange のいずれか。
  • deviceId: テレメトリ メッセージを送信したデバイスの ID。
  • schema: ペイロード スキーマの名前とバージョン。
  • enqueuedTime: IoT Central がこの変更を検出した時刻。
  • templateId: デバイスに割り当てられているデバイス テンプレートの ID。
  • properties: 変更されたプロパティの名前と値を含む、変更されたプロパティの配列。 プロパティがコンポーネントまたは IoT Edge モジュール内でモデル化されている場合、コンポーネントとモジュールの情報が含まれます。
  • enrichments: エクスポートに設定されたエンリッチメント。

デバイス接続性の変更形式

各メッセージまたはレコードは、1 台のデバイスからの接続イベントを表します。 エクスポートされたメッセージに含まれる情報は次のとおりです。

  • applicationId: IoT Central アプリケーションの ID。
  • messageSource: メッセージのソース - deviceConnectivity
  • messageType: connected または disconnected のいずれか。
  • deviceId: 変更されたデバイスの ID。
  • schema: ペイロード スキーマの名前とバージョン。
  • templateId: デバイスに割り当てられているデバイス テンプレートの ID。
  • enqueuedTime: IoT Central でこの変更が発生した時刻。
  • enrichments: エクスポートに設定されたエンリッチメント。

デバイスのライフサイクル変更の形式

各メッセージまたはレコードは、1 つのデバイスに対する 1 つの変更を表します。 エクスポートされたメッセージに含まれる情報は次のとおりです。

  • applicationId: IoT Central アプリケーションの ID。
  • messageSource: メッセージのソース - deviceLifecycle
  • messageType: 発生したエラーの種類。 registereddeletedprovisionedenableddisableddisplayNameChanged および deviceTemplateChanged のいずれか。
  • deviceId: 変更されたデバイスの ID。
  • schema: ペイロード スキーマの名前とバージョン。
  • templateId: デバイスに割り当てられているデバイス テンプレートの ID。
  • enqueuedTime: IoT Central でこの変更が発生した時刻。
  • enrichments: エクスポートに設定されたエンリッチメント。

デバイス テンプレートのライフサイクル変更の形式

各メッセージまたはレコードは、1 つの発行されたデバイス テンプレートに対する 1 つの変更を表します。 エクスポートされたメッセージに含まれる情報は次のとおりです。

  • applicationId: IoT Central アプリケーションの ID。
  • messageSource: メッセージのソース - deviceTemplateLifecycle
  • messageType: createdupdated、または deleted のいずれか。
  • schema: ペイロード スキーマの名前とバージョン。
  • templateId: デバイスに割り当てられているデバイス テンプレートの ID。
  • enqueuedTime: IoT Central でこの変更が発生した時刻。
  • enrichments: エクスポートに設定されたエンリッチメント。

監査ログの形式

各監査ログ メッセージでは、IoT Central アプリケーション内の監査可能なエンティティに対してユーザーが開始した変更を表します。 エクスポートされたメッセージに含まれる情報は次のとおりです。

  • actor: エンティティを変更したユーザーに関する情報。
  • applicationId: IoT Central アプリケーションの ID。
  • messageSource: メッセージのソース - audit
  • messageType: 発生したエラーの種類。 updatedcreateddeleted のいずれかです。
  • updated: messageTypeupdated の場合にのみ存在します。 更新の詳細情報を提供します。
  • resource: 変更されたエンティティの詳細。
  • schema: ペイロード スキーマの名前とバージョン。
  • deviceId: 変更されたデバイスの ID。
  • enqueuedTime: IoT Central でこの変更が発生した時刻。
  • enrichments: エクスポートに設定されたエンリッチメント。

Event Hubs の場合、IoT Central から新しいメッセージ データが、ほぼリアルタイムでイベント ハブに送信されます。 各メッセージのユーザー プロパティ (アプリケーション プロパティとも呼ばれます) では、iotcentral-device-idiotcentral-application-idiotcentral-message-source および iotcentral-message-type が自動的に含まれます。

次のステップ

Event Hubs にエクスポートする方法を理解したので、次のステップとして「Azure Data Explorer へのエクスポート」を学習することをお勧めします。