View a markdown version of this page

InfluxDB - AWS IoT Core

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

InfluxDB

デバイステレメトリに運用傾向をクエリしたり、時系列データをリアルタイムでモニタリングしたりする場合は、このアクションを選択します。クライアント側またはサーバー側のバッチ処理を使用して、1 つの書き込みリクエストに複数のポイントを組み合わせることができます。 は各メッセージを InfluxDB ラインプロトコル AWS IoT Core に変換し、指定されたデータベースとテーブルに書き込みます。形式の詳細については、InfluxDB ラインプロトコル」を参照してください。 InfluxData マネージドクラスターの詳細については、「Amazon Timestream for InfluxDB」を参照してください。

前提条件

このルールアクションには、次の前提条件があります。

  • InfluxDB アクションの送信先 – InfluxDB インスタンスのエンドポイント、バージョン、認証情報を指定する InfluxDB アクションの送信先を作成します。 は、トラフィックを送信する前にエンドポイントの所有権 AWS IoT Core を検証します。「InfluxDB アクションの送信先」を参照してください。

  • InfluxDB データベースに書き込み、InfluxDB 認証情報を保存するシークレットに対して GetSecretValueオペレーションを実行するために が引き受け AWS IoT ることができる IAM ロール。 InfluxDB 詳細については、「必要なアクセスを AWS IoT ルールに付与する」を参照してください。

  • に保存されている InfluxDB 認証情報 AWS Secrets Manager – InfluxDB V3 の場合、Amazon Timestream for InfluxDB は、InfluxDB クラスターを作成するときに Secrets Manager シークレットを自動的にプロビジョニングします。シークレットにはクラスター認証情報が含まれています。InfluxDB V2 の場合、InfluxDB インスタンスから All Access またはカスタム API トークンを生成します。トークン値をプレーンテキストのシークレットとして に保存します AWS Secrets Manager。トークン作成の詳細については、InfluxData ドキュメントの「トークンの作成」を参照してください。実行時に、ルールアクションは InfluxDB エンドポイントを認証する前に secretsmanager:GetSecretValueを呼び出してこれらの認証情報を取得します。

  • メッセージペイロードのタイムスタンプ – メッセージペイロードの各オブジェクトには、Unix エポック値の整数を持つ timestamp (大文字と小文字を区別する) という名前のキーが含まれている必要があります。タイムスタンプ単位は IoT ルール定義でも設定できます。InfluxDB がエラーアクションとして使用されている場合を除き、 は InfluxDB アクションのタイムスタンプを生成 AWS IoT Core しません。

    注記

    ts や などのエイリアスtimeを の代わりに使用することはできませんtimestamp。

  • HTTPS 接続 — InfluxDB インスタンスは、HTTPS AWS IoT Core 経由で から到達可能である必要があります。サポートされているアウトバウンドポートは、443、8443、8086 (InfluxDB V2 のデフォルトポート)、および 8181 (InfluxDB V3 のデフォルトポート) です。 V3

  • JSON 形式のペイロード – InfluxDB アクションは JSON ペイロードのみを処理します。デバイスがバイナリデータまたは Protobuf データを発行する場合は、アクションの実行前にルール SQL の decode()関数を使用して JSON に変換します。

InfluxDB アクションの送信先

InfluxDB ルールアクションを使用する前に、InfluxDB アクションの送信先を作成する必要があります。送信先は InfluxDB インスタンスの接続パラメータを定義します。 AWS IoT Core その後、 はエンドポイントの所有権を検証します。

送信先の作成

CreateTopicRuleDestination API を使用して InfluxDB 送信先を作成します。

{ "destinationConfiguration": { "influxDBConfiguration": { "endpoint": "https://my-instance.timestream-influxdb.us-west-2.amazonaws.com:8086", "influxDBVersion": "V2", "secretId": "arn:aws:secretsmanager:us-west-2:111122223333:secret:my-influxdb-credentials-AbCdEf" } } }

送信先パラメータ

