IoT データを Blob Storage にエクスポートする

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

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

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

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

ヒント

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

Note

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

前提条件

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

IoT Central REST API を使用してデータ エクスポートを管理する方法については、「IoT Central REST API を使用してデータ エクスポートを管理する方法」を参照してください。

Blob Storage のエクスポート先を設定する

IoT Central では、1 分に 1 回データがエクスポートされ、各ファイルには、前のエクスポート以降の変更のバッチが含まれます。 エクスポートされたデータは JSON 形式で保存されます。 ストレージ アカウント内のエクスポートされたデータの既定のパスは次のとおりです。

  • テレメトリ: {container}/{app-id}/{partition_id}/{YYYY}/{MM}/{dd}/{hh}/{mm}/{filename}
  • プロパティ変更: {container}/{app-id}/{partition_id}/{YYYY}/{MM}/{dd}/{hh}/{mm}/{filename}

Azure portal でエクスポートされたファイルを参照するには、そのファイルに移動し、[BLOB の編集] を選択します。

接続オプション

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

ヒント

Blob Storage の宛先がファイアウォールによって保護されている場合は、マネージド 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 データ共同作成者ロールを使用してください。

Azure Blob Storage の宛先を作成する

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

エクスポート先にする既存の Azure ストレージ アカウントがない場合は、Azure Cloud Shell bash 環境で次のスクリプトを実行します。 このスクリプトにより、リソース グループ、Azure ストレージ アカウント、BLOB コンテナーが作成されます。 その後、スクリプトによって IoT Central アプリケーション用のマネージド ID が有効になり、ストレージ アカウントにアクセスするために必要なロールが割り当てられます。

# Replace the storage account name with your own unique value.
SA=yourstorageaccount$RANDOM

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

CN=exportdata
RG=centralexportresources
LOCATION=eastus

az group create -n $RG --location $LOCATION
SAID=$(az storage account create --name $SA --resource-group $RG --location $LOCATION --sku Standard_LRS --query "id" --output tsv)
az storage container create --account-name $SA --resource-group $RG --name $CN

# 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 "Storage Blob Data Contributor" --scope $SAID

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

echo "Endpoint URI: https://$SA.blob.core.windows.net/"
echo "Container: $CN"

新しい Azure Blob Storage アカウントまたは Azure Data Lake Storage v2 ストレージ アカウントの作成の詳細を確認できます。 データのエクスポートでは、ブロック BLOB をサポートするストレージ アカウントにのみデータを書き込めます。 次に示す表は、互換性のある既知のストレージ アカウントの種類です。

パフォーマンス レベル アカウントの種類
Standard General Purpose V2
Standard General Purpose V1
Standard Blob Storage
Premium ブロック BLOB ストレージ

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

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

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

  2. エクスポート先の種類として [Azure Blob Storage] を選択します。

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

  4. ストレージ アカウントのエンドポイント URI を入力し、大文字と小文字を区別してコンテナー名を入力します。 エンドポイント URI は、https://contosowaste.blob.core.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 のドキュメントを参照してください

Blob Storage の場合、メッセージはバッチ処理され、1 分に 1 回エクスポートされます。

次の例は、エクスポートされたテレメトリ メッセージを示しています。


{
    "applicationId": "1dffa667-9bee-4f16-b243-25ad4151475e",
    "messageSource": "telemetry",
    "deviceId": "1vzb5ghlsg1",
    "schema": "default@v1",
    "templateId": "urn:qugj6vbw5:___qbj_27r",
    "enqueuedTime": "2020-08-05T22:26:55.455Z",
    "telemetry": {
        "Activity": "running",
        "BloodPressure": {
            "Diastolic": 7,
            "Systolic": 71
        },
        "BodyTemperature": 98.73447010562934,
        "HeartRate": 88,
        "HeartRateVariability": 17,
        "RespiratoryRate": 13
    },
    "enrichments": {
      "userSpecifiedKey": "sampleValue"
    },
    "module": "VitalsModule",
    "component": "DeviceComponent",
    "messageProperties": {
      "messageProp": "value"
    }
}

