AWS IoT Core ルールを使用したデータの取り込み - AWS IoT SiteWise

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS IoT Core ルールを使用したデータの取り込み

のルールを使用して、 AWS IoT のモノや他の AWS サービス AWS IoT SiteWise から にデータを送信できます AWS IoT Core。ルールは MQTT メッセージを変換し、 AWS サービスとやり取りするためのアクションを実行します。 AWS IoT SiteWise ルールアクションは、 AWS IoT SiteWise API から BatchPutAssetPropertyValueオペレーションにメッセージデータを転送します。詳しくは、[AWS IoT Developer Guide] (デベロッパーガイド) の[Rules] (ルール) [AWS IoT SiteWise action] (アクション) をご覧ください。

デバイスシャドウを介して AWS IoT モノからデータを取り込むルールを設定するために必要な手順を説明するチュートリアルに従うことができます。詳細については、「AWS IoT モノ AWS IoT SiteWise から へのデータの取り込み」を参照してください。

から他の AWS のサービス AWS IoT SiteWise にデータを送信することもできます。詳細については、「その他の AWS のサービスの操作」を参照してください。

必要なアクセス権 AWS IoT の付与

IAM ロールを使用して、各ルールがアクセスできる AWS リソースを制御します。ルールを作成する前に、必要な AWS リソースに対してアクションを実行することをルールに許可するポリシーを持つ IAM ロールを作成する必要があります。 は、ルールの実行時にこのロールを AWS IoT 引き受けます。

AWS IoT コンソールでルールアクションを作成する場合は、ルートアセットを選択して、選択したアセット階層にアクセスできるロールを作成できます。ルールのロールを手動で定義する方法の詳細については、「 AWS IoT デベロッパーガイドAWS IoT 」の「必要なアクセス権の付与」および「ロールのアクセス許可を渡す」を参照してください。

AWS IoT SiteWise ルールアクションでは、ルールがデータを送信するアセットプロパティiotsitewise:BatchPutAssetPropertyValueへのアクセスを許可するロールを定義する必要があります。セキュリティを向上させるために、 Conditionプロパティで AWS IoT SiteWise アセット階層パスを指定できます。