パラメータ タイプ 必須 説明
endpoint 文字列 はい InfluxDB インスタンスの HTTPS エンドポイント URL。HTTP はサポートされていません。サポートされているポート: 443、8086、8181、8443。
influxDBVersion String はい InfluxDB バージョン。有効な値: V2、V3。
secretId String はい InfluxDB トークンを含む AWS Secrets Manager シークレットの名前または ARN。
secretType String いいえ シークレット値のタイプ。有効な値: SecretString、SecretBinary。
secretKey String いいえ 認証トークンを含むシークレット JSON 内のキー。シークレットが複数のキーを持つ JSON オブジェクトである場合にのみ必要です。

エンドポイントの所有権の検証

InfluxDB アクションの送信先を作成すると、 は、指定した認証情報を使用して InfluxDB API に対して認証することでエンドポイントの所有権 AWS IoT Core を検証します。

  • InfluxDB V2: /api/v2/meエンドポイントを AWS IoT Core 呼び出します。

  • InfluxDB V3: リストデータベースエンドポイント () を AWS IoT Core 呼び出しますGET /api/v3/configure/database。

正常なレスポンス (2xx) は、送信先ステータスを に設定しますENABLED。失敗すると、 はステータスを AWS IoT Core に設定しますERROR。検証を再試行するには、 ステータスを に設定UpdateTopicRuleDestinationして を呼び出しますIN_PROGRESS。

InfluxDB 用語マッピング

InfluxDB V2 と V3 では、以下の用語が異なります。 V2 V3

AWS IoT Core パラメータ InfluxDB V2 用語 InfluxDB V3 用語
databaseName バケット データベース
tableName 測定 [テーブル]
注記

Amazon Timestream ルールアクションから移行する場合、 dimensionsパラメータは InfluxDB アクションのタグにマッピングされ、クエリ結果属性は フィールドにマッピングされます。

パラメータ

InfluxDB アクションを使用して AWS IoT ルールを作成するときは、次の情報を指定する必要があります。

destinationArn

InfluxDB アクションの送信先の ARN。「InfluxDB アクションの送信先」を参照してください。置換テンプレートをサポート: いいえ

roleArn

Secrets Manager シークレットへのアクセス AWS IoT 許可を付与する IAM ロールの ARN。「前提条件」を参照してください。置換テンプレートをサポート: いいえ

databaseName

レコードを書き込む InfluxDB データベースの名前 (InfluxDB v2 ではバケット、InfluxDB v3 ではデータベースと呼ばれます)。置換テンプレートをサポート: いいえ。データを異なるデータベースにルーティングするには、データベースごとに個別のルールアクションを作成します。

tableName

レコードを書き込むテーブルの名前 (InfluxDB v2 では測定、InfluxDB v3 ではテーブルと呼ばれます)。置換テンプレートのサポート: はい

organization

InfluxDB 組織名。InfluxDB v2 に必要です。InfluxDB v3 にこのパラメータを含めると、無視されます。置換テンプレートをサポート: いいえ。

tags

マップとして指定された各ポイントのメタデータ。各マップキーはタグ名で、各マップ値は対応するタグ値です。タグにはクエリパフォーマンスのインデックスが付けられます。

  • InfluxDB V3 では、各タグ名はテーブル内で一意である必要があり、フィールド名を複製することはできません。

  • タグ値は、メッセージスコープおよび要素ごとの置換テンプレートをサポートします。

timestampUnit

ペイロード内のタイムスタンプ値の精度。有効な値: s (秒) | ms (ミリ秒) | us (マイクロ秒) | ns (ナノ秒)。デフォルト: ms。置換テンプレートをサポート: いいえ。

batchConfig

(オプション) サーバー側のバッチ処理設定。詳細については、「バッチ処理」を参照してください。

  • maxBatchSize – 各バッチのポイントの最大数。有効な範囲: 1~500。

  • maxBatchOpenMs – バッチを開いたままにするためのミリ秒単位の最大時間。有効な範囲: 5~1,000。

  • maxBatchSizeBytes – フラッシュ前のバイト単位の最大合計サイズ。有効範囲: 100~131,072。

  • batchAcrossTopics – ブール。の場合true、バッチにはさまざまなトピックのメッセージからのポイントが含まれます。デフォルト: false。

