この記事では、Blob Storage サービスにデータを送信するようにデータ エクスポートを構成する方法について説明します。
この機能を使用して、フィルター処理およびエンリッチ化された IoT データを IoT Central アプリケーションから連続エクスポートします。 データ エクスポートを使用すると、ウォーム パスの分析情報、分析、およびストレージ用に、クラウド ソリューションの他の部分にほぼリアルタイムで変更がプッシュされます。
たとえば、次のように操作できます。
- テレメトリ、プロパティ変更、デバイスの接続性、デバイスのライフサイクル、デバイスのテンプレートのライフサイクル、および監査ログ データを、JSON 形式で、ほぼリアルタイムで継続的にエクスポートする
- データ ストリームをフィルター処理して、カスタム条件に一致するデータをエクスポートする
- デバイスからのカスタム値とプロパティ値を使用してデータ ストリームをエンリッチ化する
- データ ストリームを変換 して、その形状と内容を変更します。
ヒント
データ エクスポートを有効にすると、その時点以降のデータのみが取得されます。 より多くの履歴データを保持するには、データ エクスポートを早い段階で有効にしてください。 データのエクスポートが無効になった時刻からデータを手動でエクスポートするには、「 IoT Central REST API を使用してデバイスにクエリを実行する方法」を参照してください。
注
状況によっては、メッセージがエクスポートされるまでに最大 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 アカウントまたは AzureData Lake Storage v2 ストレージ アカウントの作成の詳細を確認できます。 データのエクスポートでは、ブロック BLOB をサポートするストレージ アカウントにのみデータを書き込めます。 次に示す表は、互換性のある既知のストレージ アカウントの種類です。
パフォーマンス レベル | アカウントの種類 |
---|---|
スタンダード | General Purpose V2 |
スタンダード | General Purpose V1 |
スタンダード | Blob Storage |
プレミアム | ブロック BLOB ストレージ |
BLOB コンテナーをさらにセキュリティで保護し、マネージド ID を持つ信頼されたサービスからのアクセスのみを許可するには、「 Azure Virtual Network 上のセキュリティで保護された宛先にデータをエクスポートする」を参照してください。
[データのエクスポート] ページで IoT Central で Blob Storage の宛先を作成するには:
[ + 新しい宛先] を選択します。
宛先の種類として Azure Blob Storage を選択します。
承認の種類として [システム割り当てマネージド ID] を選択します。
ストレージ アカウントのエンドポイント URI を入力し、大文字と小文字を区別してコンテナー名を入力します。 エンドポイント URI は、
https://contosowaste.blob.core.windows.net
のようになります。[保存] を選択します。
宛先サービスに到着するデータが表示されない場合は、「 Azure IoT Central のトラブルシューティング」を参照してください。
データ エクスポートの設定
データのエクスポート先を準備したので、IoT Central アプリケーションでデータのエクスポートを設定します。
ご使用の IoT Central アプリケーションにサインインします。
左側のウィンドウで、[ データのエクスポート] を選択します。
ヒント
左側のウィンドウに [データのエクスポート ] が表示されない場合は、アプリでデータ エクスポートを構成するためのアクセス許可がありません。 データ エクスポートの設定について、管理者に問い合わせてください。
[+ 新しいエクスポート] を選択します。
新しいエクスポートの表示名を入力し、データエクスポートが 有効になっていることを確認します。
エクスポートするデータの種類を選択します。 次の表は、サポートされるデータ エクスポートの型の一覧を示します。
データの種類 説明 データ形式 テレメトリ デバイスからのテレメトリ メッセージがほぼリアルタイムでエクスポートされます。 エクスポートされた各メッセージには、元のデバイス メッセージの完全な内容が正規化されて含まれます。 テレメトリ形式 プロパティ変更 デバイスとクラウドのプロパティに対する変更がほぼリアルタイムでエクスポートされます。 読み取り専用のデバイス プロパティでは、報告された値に対する変更がエクスポートされます。 読み取り/書き込みプロパティの場合、報告された値と必要な値の両方がエクスポートされます。 プロパティ変更の形式 デバイスの接続性 デバイスの接続イベントと非接続イベントをエクスポートします。 デバイス接続の形式の変更 デバイスのライフサイクル デバイスの登録、削除、プロビジョニング、有効化、無効化、displayNameChanged、および deviceTemplateChanged のイベントをエクスポートします。 デバイスのライフサイクルのフォーマットの変更 デバイス テンプレートのライフサイクル created、updated、および deleted など、発行されたデバイス テンプレートの変更をエクスポートします。 デバイス テンプレートのライフサイクル変更の形式 監査ログ アプリケーション内のエンティティに対してユーザーが開始した更新のログ。 詳細については、「監査ログを使用して IoT Central アプリケーションのアクティビティを追跡する」を参照してください。 監査ログの形式 必要に応じて、フィルターを追加して、エクスポートするデータの量を減らします。 使用できるフィルターの種類は、データ エクスポートの種類ごとに異なります。
データの種類 使用可能なフィルター テレメトリ - デバイス名、デバイス ID、デバイス テンプレート、デバイスがシミュレートされているかどうかでフィルター処理します
- フィルター条件を満たすテレメトリのみが含まれるようにストリームをフィルター処理します
- フィルター条件に一致するプロパティを持つデバイスのテレメトリのみが含まれるようにストリームをフィルター処理します
- フィルター条件を満たし、"メッセージ プロパティ" を含むテレメトリのみが含まれるようにストリームをフィルター処理します。 "メッセージ プロパティ" ("アプリケーション プロパティ" とも呼ばれます) は、各テレメトリ メッセージのキーと値のペアのバッグとして送信されます。 メッセージ プロパティ フィルターを作成するには、検索するメッセージ プロパティ キーを入力し、条件を指定します。 指定したフィルター条件に一致するプロパティを持つテレメトリ メッセージのみがエクスポートされます。 IoT Hub ドキュメントからのアプリケーション プロパティの詳細
プロパティ変更 - デバイス名、デバイス ID、デバイス テンプレート、デバイスがシミュレートされているかどうかでフィルター処理します
- フィルター条件を満たすプロパティ変更のみが含まれるようにストリームをフィルター処理します
デバイスの接続性 - デバイス名、デバイス ID、デバイス テンプレート、組織、デバイスがシミュレートされているかどうかでフィルター処理します
- フィルター条件に一致するプロパティを持つデバイスの変更のみが含まれるようにストリームをフィルター処理します
デバイスのライフサイクル - デバイス名、デバイス ID、デバイス テンプレート、デバイスがプロビジョニング、有効化、またはシミュレートされているかどうかでフィルター処理します
- フィルター条件に一致するプロパティを持つデバイスの変更のみが含まれるようにストリームをフィルター処理します
デバイス テンプレートのライフサイクル - デバイス テンプレートでフィルター処理します
監査ログ 該当なし 必要に応じて、余分なキーと値のペアのメタデータを使用して、エクスポートされたメッセージを強化します。 次のエンリッチメントは、テレメトリ、プロパティ変更、デバイスの接続性、デバイスのライフサイクルの各データ エクスポートの種類で使用できます。
- カスタム文字列: 各メッセージにカスタム静的文字列を追加します。 任意のキーを入力し、任意の文字列値を入力します。
-
プロパティ。各メッセージに追加されます。
- デバイス名、デバイス テンプレート名、有効、組織、プロビジョニング済み、シミュレート済みなどのデバイス メタデータ。
- 各メッセージに対してデバイスから報告された現在のプロパティまたはクラウド プロパティの値。 エクスポートされたメッセージが、指定したプロパティを持たないデバイスからのものである場合、エクスポートされたメッセージにはそのエンリッチメントがありません。
エクスポート先を構成します。
[+ 宛先] を選択して、既に作成した宛先を追加するか、[新規作成] を選択します。
エクスポートする前にデータを変換するには、[ + 変換] を選択します。 詳細については、「 エクスポートのために IoT Central アプリケーション内のデータを変換する」を参照してください。
[+ 宛先] を選択して、1 つのエクスポートに最大 5 つの宛先を追加します。
エクスポートの設定が完了したら、[ 保存] を選択します。 数分後に、エクスポート先にデータが表示されます。
エクスポートの監視
IoT Central の [ データのエクスポート ] ページでは、エクスポートの状態を確認できます。 また、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": "00001111-aaaa-2222-bbbb-3333cccc4444",
"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"
}
}
メッセージ プロパティ
テレメトリ メッセージには、メタデータとテレメトリ ペイロードのプロパティがあります。 前のスニペットは、deviceId
や enqueuedTime
など、システム メッセージの例を示しています。 システム メッセージのプロパティの詳細については、「デバイスから クラウドへのメッセージのシステム プロパティ」を参照してください。
テレメトリ メッセージにカスタム メタデータを追加する必要がある場合、テレメトリ メッセージにプロパティを追加できます。 たとえば、デバイスでメッセージが作成されるとき、タイムスタンプを追加する必要があります。
次のコード スニペットは、デバイス上でメッセージを作成するとき、それに 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
:cloudPropertyChange
、devicePropertyDesiredChange
、またはdevicePropertyReportedChange
のいずれか。 -
deviceId
: テレメトリ メッセージを送信したデバイスの ID。 -
schema
: ペイロード スキーマの名前とバージョン。 -
enqueuedTime
: IoT Central がこの変更を検出した時刻。 -
templateId
: デバイスに割り当てられているデバイス テンプレートの ID。 -
properties
: 変更されたプロパティの名前と値を含む、変更されたプロパティの配列。 プロパティがコンポーネントまたは IoT Edge モジュール内でモデル化されている場合、コンポーネントとモジュールの情報が含まれます。 -
enrichments
: エクスポートに設定されたエンリッチメント。
Blob Storage の場合、メッセージはバッチ処理され、1 分に 1 回エクスポートされます。
次のスニペットは、Blob Storage にエクスポートされたプロパティ変更メッセージを示しています。
{
"applicationId": "11112222-bbbb-3333-cccc-4444dddd5555",
"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": "00001111-aaaa-2222-bbbb-3333cccc4444",
"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
: 発生したエラーの種類。registered
、deleted
、provisioned
、enabled
、disabled
、displayNameChanged
およびdeviceTemplateChanged
のいずれか。 -
deviceId
: 変更されたデバイスの ID。 -
schema
: ペイロード スキーマの名前とバージョン。 -
templateId
: デバイスに割り当てられているデバイス テンプレートの ID。 -
enqueuedTime
: IoT Central でこの変更が発生した時刻。 -
enrichments
: エクスポートに設定されたエンリッチメント。
Blob Storage の場合、メッセージはバッチ処理され、1 分に 1 回エクスポートされます。
次の例は、Azure Blob Storage で受信された、エクスポートされたデバイスのライフサイクル メッセージを示しています。
{
"applicationId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"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
:created
、updated
、またはdeleted
のいずれか。 -
schema
: ペイロード スキーマの名前とバージョン。 -
templateId
: デバイスに割り当てられているデバイス テンプレートの ID。 -
enqueuedTime
: IoT Central でこの変更が発生した時刻。 -
enrichments
: エクスポートに設定されたエンリッチメント。
Blob Storage の場合、メッセージはバッチ処理され、1 分に 1 回エクスポートされます。
次の例は、Azure Blob Storage で受信された、エクスポートされたデバイスのライフサイクル メッセージを示しています。
{
"applicationId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"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
: 発生したエラーの種類。updated
、created
、deleted
のいずれかです。 -
updated
:messageType
がupdated
の場合にのみ存在します。 更新の詳細情報を提供します。 -
resource
: 変更されたエンティティの詳細。 -
schema
: ペイロード スキーマの名前とバージョン。 -
deviceId
: 変更されたデバイスの ID。 -
enqueuedTime
: IoT Central でこの変更が発生した時刻。 -
enrichments
: エクスポートに設定されたエンリッチメント。
次の例は、Azure Blob Storage で受信したエクスポートされた監査ログ メッセージを示しています。
{
"actor": {
"id": "test-audit",
"type": "apiToken"
},
"applicationId": "22223333-cccc-4444-dddd-5555eeee6666",
"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 にエクスポートする方法を確認したら、次の手順として、 IoT データを Service Bus にエクスポートする方法を学習することをお勧めします。