メッセージ プロパティ

テレメトリ メッセージには、テレメトリ ペイロードに加え、メタデータのプロパティが含まれています。 前のスニペットは、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: エクスポートに設定されたエンリッチメント。

Blob Storage の場合、メッセージはバッチ処理され、1 分に 1 回エクスポートされます。

次のスニペットは、Blob Storage にエクスポートされたプロパティ変更メッセージを示しています。

{
    "applicationId": "fb74969c-8682-4708-af01-33499a7f7d98",
    "messageSource": "properties",
    "deviceId": "Pepjmh1Hcc",
    "enqueuedTime": "2023-03-02T10:35:39.281Z",
    "enrichments": {},
    "messageType": "devicePropertyReportedChange",
    "schema": "default@v1",
    "templateId": "dtmi:azureiot:ddzig4ascxz",
    "properties": [
        {
            "component": "device_info",
            "name": "swVersion",
            "value": "12"
        },
        {
            "component": "device_info",
            "name": "osName",
            "value": "Android"
        },
        {
            "component": "device_info",
            "name": "processorArchitecture",
            "value": "arm64-v8a"
        },
        {
            "component": "device_info",
            "name": "processorManufacturer",
            "value": "unknown"
        }
    ]
}

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

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

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

Blob Storage の場合、メッセージはバッチ処理され、1 分に 1 回エクスポートされます。

次の例は、Azure Blob Storage で受信された、エクスポート済みデバイス接続メッセージを示しています。

{
  "applicationId": "1dffa667-9bee-4f16-b243-25ad4151475e",
  "messageSource": "deviceConnectivity",
  "messageType": "connected",
  "deviceId": "1vzb5ghlsg1",
  "schema": "default@v1",
  "templateId": "urn:qugj6vbw5:___qbj_27r",
  "enqueuedTime": "2021-04-05T22:26:55.455Z",
  "enrichments": {
    "userSpecifiedKey": "sampleValue"
  }
}

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

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

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

Blob Storage の場合、メッセージはバッチ処理され、1 分に 1 回エクスポートされます。

次の例は、Azure Blob Storage で受信された、エクスポートされたデバイスのライフサイクル メッセージを示しています。

{
  "applicationId": "1dffa667-9bee-4f16-b243-25ad4151475e",
  "messageSource": "deviceLifecycle",
  "messageType": "registered",
  "deviceId": "1vzb5ghlsg1",
  "schema": "default@v1",
  "templateId": "urn:qugj6vbw5:___qbj_27r",
  "enqueuedTime": "2021-01-01T22:26:55.455Z",
  "enrichments": {
    "userSpecifiedKey": "sampleValue"
  }
}

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

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

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

Blob Storage の場合、メッセージはバッチ処理され、1 分に 1 回エクスポートされます。

次の例は、Azure Blob Storage で受信された、エクスポートされたデバイスのライフサイクル メッセージを示しています。

{
  "applicationId": "1dffa667-9bee-4f16-b243-25ad4151475e",
  "messageSource": "deviceTemplateLifecycle",
  "messageType": "created",
  "schema": "default@v1",
  "templateId": "urn:qugj6vbw5:___qbj_27r",
  "enqueuedTime": "2021-01-01T22:26:55.455Z",
  "enrichments": {
    "userSpecifiedKey": "sampleValue"
  }
}

監査ログの形式

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

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

次の例は、Azure Blob Storage で受信したエクスポートされた監査ログ メッセージを示しています。

{
  "actor": {
    "id": "test-audit",
    "type": "apiToken"
    },
  "applicationId": "570c2d7b-1111-2222-abcd-000000000000",
  "enqueuedTime": "2022-07-25T21:54:40.000Z",
  "enrichments": {},
  "messageSource": "audit",
  "messageType": "created",
  "resource": {
    "displayName": "Sensor 1",
    "id": "sensor",
    "type": "device"    
  },
  "schema": "default@v1"
}

次のステップ

Blob Storage にエクスポートする方法がわかったので、次のステップとして Service Bus へのエクスポートを理解することをお勧めします。