バッチ処理

InfluxDB アクションは、2 つのバッチ処理モードをサポートしています。

クライアント側のバッチ処理

IoT デバイスは時系列データを JSON 配列としてバッチ処理し、単一の MQTT メッセージとして発行します。クライアント側のバッチ処理では、各配列要素は 1 回の書き込みリクエストで 1 つのラインプロトコルポイントになります。追加の設定は必要ありません。

サーバー側のバッチ処理

InfluxDB に書き込む前に、サーバー側のバッチ処理を使用して個々のメッセージをグループ化します。batchConfig パラメータを使用してサーバー側のバッチ処理を設定します。バッチは、設定された制限 (maxBatchSize、maxBatchOpenMs、または maxBatchSizeBytes) が最初に達するとフラッシュされます。

注記

サーバー側のバッチ処理とクライアント側のバッチ処理 (JSON 配列ペイロード) の両方を同時に設定できます。

InfluxDB アクションは、アウトバウンドペイロードサイズに基づいて 5 KiB 単位で計測されます。ラインプロトコル変換の失敗も計測されます。

配列ペイロードの要素ごとのテンプレート

IoT デバイスがバッチ処理された時系列データを JSON 配列として送信する場合、「要素ごとの置換テンプレート」を使用して、個々の配列要素から値を解決できます。これにより、各データポイントが異なるテーブルにルーティングされるか、要素固有のタグが適用されます。詳細については、「要素ごとのテンプレート」を参照してください。

2 つの置換テンプレートの構文

  • ${expression} – 受信デバイスメッセージに対して、メッセージスコープで解決します。メッセージごとに 1 回評価されます。配列内のすべてのポイントに同じ値が適用されます。

  • @{expression} – ルールの SQL SELECT ステートメントによって生成されたペイロードの個々の要素に対して、要素スコープで解決します。配列要素ごとに再評価されるため、各ポイントは異なる値を取得できます。詳細については、「 @{expression}リファレンス」を参照してください。

tableName および タグ値@{...}で を使用して、式を各配列要素に対して個別に解決します。

例

次のデバイスペイロード (JSON 配列) がある場合:

[ {"measurement_type": "temperature", "room": "kitchen", "timestamp": 1700000000000, "value": 23.5}, {"measurement_type": "humidity", "room": "bedroom", "timestamp": 1700000001000, "value": 60.1} ]

また、次のアクション設定があります。

{ "influxDB": { "destinationArn": "arn:aws:iot:us-west-2:111122223333:ruledestination/influxdb/abc123", "roleArn": "arn:aws:iam::111122223333:role/iot-influxdb-role", "databaseName": "sensor_data", "tableName": "@{measurement_type}", "tags": { "room": "@{room}" }, "timestampUnit": "ms" } }

結果のラインプロトコル出力には、次の 2 つのポイントが含まれます。

temperature,room=kitchen value=23.5 1700000000000 humidity,room=bedroom value=60.1 1700000001000
注記

によって参照されるフィールド@{...}は、ラインプロトコルフィールドセットから削除されるため、フィールドとしても表示されません。この例では、 measurement_typeはテーブル名になり、タグroomになるため、どちらもフィールドセットに表示されません。 valueは唯一のフィールドです。

制限事項

  • @{...} は、InfluxDB アクション設定 (tableName および タグ値) でのみサポートされています。

  • ルール SQL (SELECT/WHERE 句)、エラーアクション定義、またはその他のルールアクション@{...}で を使用することはできません。

  • フィールド参照のみが 内でサポートされています@{...}。関数はサポートされていません。

  • 各値は、最大 1 つの@{...}マーカーをサポートします。1 つの値に複数のマーカーがあると、API 例外が生成されます。

  • ${...} と を同じ値@{...}に混在させることはできません。混合すると API 例外が生成されます。

  • 単一の JSON オブジェクトは 1 要素配列として扱われます。

InfluxDB レコードの内容

ポスト SQL クエリ結果の各レコードについて、結果の InfluxDB ラインプロトコルポイントには以下のコンポーネントが含まれます。