次の信頼ポリシーの例では、特定のアセットとその子へのアクセスを許可します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iotsitewise:BatchPutAssetPropertyValue", "Resource": "*", "Condition": { "StringLike": { "iotsitewise:assetHierarchyPath": [ "/root node asset ID", "/root node asset ID/*" ] } } } ] }

ポリシーから Condition を削除すると、すべてのアセットへのアクセスを許可できます。次の信頼ポリシーの例では、すべてのアセットへのアクセスを許可します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iotsitewise:BatchPutAssetPropertyValue", "Resource": "*" } ] }

AWS IoT SiteWise ルールアクションの設定

AWS IoT SiteWise ルールアクションは、ルールを開始した MQTT メッセージから のアセットプロパティにデータを送信します AWS IoT SiteWise。複数のデータエントリを異なるアセットプロパティに同時にアップロードできるため、デバイスのすべてのセンサーの更新を 1 つのメッセージで送信できます。また、各データ入力に一度に複数のデータポイントをアップロードすることもできます。

注記

ルールアクション AWS IoT SiteWise を使用して にデータを送信する場合、データはBatchPutAssetPropertyValueオペレーションのすべての要件を満たしている必要があります。たとえば、現在の UNIX エポック時間から 7 日以上前ののタイムスタンプをデータで使用することはできません。詳細については、「AWS IoT SiteWise API を使用したデータの取り込み」を参照してください。

ルールアクションの各データエントリについて、アセットプロパティを識別し、そのアセットプロパティの各データポイントのタイムスタンプ、品質、および値を指定します。ルールアクションには、すべてのパラメータに対する文字列を指定します。

エントリ内のアセットのプロパティを識別するには、以下のいずれかを指定します。

  • データを送信するアセットプロパティの [アセット ID] (assetId) と [プロパティ ID] (propertyId)。アセット ID とプロパティ ID は、 を使用して確認できます AWS IoT SiteWise コンソール。アセット ID がわかっている場合は、 を使用して AWS CLI を呼び出しDescribeAsset、プロパティ ID を検索できます。

  • [Property alias (プロパティエイリアス) ] (propertyAlias)。これは、データストリームのエイリアス (/company/windfarm/3/turbine/7/temperature など) です。このオプションを使用するには、最初にアセットプロパティのエイリアスを設定する必要があります。プロパティのエイリアスを設定する方法については、「アセットプロパティへの産業データストリームのマッピング」を参照してください。

各エントリーのタイムスタンプには、お使いの機器から報告されたタイムスタンプ、または AWS IoT Core から提供されたタイムスタンプを使用することができます。タイムスタンプは 2 つのパラメータがあります。

  • [Time in seconds] (時間 (秒)) (timeInSeconds) - センサーまたは機器がデータを報告した UNIX エポック時間 (秒)。

  • [Offset in nanos] (オフセット (ナノ秒)) (offsetInNanos) -(オプション) 時間 (秒) からのオフセット (ナノ秒)。

重要

タイムスタンプが文字列であったり、小数部があったり、秒単位でない場合、 AWS IoT SiteWise はリクエストを拒否します。タイムスタンプを秒とナノ秒のオフセットに変換する必要があります。 AWS IoT ルールエンジンの機能を使用してタイムスタンプを変換します。詳細については、次を参照してください。

アクションのいくつかのパラメータに置換テンプレートを使用して、コンピューティングを実行したり、関数を呼び出したり、メッセージペイロードから値を引き出したりすることができます。詳細については、[AWS IoT Developer Guide] (デベロッパーガイド) の[Substitution templates] (置換テンプレート) を参照してください。

注記

置換テンプレート内の式は SELECT ステートメントとは別に評価されるため、AS 句を使用して作成されたエイリアスは置換テンプレートを使用して参照することはできません。サポートされている関数と演算子に加えて、元のペイロードに存在する情報のみを参照できます。

正確な時間を報告しないデバイスのタイムスタンプを取得する。

センサーまたは機器が正確な時間データを報告しない場合、timestamp() を使用して AWS IoT ルールエンジンから現在の Unix エポック時間を取得できます。この関数は、ミリ秒単位で時間を出力するので、時間を秒単位、オフセットをナノ秒単位に変換する必要があります。そのためには、次の変換を使用します。

  • [Time in seconds (時間 (秒)) ] (timeInSeconds) には、${floor(timestamp() / 1E3)} を使用して、時間をミリ秒から秒に変換します。

  • [Offset in nanos (オフセット (ナノ秒)) ] (offsetInNanos) には、${(timestamp() % 1E3) * 1E6} を使用して、タイムスタンプオフセット (ナノ秒) をコンピューティングします。

文字列形式のタイムスタンプを変換する

センサーや機器が文字列形式で時間データを報告する場合 (例えば 2020-03-03T14:57:14.699Z) 、[time_to_epoch (String, String) ] (タイムトゥエポック (文字列、文字列)) を使用することができます。この関数は、タイムスタンプとフォーマットパターンをパラメータとして入力し、時刻をミリ秒単位で出力します。次に、時間を秒単位で、オフセットをナノ秒単位で変換する必要があります。そのためには、次の変換を使用します。

  • [Time in seconds] (秒単位の時間) (timeInSeconds) の場合、${floor(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") / 1E3)} でタイムスタンプ文字列をミリ秒に変換し、さらに秒に変換します。

  • [Offset in nanos](オフセット (ナノ秒)) (offsetInNanos) には、${(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") % 1E3) * 1E6} を使用して、タイムスタンプ文字列オフセット (ナノ秒) をコンピューティングします。

注記

time_to_epoch 関数は、最大ミリ秒精度のタイムスタンプ文字列をサポートします。マイクロ秒またはナノ秒の精度で文字列を変換するには、ルールがタイムスタンプを数値に変換するために呼び出す AWS Lambda 関数を設定できます。詳細については、「ナノ秒精度のタイムスタンプ文字列を変換する。」を参照してください。

ナノ秒精度のタイムスタンプ文字列を変換する。

デバイスがナノ秒精度のタイムスタンプ情報を文字列形式 (2020-03-03T14:57:14.699728491Z など) で送信する場合、次のステップでルールアクションを設定します。タイムスタンプを文字列から秒単位の時間 (timeInSeconds) とナノ単位のオフセット () に変換する AWS Lambda 関数を作成できますoffsetInNanos。次に、ルールのアクションパラメータでaws_lambda (functionArn, inputJson) を使用して、その Lambda 関数を呼び出し、その出力をルールで使用することができます。

注記

このセクションでは、次のリソースの作成方法を熟知していることを前提とした高度な手順について説明します。

タイムスタンプ文字列を解析する AWS IoT SiteWise ルールアクションを作成するには
  1. 次のプロパティを持つ Lambda 関数を作成します。

    • [Function name] (関数名) - わかりやすい関数名を使用します (例: ConvertNanosecondTimestampFromString)。

    • ランタイム – Python 3.11 () などの Python 3 ランタイムを使用します。python3.11

    • アクセス許可 – 基本的な Lambda アクセス許可 () を持つロールを作成しますAWSLambdaBasicExecutionRole

    • レイヤー – Lambda 関数が を使用するための AWSSDKPandas-Python311 レイヤーを追加しますnumpy

    • [Function code] (関数コード) - 次の関数コードを使用します。この関数コードでは、timestamp という文字列引数を消費し、そのタイムスタンプの timeInSecondsoffsetInNanos 値を出力します。

      import json import math import numpy # Converts a timestamp string into timeInSeconds and offsetInNanos in Unix epoch time. # The input timestamp string can have up to nanosecond precision. def lambda_handler(event, context): timestamp_str = event['timestamp'] # Parse the timestamp string as nanoseconds since Unix epoch. nanoseconds = numpy.datetime64(timestamp_str, 'ns').item() time_in_seconds = math.floor(nanoseconds / 1E9) # Slice to avoid precision issues. offset_in_nanos = int(str(nanoseconds)[-9:]) return { 'timeInSeconds': time_in_seconds, 'offsetInNanos': offset_in_nanos }

      この Lambda 関数は、 の datetime64 を使用して ISO 8601 形式のタイムスタンプ文字列を入力します NumPy。

      注記

      タイムスタンプ文字列が ISO 8601 形式でない場合、タイムスタンプ形式を定義した pandas で解決策を実装することが可能です。詳しくはpandas.to_datetimeを参照してください。

  2. ルールに AWS IoT SiteWise アクションを設定するときは、秒単位の時間 (timeInSeconds) とナノ単位のオフセット () に次の置換テンプレートを使用しますoffsetInNanos。これらの置換テンプレートは、メッセージペイロードに timestamp のタイムスタンプ文字列が含まれていることを前提としています。この aws_lambda 関数は 2 番目のパラメータに JSON 構造消費するため、必要に応じて以下の置換テンプレートを変更できます。

    • [Time in seconds (時間 (秒)) ] (timeInSeconds) には、次の置換テンプレートを使用します。

      ${aws_lambda('arn:aws:lambda:region:account-id:function:ConvertNanosecondTimestampFromString', {'timestamp': timestamp}).timeInSeconds}
    • Offset in nanos (オフセット (ナノ秒)) ] (offsetInNanos) には、次の置換テンプレートを使用します。

      ${aws_lambda('arn:aws:lambda:region:account-id:function:ConvertNanosecondTimestampFromString', {'timestamp': timestamp}).offsetInNanos}

    パラメータごとに、regionaccount-id をリージョンと AWS アカウント ID に置き換えます。Lambda 関数に別の名前を使用した場合は、それも変更してください。

  3. アクセス AWS IoT 許可を使用して関数を呼び出すアクセスlambda:InvokeFunction許可を付与します。詳細については、「aws_lambda (functionArn, inputJson) 」を参照してください。

  4. ルールをテストし ( AWS IoT MQTT テストクライアントを使用するなど)、 が送信するデータ AWS IoT SiteWise を受信することを確認します。

    ルールが期待どおりに動作しない場合は、「AWS IoT SiteWise ルールアクションのトラブルシューティング」を参照してください。

注記

このソリューションは、タイムスタンプ文字列ごとに Lambda 関数を 2 回呼び出します。ルールが各ペイロードで同じタイムスタンプを持つ複数のデータポイントを処理する場合、別のルールを作成して Lambda 関数呼び出し回数を減らすことができます。

そのためには、Lambda を呼び出し、タイムスタンプ文字列を timeInSecondsoffsetInNanos に変換して元のペイロードをパブリッシュする再パブリッシュアクションを含むルールを作成します。次に、変換されたペイロードを消費する ルールアクションを使用して AWS IoT SiteWise ルールを作成します。この方法では、ルールが Lambda を呼び出す回数を減らしますが、 AWS IoT ルールアクションの実行回数を増やします。このソリューションをユースケースに適用する場合は、各サービスの価格を考慮してください。

ルール設定の例。

このセクションには、 AWS IoT SiteWise アクションでルールを作成するために使用できるルール設定の例が含まれています。

例 プロパティエイリアスをメッセージトピックとして使用するルールアクションの例

次の例では、アセットプロパティを識別するためのプロパティエイリアスとして トピック (through topic()) を使用する AWS IoT SiteWise アクションを持つルールを作成します。この例を使用して、すべての風力発電施設のすべての風力タービンに対してダブル型のデータを取り込むための 1 つのルールを定義することができます。この例では、すべてのタービンアセットのプロパティにプロパティエイリアスを定義する必要があります。整数型データを取り込むには、同様のルールをもう一つ定義する必要があります。

aws iot create-topic-rule \ --rule-name SiteWiseWindFarmRule \ --topic-rule-payload file://sitewise-rule-payload.json

sitewise-rule-payload.json のペイロードの例には、次のコンテンツが含まれています。

{ "sql": "SELECT * FROM '/company/windfarm/+/turbine/+/+' WHERE type = 'double'", "description": "Sends data to the wind turbine asset property with the same alias as the topic", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "propertyAlias": "${topic()}", "propertyValues": [ { "timestamp": { "timeInSeconds": "${timeInSeconds}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::account-id:role/MySiteWiseActionRole" } } ] }

このルールアクションを使用すると、次のメッセージを風力タービンプロパティエイリアス (/company/windfarm/3/turbine/7/temperature など) に送信して、データを取り込みます。

{ "type": "double", "value": "38.3", "timeInSeconds": "1581368533" }
例 timestamp () を使用して時刻を決定するルールアクションの例

次の例では、IDs によってアセットプロパティを識別し、timestamp() を使用して現在の時刻を決定する AWS IoT SiteWise アクションを含むルールを作成します。

aws iot create-topic-rule \ --rule-name SiteWiseAssetPropertyRule \ --topic-rule-payload file://sitewise-rule-payload.json

sitewise-rule-payload.json のペイロードの例には、次のコンテンツが含まれています。

{ "sql": "SELECT * FROM 'my/asset/property/topic'", "description": "Sends device data to an asset property", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "assetId": "a1b2c3d4-5678-90ab-cdef-22222EXAMPLE", "propertyId": "a1b2c3d4-5678-90ab-cdef-33333EXAMPLE", "propertyValues": [ { "timestamp": { "timeInSeconds": "${floor(timestamp() / 1E3)}", "offsetInNanos": "${(timestamp() % 1E3) * 1E6}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::account-id:role/MySiteWiseActionRole" } } ] }

このルールアクションでは、次のメッセージを my/asset/property/topic に送信してデータを取り込むことができます。

{ "type": "double", "value": "38.3" }

基本的な取り込みによるコストの削減

AWS IoT Core は、AWS IoT メッセージングコストを発生させ AWS IoT Core ずに を介してデータを送信するために使用できる基本的な取り込みと呼ばれる機能を提供します。基本的な取り込みは、取り込みパスからパブリッシュ/サブスクライブのメッセージブローカーを除去して、大量のデータ取り込みワークロードのデータフローを最適化します。メッセージをルーティングするルールがわかっている場合は、基本的な取り込みを使用できます。

基本的な取り込みを使用するには、特別なトピック、$aws/rules/rule-name を使用して、特定のルールに直接メッセージを送信します。たとえば、SiteWiseWindFarmRule という名前のルールにメッセージを送信するには、トピック $aws/rules/SiteWiseWindFarmRule にメッセージを送信します。

ルールアクションで、トピック (10 進数) を含む置換テンプレートが使用されている場合、$aws/rules/rule-name/original-topic などの基本的な取り込みの特別なトピックの最後に元のトピックを渡すことができます。たとえば、前のセクションの風力発電施設プロパティエイリアスの例で基本的な取り込みを使用するには、次のトピックにメッセージを送信できます。

$aws/rules/SiteWiseWindFarmRule//company/windfarm/3/turbine/7/temperature
注記

上記の例には 2 番目のスラッシュ (//) が含まれています。これは、 がルールアクションに表示されるトピックから基本的な取り込みプレフィックス ($aws/rules/rule-name/) AWS IoT を削除するためです。この例では、ルールはトピック /company/windfarm/3/turbine/7/temperature を受信します。

詳細については、[AWS IoT Developer Guide] (デベロッパーガイド) の[Reducing messaging costs with basic ingest] (ベーシックインジェストでメッセージングコストを削減) を参照してください。

AWS IoT SiteWise ルールアクションのトラブルシューティング

で AWS IoT SiteWise ルールアクションをトラブルシューティングするには AWS IoT Core、 CloudWatch ログを設定するか、ルールの再発行エラーアクションを設定できます。詳細については、「AWS IoT SiteWise ルールアクションのトラブルシューティング」を参照してください。