View a markdown version of this page

InfluxDB - AWS IoT Core

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

InfluxDB

當您想要查詢裝置遙測以取得操作趨勢或即時監控時間序列資料時,請選擇此動作。您可以使用用戶端或伺服器端批次,將多個點合併在一個寫入請求中。 會將每個訊息 AWS IoT Core 轉換為 InfluxDB 線路通訊協定,並將其寫入指定的資料庫和資料表。如需 格式的詳細資訊,請參閱 InfluxData 文件中的 InfluxDB 行通訊協定。 InfluxData 如需受管叢集的資訊,請參閱 Amazon Timestream for InfluxDB。

先決條件

此規則動作具有下列先決條件:

  • InfluxDB 動作目的地 – 建立 InfluxDB 動作目的地,指定 InfluxDB 執行個體的端點、版本和登入資料。 會在傳送流量之前 AWS IoT Core 驗證端點擁有權。請參閱 InfluxDB 動作目的地。

  • IAM 角色, AWS IoT 可擔任此角色來寫入 InfluxDB 資料庫,並在存放 InfluxDB 登入資料的秘密上執行 GetSecretValue操作。如需詳細資訊,請參閱授予 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 文件中的建立權杖。在執行時間,規則動作會呼叫 secretsmanager:GetSecretValue 來擷取這些登入資料,然後再驗證您的 InfluxDB 端點。

  • 訊息承載中的時間戳記 – 訊息承載中的每個物件都必須包含名稱為 timestamp(區分大小寫) 且具有整數 Unix epoch 值的索引鍵。時間戳記單位也可以在 IoT 規則定義中設定。 AWS IoT Core 不會產生 InfluxDB 動作的時間戳記,除非 InfluxDB 用作錯誤動作。

    注意

    time 無法使用 ts或 等別名,而非 timestamp。

  • HTTPS 連線 – 您的 InfluxDB 執行個體必須透過 HTTPS AWS IoT Core 連線。支援的傳出連接埠為:443、8443、8086 (InfluxDB V2 的預設連接埠) 和 8181 (InfluxDB 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" } } }

目的地參數

參數 Type 必要 描述
endpoint String 是 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: AWS IoT Core 呼叫/api/v2/me端點。

  • InfluxDB V3: AWS IoT Core 呼叫清單資料庫端點 (GET /api/v3/configure/database)。

成功回應 (2xx) 會將目的地狀態設定為 ENABLED。失敗時, 會將狀態 AWS IoT Core 設定為 ERROR。若要重試驗證,請呼叫 UpdateTopicRuleDestination 狀態設為 IN_PROGRESS。

InfluxDB 術語映射

下列術語在 InfluxDB V2 和 V3 之間不同。

AWS IoT Core 參數 InfluxDB V2 詞彙 InfluxDB V3 術語
databaseName 儲存貯體 資料庫
tableName 測量 資料表
注意

如果您要從 Amazon Timestream 規則動作遷移, dimensions 參數會映射至 InfluxDB 動作中的標籤,而查詢結果屬性會映射至欄位。

Parameters

當您使用 InfluxDB 動作建立 AWS IoT 規則時,您必須指定下列資訊:

destinationArn

InfluxDB 動作目的地的 ARN。請參閱 InfluxDB 動作目的地。支援替代範本:否

roleArn

授予 AWS IoT 許可以存取 Secrets Manager 秘密的 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 動作支援兩種批次模式。

用戶端批次處理

您的 IoT 裝置會將時間序列資料批次處理為 JSON 陣列,並將其發佈為單一 MQTT 訊息。透過用戶端批次處理,每個陣列元素會在單一寫入請求中成為一個明細協定點。您不需要額外的組態。

伺服器端批次處理

在將個別訊息寫入 InfluxDB 之前,使用伺服器端批次處理來分組個別訊息。使用 batchConfig 參數設定伺服器端批次處理。批次會在先達到任何設定的限制 (maxBatchOpenMs、 maxBatchSize或 maxBatchSizeBytes) 時排清。

注意

您可以同時設定伺服器端批次處理和用戶端批次處理 (JSON 陣列承載)。

InfluxDB 動作是根據傳出承載大小計量,以 5 KiB 遞增。也會測量線路通訊協定轉換失敗。

陣列承載的每個元素範本

當您的 IoT 裝置以 JSON 陣列傳送批次時間序列資料時,您可以使用「每個元素替換範本」來解析每個個別陣列元素的值。這會將每個資料點路由到不同的資料表,或套用元素特定的標籤。如需詳細資訊,請參閱每個元素範本。

兩個替代範本的語法

  • ${expression} – 針對傳入的裝置訊息,在訊息範圍內解決 。每個訊息評估一次;相同值適用於陣列中的每個點。

  • @{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" } }

產生的明細協定輸出包含兩個點:

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

參考的欄位@{...}會從明細行通訊協定欄位集中移除,因此也不會顯示為欄位。在此範例中, measurement_type會成為資料表名稱並room成為標籤,因此欄位集內不會出現 - value 是唯一的欄位。

限制

  • @{...} 僅支援 InfluxDB 動作組態 (tableName 和 標籤值)。

  • 您無法@{...}在規則 SQL (SELECT/WHERE 子句)、錯誤動作定義或任何其他規則動作中使用 。

  • 內部僅支援欄位參考@{...}。不支援 函數。

  • 每個值最多支援一個@{...}標記。單一值中的多個標記會產生 API 例外狀況。

  • 您無法在相同的值@{...}中混合 ${...}和 。混合會產生 API 例外狀況。

  • 單一 JSON 物件視為單元素陣列。

InfluxDB 記錄內容

對於 Post-SQL 查詢結果中的每個記錄,產生的 InfluxDB Line-protocol 點包含下列元件:

元件 來源
資料表 tableName 參數值
Tags (標籤) 來自 tags 參數的鍵/值對
欄位 未用作標籤、資料表名稱或時間戳記的剩餘承載屬性
時間戳記 從承載擷取的timestamp金鑰

資料類型轉換

AWS IoT Core 將 JSON 值轉換為 InfluxDB 行通訊協定類型,如下所示:

JSON 類型 線路通訊協定類型 範例
整數 (−263 至 263−1) 帶正負號的整數 (i 尾碼) 42 → 42i
整數 (263 到 264−1) 未簽章的整數 (u 尾碼) 9223372036854775808 → 9223372036854775808u
外部整數 (−263 至 264−1) 已拒絕 (已觸發錯誤動作) —
浮點數/小數 IEEE-754 64 位元浮點數 23.5 → 23.5
Boolean t 或 f * true → t
String 引號字串 "active" → "active"
Null 已省略 (未寫入) —
物件或陣列 壓縮的 JSON 字串 (空格已分割) {"a":1} → "{\"a\":1}"

命名限制

  • 欄位索引鍵和標籤索引鍵不可為空白或以底線 () 開頭_。

  • 在 InfluxDB V3 中,資料表名稱和標籤索引鍵必須以字母或數字開頭。

  • 欄位索引鍵、標籤索引鍵和標籤值中的逗號、等號和空格會自動逸出。

  • 測量:逗號和空格會自動逸出。

  • 在序列化之前,標籤會依索引鍵字母順序排序,以改善擷取效能。

  • 從輸出省略空的標籤值。

預留金鑰

下列承載金鑰會在明細協定轉換期間從欄位集分割:

  • timestamp – 用作點時間戳記。

  • tableName (透過 ${...}或 @{...}) 參考的金鑰 – 用作資料表名稱。

  • 標籤值參考的索引鍵 (透過 ${...}或 @{...}) – 用作標籤值。

錯誤動作

如果 InfluxDB 動作失敗,則會觸發設定的錯誤動作。

使用 InfluxDB 做為錯誤動作

您可以將 InfluxDB 動作設定為任何規則的錯誤動作。整個承載會寫入單一tableName記錄。錯誤動作的 tableName和 支援訊息範圍替代範本 (${...})tags。

錯誤動作輸出

觸發錯誤動作時,輸出承載包含:ruleName、topic、cloudwatchTraceId、sourceIp、、 clientIdbase64OriginalPayload(Base64 編碼的原始訊息),以及每個項目都有 failedAction、 failedResource和 的failures陣列errorMessage。

透過伺服器端批次處理,承載會使用 payloadsWithMetadata,每個不同的傳入 MQTT 訊息各有一個項目。每個失敗affectedIds的值都是指這些訊息項目id的值;它們不是點索引。用戶端 JSON 陣列是一種傳入訊息,即使它會產生多個 InfluxDB 點。如需完整的承載格式,請參閱 批次處理的錯誤動作。

失敗案例 說明
目的地已停用或錯誤 InfluxDB 動作目的地未啟用。驗證端點擁有權驗證是否成功。
無效目的地 ARN 指定的目的地不存在。
無效的角色 ARN IAM 角色不存在或缺少許可。
秘密擷取失敗 秘密或設定的 secretKey 不存在,或規則動作角色無法擷取或解密秘密。
缺少時間戳記 承載不包含timestamp金鑰。承載中的每個物件必須包含具有整數 Unix epoch 值timestamp的欄位。
無效的時間戳記值 時間戳記值不是整數 (例如,字串、浮點數或 ISO-8601 日期)。值必須是 所指定單位中的整數 Unix epochtimestampUnit。
無效的承載 (無欄位) 承載在移除預留金鑰後,不包含行通訊協定的有效欄位。
欄位索引鍵無效 欄位金鑰為空白或以 開頭_。
用戶端批次包含無效的點 JSON 陣列中的一或多個元素行通訊協定驗證失敗。
標籤 + 欄位超過資料欄限制 合併的標籤和欄位索引鍵超過資料欄計數上限 (250)。
連線失敗 AWS IoT Core 無法連線至 InfluxDB 端點。
身分驗證失敗 InfluxDB 字符無效或已過期。更新 中的秘密 AWS Secrets Manager。
找不到資源 InfluxDB 中不存在指定的資料庫、資料表或組織。
欄位類型衝突 一或多個欄位與現有的結構描述衝突。整個批次寫入失敗。
InfluxDB 伺服器錯誤 InfluxDB 中發生內部錯誤。
InfluxDB 服務無法使用 InfluxDB 暫時無法使用。規則引擎會以指數退避重試。
重要

批次中任何點上的欄位類型衝突會導致整個批次寫入失敗。InfluxDB 不會部分遞交點 – 所有點成功或整個寫入遭拒。

可重試錯誤 (503) 會以指數退避重試。對於 HTTP 401 回應, 會從 AWS IoT Core 重新載入字符 AWS Secrets Manager ,並重試一次請求。不可重試的錯誤 (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) 時,請注意伺服器端批次可能會從用戶端批次處理承載重新排序點。規則引擎會將來自多個傳入訊息的點累積到單一伺服器端批次。由於訊息從不同的裝置或主題非同步到達,因此在原始用戶端承載中排序的點可能會與最終寫入中其他訊息的點交錯。

動作組態:

{ "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 devices/deviceA/telemetry會在時間 T 發佈至 :

[ {"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} ]

這兩個訊息會在 500ms 批次時段 (maxBatchOpenMs) 內送達,因此規則引擎會將所有五個點合併為單一伺服器端批次。

產生的線路通訊協定 (伺服器端批次寫入):

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 的三個點 (時間戳記 1700000000000、1700000000100、1700000000200) 會與裝置 B 的兩個點 (時間戳記 1700000000050、1700000000150) 交錯。伺服器端批次不保證每個訊息中的原始排序。InfluxDB 使用時間戳記欄位將每個點放置在時間軸上,因此重新排序不會影響查詢正確性。不過,如果您的應用程式依賴寫入順序語意 (例如,在相同毫秒內處理欄位類型衝突或last-write-wins重複資料刪除),請注意,有效的寫入順序可能與發佈順序不同。