コンポーネント ソース
[テーブル] tableName パラメータ値
タグ tags パラメータのキーと値のペア
フィールド タグ、テーブル名、またはタイムスタンプとして使用されない残りのペイロード属性
タイムスタンプ ペイロードから抽出されたtimestampキー

データ型変換

AWS IoT Core は、次のように JSON 値を InfluxDB ラインプロトコルタイプに変換します。

JSON タイプ 行プロトコルタイプ 例
整数 (−263~263−1) 符号付き整数 (i サフィックス) 42 → 42i
整数 (263~264−1) 符号なし整数 (u サフィックス) 9223372036854775808 → 9223372036854775808u
外部の整数 (−263~264−1) 拒否 (エラーアクションがトリガーされました) —
浮動小数点数/10 進数 IEEE-754 64 ビット浮動小数点数 23.5 → 23.5
ブール値 t 、、または f true → t
String 引用文字列 "active" → "active"
Null 省略 (書き込みなし) —
オブジェクトまたは配列 圧縮された JSON 文字列 (空白は削除) {"a":1} → "{\"a\":1}"

命名に関する制限

  • フィールドキーとタグキーを空にしたり、アンダースコア () で始めることはできません_。

  • InfluxDB V3 では、テーブル名とタグキーは文字または数字で始まる必要があります。

  • フィールドキー、タグキー、タグ値のカンマ、等号、スペースは自動的にエスケープされます。

  • 測定値: カンマとスペースは自動的にエスケープされます。

  • タグは、取り込みパフォーマンスを向上させるために、シリアル化の前にキーによってアルファベット順にソートされます。

  • 空のタグ値は出力から省略されます。

予約キー

次のペイロードキーは、ラインプロトコル変換中に フィールドセットから削除されます。

  • timestamp – ポイントタイムスタンプとして使用されます。

  • tableName ( ${...}または 経由@{...}) によって参照されるキー – テーブル名として使用されます。

  • タグ値によって参照されるキー ( ${...}または 経由@{...}) – タグ値として使用されます。

エラーアクション

InfluxDB アクションが失敗すると、設定されたエラーアクションがトリガーされます。

InfluxDB をエラーアクションとして使用する

InfluxDB アクションは、任意のルールのエラーアクションとして設定できます。ペイロード全体が 1 つのレコードtableNameとして 1 つの に書き込まれます。メッセージスコープ置換テンプレート (${...}) は、エラーアクションの tableNameおよび でサポートされていますtags。

エラーアクションの出力

エラーアクションがトリガーされると、出力ペイロードには、ruleName、、topic、cloudwatchTraceIdclientIdsourceIp、 base64OriginalPayload (Base64 でエンコードされた元のメッセージ)、および各エントリに failedAction、failedResource、および があるfailures配列が含まれますerrorMessage。

サーバー側のバッチ処理では、ペイロードは を使用しpayloadsWithMetadata、個別のインバウンド MQTT メッセージごとに 1 つのエントリを使用します。各失敗のaffectedIds値は、それらのメッセージエントリidの値を参照します。これらはポイントインデックスではありません。クライアント側の JSON 配列は、複数の InfluxDB ポイントを生成しても、1 つのインバウンドメッセージです。完全なペイロード形式については、「」を参照してくださいバッチ処理のエラーアクション。

失敗シナリオ 説明
送信先が無効またはエラー InfluxDB アクションの送信先が有効になっていません。エンドポイントの所有権の検証が成功したことを確認します。
無効な送信先 ARN 指定された送信先は存在しません。
無効なロール ARN IAM ロールが存在しないか、アクセス許可がありません。
シークレット取得の失敗 シークレット または が設定されsecretKeyていないか、ルールアクションロールがシークレットを取得または復号できません。
タイムスタンプがありません ペイロードにtimestampキーが含まれていません。ペイロード内の各オブジェクトには、Unix エポック値の整数を持つtimestampフィールドを含める必要があります。
無効なタイムスタンプ値 タイムスタンプ値は整数 (文字列、浮動小数点数、ISO-8601 日付など) ではありません。値は、 で指定された単位の整数 Unix エポックである必要がありますtimestampUnit。
無効なペイロード (フィールドなし) ペイロードには、予約キーを削除した後のラインプロトコルの有効なフィールドは含まれていません。
無効なフィールドキー フィールドキーが空であるか、 で始まります_。
クライアントバッチに無効なポイントが含まれています JSON 配列の 1 つ以上の要素がラインプロトコルの検証に失敗しました。
タグ + フィールドが列の制限を超えています タグキーとフィールドキーの合計が最大列数 (250) を超えています。
接続障害 AWS IoT Core は InfluxDB エンドポイントに接続できませんでした。
認証の失敗 InfluxDB トークンが無効または期限切れです。でシークレットを更新します AWS Secrets Manager。
リソースが見つかりません 指定されたデータベース、テーブル、または組織は InfluxDB に存在しません。
フィールドタイプの競合 1 つ以上のフィールドが既存のスキーマと競合しています。バッチ書き込み全体が失敗します。
InfluxDB サーバーエラー InfluxDB で内部エラーが発生しました。
InfluxDB サービスは利用できません InfluxDB は一時的に使用できません。ルールエンジンはエクスポネンシャルバックオフで再試行します。
重要

バッチ内の任意のポイントでフィールドタイプの競合が発生すると、バッチ書き込み全体が失敗します。InfluxDB はポイントの一部をコミットしません。すべてのポイントが成功するか、書き込み全体が拒否されます。

再試行可能なエラー (503) はエクスポネンシャルバックオフで再試行されます。HTTP 401 レスポンスの場合、 は からトークン AWS IoT Core を再ロード AWS Secrets Manager し、リクエストを 1 回再試行します。再試行不可能なエラー (404、422) は、エラーアクションをすぐにトリガーします。再試行の制限については、AWS IoT Core 「 サービスクォータ」を参照してください。

例

InfluxDB ルールアクション

{ "topicRulePayload": { "sql": "SELECT * FROM 'devices/+/telemetry'", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "influxDB": { "destinationArn": "arn:aws:iot:us-west-2:111122223333:ruledestination/influxdb/a1b2c3d4", "roleArn": "arn:aws:iam::111122223333:role/iot-influxdb-role", "organization": "my-org", "databaseName": "sensor_data", "tableName": "device_metrics", "tags": { "device_id": "${clientid()}", "location": "building-a" }, "timestampUnit": "ms" } } ] } }

サンプルペイロード:

{ "timestamp": 1700000000000, "temperature": 23.5, "humidity": 60.1, "pressure": 1013.25, "battery_level": 87 }

結果のラインプロトコル:

device_metrics,device_id=myDevice123,location=building-a temperature=23.5,humidity=60.1,pressure=1013.25,battery_level=87i 1700000000000

出力のフィールドの順序は異なる場合があります。フィールドはアルファベット順にソートされません。

エレメントごとのテンプレートを使用したクライアントバッチ配列ペイロード

{ "influxDB": { "destinationArn": "arn:aws:iot:us-west-2:111122223333:ruledestination/influxdb/a1b2c3d4", "roleArn": "arn:aws:iam::111122223333:role/iot-influxdb-role", "organization": "my-org", "databaseName": "sensor_data", "tableName": "@{measurement_type}", "tags": { "sensor_id": "@{sensor_id}", "location": "${topic(2)}" }, "timestampUnit": "ns" } }

サンプルペイロード ( に発行devices/floor3/telemetry):

[ {"measurement_type": "temperature", "sensor_id": "sensor-42", "timestamp": 1700000000000000000, "value": 23.5}, {"measurement_type": "humidity", "sensor_id": "sensor-42", "timestamp": 1700000001000000000, "value": 60.1}, {"measurement_type": "pressure", "sensor_id": "sensor-43", "timestamp": 1700000002000000000, "value": 1013.25} ]

結果のラインプロトコル:

temperature,location=floor3,sensor_id=sensor-42 value=23.5 1700000000000000000 humidity,location=floor3,sensor_id=sensor-42 value=60.1 1700000001000000000 pressure,location=floor3,sensor_id=sensor-43 value=1013.25 1700000002000000000

InfluxDB を使用したサーバー側のバッチ処理

InfluxDB アクションにサーバー側のバッチ処理を追加するには、アクション設定batchConfigに を含めます。

"batchConfig": { "maxBatchSize": 50, "maxBatchOpenMs": 1000, "maxBatchSizeBytes": 65536, "batchAcrossTopics": false }

ルールアクションロールの IAM ポリシー

信頼ポリシー:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Service": "iot.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }

アクセス許可ポリシー:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:us-west-2:111122223333:secret:my-influxdb-secret-a1b2c3" } ] }

クライアント側とサーバー側のバッチ処理の組み合わせ (ポイントの順序変更)

クライアント側のバッチ処理 (JSON 配列ペイロード) とサーバー側のバッチ処理 (batchConfig) の両方を有効にする場合、サーバー側のバッチはクライアント側のバッチ処理されたペイロードからポイントの順序を変更する場合があることに注意してください。ルールエンジンは、複数の受信メッセージからのポイントを 1 つのサーバー側のバッチに蓄積します。メッセージは異なるデバイスまたはトピックから非同期で到着するため、元のクライアントペイロード内で順序付けられたポイントは、最終書き込みの他のメッセージのポイントとインターリーブされる可能性があります。

アクション設定:

{ "influxDB": { "destinationArn": "arn:aws:iot:us-west-2:111122223333:ruledestination/influxdb/abc123", "roleArn": "arn:aws:iam::111122223333:role/iot-influxdb-role", "databaseName": "sensor_data", "tableName": "@{measurement_type}", "tags": { "device_id": "${topic(2)}", "floor": "@{floor}" }, "timestampUnit": "ms", "batchConfig": { "maxBatchSize": 100, "maxBatchOpenMs": 500, "maxBatchSizeBytes": 65536, "batchAcrossTopics": true } } }

デバイス A は、時刻 T devices/deviceA/telemetryに に発行します。

[ {"measurement_type": "temperature", "floor": "1", "timestamp": 1700000000000, "value": 22.1}, {"measurement_type": "temperature", "floor": "2", "timestamp": 1700000000100, "value": 23.4}, {"measurement_type": "humidity", "floor": "1", "timestamp": 1700000000200, "value": 55.0} ]

デバイス B は、T+10ms devices/deviceB/telemetry の時点で に発行します。

[ {"measurement_type": "temperature", "floor": "3", "timestamp": 1700000000050, "value": 21.8}, {"measurement_type": "humidity", "floor": "3", "timestamp": 1700000000150, "value": 62.3} ]

どちらのメッセージも 500 ミリ秒のバッチウィンドウ (maxBatchOpenMs) 内に届くため、ルールエンジンは 5 つのポイントすべてを 1 つのサーバー側のバッチに結合します。

結果のラインプロトコル (サーバー側のバッチ書き込み):

temperature,device_id=deviceB,floor=3 value=21.8 1700000000050 temperature,device_id=deviceA,floor=1 value=22.1 1700000000000 temperature,device_id=deviceA,floor=2 value=23.4 1700000000100 humidity,device_id=deviceB,floor=3 value=62.3 1700000000150 humidity,device_id=deviceA,floor=1 value=55.0 1700000000200

ポイントは、各クライアントペイロードに表示される順序ではなくなりました。デバイス A の 3 つのポイント (タイムスタンプ 1700000000000、1700000000100、1700000000200) は、デバイス B の 2 つのポイント (タイムスタンプ 1700000000050、1700000000150) とインターリーブされます。サーバー側のバッチは、各メッセージ内の元の順序を保証するものではありません。InfluxDB はタイムスタンプフィールドを使用して各ポイントをタイムラインに配置するため、順序を変更してもクエリの正確性には影響しません。ただし、アプリケーションが書き込み順序セマンティクスに依存している場合 (たとえば、フィールドタイプの競合の処理や、同じミリ秒内のlast-write-winsの重複排除など)、有効な書き込み順序は発行順序とは異なる場合があることに注意してください。