Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
InfluxDB
Elija esta acción si desea consultar la telemetría del dispositivo para conocer las tendencias operativas o supervisar los datos de series temporales en tiempo real. Puede usar el procesamiento por lotes del lado del cliente o del lado del servidor para combinar varios puntos en una solicitud de escritura. AWS IoT Core convierte cada mensaje al protocolo de línea de InfluxDB y lo escribe en la base de datos y tabla especificadas. Para obtener más información sobre el formato, consulte el protocolo de línea de
En este tema:
Requisitos previos
Esta acción de regla tiene los siguientes requisitos previos:
-
Un destino de acción de InfluxDB: cree un destino de acción de InfluxDB que especifique el punto final, la versión y las credenciales de su instancia de InfluxDB. AWS IoT Core valida la propiedad del punto final antes de enviar el tráfico. Consulte Destino de la acción de InfluxDB.
-
Una función de IAM que consiste AWS IoT en escribir en sus bases de datos de InfluxDB y realizar la
GetSecretValueoperación con el secreto que almacena sus credenciales de InfluxDB. Para obtener más información, consulte Otorgar un AWS IoT reglamentar el acceso que requiere. -
Credenciales de InfluxDB almacenadas en AWS Secrets Manager: para InfluxDB V3, Amazon Timestream para InfluxDB aprovisiona automáticamente un secreto de Secrets Manager al crear el clúster de InfluxDB. El secreto contiene las credenciales del clúster. Para InfluxDB V2, genere un token de API personalizado o de acceso total desde su instancia de InfluxDB. Almacene el valor del token como un secreto de texto sin formato en. AWS Secrets Manager Para obtener más información sobre la creación de un token, consulte Crear un token
en la InfluxData documentación. En tiempo de ejecución, la acción de la regla exige secretsmanager:GetSecretValuerecuperar estas credenciales antes de autenticarse en su punto final de InfluxDB. -
Marca de tiempo en la carga útil del mensaje: cada objeto de la carga útil del mensaje debe contener una clave denominada
timestamp(distingue mayúsculas y minúsculas) con un valor de época Unix entero. La unidad de marca de tiempo también se puede establecer en la definición de reglas de IoT. AWS IoT Core no genera marcas de tiempo para la acción de InfluxDB, excepto cuando InfluxDB se usa como una acción de error.nota
No se puede usar un alias como
tsotimeno se puede usar en lugar de.timestamp -
Conectividad HTTPS: su instancia de InfluxDB debe ser accesible desde AWS IoT Core HTTPS. Los puertos de salida compatibles son: 443, 8443, 8086 (puerto predeterminado para InfluxDB V2) y 8181 (puerto predeterminado para InfluxDB V3).
-
JSON-format carga útil: la acción InfluxDB procesa únicamente las cargas útiles de JSON. Si sus dispositivos publican datos binarios o de Protobuf, utilice la decode() función de su regla SQL para convertirlos a JSON antes de que se ejecute la acción.
Destino de la acción de InfluxDB
Antes de poder utilizar la acción de la regla de InfluxDB, debe crear un destino de acción de InfluxDB. El destino define los parámetros de conexión para su instancia de InfluxDB. AWS IoT Core luego valida la propiedad del punto final.
Crear un destino
Utilice la CreateTopicRuleDestination API para crear un destino de 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" } } }
Parámetros de destino
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
endpoint |
Cadena | Sí | La URL del punto final HTTPS de su instancia de InfluxDB. No se admite HTTP. Puertos compatibles: 443, 8086, 8181, 8443. |
influxDBVersion |
Cadena | Sí | La versión de InfluxDB. Valores válidos: V2, V3. |
secretId |
Cadena | Sí | El nombre o el ARN del AWS Secrets Manager secreto que contiene su token de InfluxDB. |
secretType |
Cadena | No | El tipo de valor secreto. Valores válidos: SecretString, SecretBinary. |
secretKey |
Cadena | No | La clave del JSON secreto que contiene el token de autenticación. Solo se requiere cuando el secreto es un objeto JSON con varias claves. |
Validación de la propiedad del terminal
Al crear un destino de acción de InfluxDB, AWS IoT Core valida la propiedad del punto final autenticándose en la API de InfluxDB con las credenciales que proporcionó:
-
InfluxDB V2: llama al punto final. AWS IoT Core
/api/v2/me -
InfluxDB V3: AWS IoT Core llama a la lista de bases de datos endpoint ().
GET /api/v3/configure/database
Una respuesta correcta (2xx) establece el estado del destino en. ENABLED En caso de error, AWS IoT Core establece el estado enERROR. Para volver a intentar la validación, llame UpdateTopicRuleDestination con el estado establecido en. IN_PROGRESS
Mapeo terminológico de InfluxDB
Los siguientes términos difieren entre InfluxDB V2 y V3.
| AWS IoT Core parámetro | Término de InfluxDB V2 | Término de InfluxDB V3 |
|---|---|---|
databaseName |
Bucket | Base de datos |
tableName |
Medida | Tabla |
nota
Si está migrando desde la acción de reglas de Amazon Timestream, el dimensions parámetro se asigna a las etiquetas de la acción InfluxDB y los atributos del resultado de la consulta se asignan a los campos.
Parameters
Al crear una AWS IoT regla con la acción InfluxDB, debe especificar la siguiente información:
destinationArn-
El ARN del destino de la acción de InfluxDB. Consulte Destino de la acción de InfluxDB. Admite plantillas de sustitución: No
roleArn-
El ARN del rol de IAM que concede el AWS IoT permiso para acceder al secreto de Secrets Manager. Consulte Requisitos previos. Admite plantillas de sustitución: No
databaseName-
El nombre de la base de datos de InfluxDB (denominada depósito en InfluxDB v2 o base de datos en InfluxDB v3) en la que escribir registros. Soporta plantillas de sustitución: No. Para enrutar datos a diferentes bases de datos, cree acciones de reglas independientes para cada base de datos.
tableName-
El nombre de la tabla (denominada medición en InfluxDB v2 o tabla en InfluxDB v3) en la que escribir los registros. Admite plantillas de sustitución: Sí
organization-
El nombre de la organización de InfluxDB. Necesario para InfluxDB v2. Si incluye este parámetro para InfluxDB v3, se ignora. Soporta plantillas de sustitución: No.
tags-
Metadatos para cada punto, especificados como mapa. Cada clave de mapa es un nombre de etiqueta y cada valor de mapa es el valor de etiqueta correspondiente. Las etiquetas se indexan según el rendimiento de las consultas.
-
En InfluxDB V3, cada nombre de etiqueta debe ser único en una tabla y no puede duplicar un nombre de campo.
-
Los valores de las etiquetas admiten plantillas de sustitución por elemento y por ámbito de mensaje.
-
timestampUnit-
La precisión del valor de la marca de tiempo en la carga útil. Valores válidos:
s(segundos) |ms(milisegundos) | (microsegundos) |us(nanosegundos).nsPredeterminado:ms. Soporta plantillas de sustitución: No. batchConfig-
Configuración de procesamiento por Server-side lotes (opcional). Para obtener más información, consulte Agrupación en lotes.
-
maxBatchSize— Número máximo de puntos en cada lote. Intervalo válido: 1 a 500. -
maxBatchOpenMs— Tiempo máximo en milisegundos para mantener abierto un lote. Intervalo válido: de 5 a 1000. -
maxBatchSizeBytes— Tamaño total máximo en bytes antes del vaciado. Intervalo válido: 100 a 131 072. -
batchAcrossTopics: booleano. Cuandotrue, el lote incluye puntos de mensajes sobre diferentes temas. Predeterminado:false.
-
Agrupación en lotes
La acción InfluxDB admite dos modos de procesamiento por lotes.
Client-side procesamiento por lotes
Su dispositivo de IoT agrupa datos de series temporales en lotes en forma de matriz JSON y los publica como un único mensaje MQTT. Con el procesamiento por lotes del lado del cliente, cada elemento de la matriz se convierte en un punto de protocolo de línea en una única solicitud de escritura. No necesita ninguna configuración adicional.
Server-side procesamiento por lotes
Utilice el procesamiento por lotes del lado del servidor para agrupar los mensajes individuales antes de escribirlos en InfluxDB. Configure el procesamiento por lotes del lado del servidor mediante el parámetro. batchConfig El lote se vacía cuando se alcanza primero cualquier límite configurado (maxBatchSizemaxBatchOpenMs, omaxBatchSizeBytes).
nota
Tanto el procesamiento por lotes del lado del servidor como el del lado del cliente (cargas útiles de matrices JSON) se pueden configurar al mismo tiempo.
La acción de InfluxDB se mide en función del tamaño de la carga útil saliente en incrementos de 5 KiB. Line-protocol Los errores de conversión también se miden.
Per-element plantillas para cargas útiles de matrices
Cuando sus dispositivos de IoT envían datos de series temporales por lotes como una matriz JSON, puede usar las «plantillas de sustitución por elemento» para resolver los valores de cada elemento individual de la matriz. Esto dirige cada punto de datos a una tabla diferente o aplica etiquetas específicas para cada elemento. Para obtener más información, consulte Per-element las plantillas.
Sintaxis de dos plantillas de sustitución
-
${expression}— Se resuelve en el ámbito del mensaje, comparándolo con el mensaje entrante del dispositivo. Se evalúa una vez para cada mensaje; el mismo valor se aplica a todos los puntos de la matriz. -
@{expression}— Se resuelve en el ámbito del elemento, comparándolo con un elemento individual de la carga útil generado por la sentencia SQL SELECT de la regla. Re-evaluated para cada elemento de la matriz, por lo que cada punto puede obtener un valor diferente. Para obtener más información, consulte@{expression}la referencia.
Utilice @{...} los valores de tableName entrada y etiqueta para resolver la expresión con respecto a cada elemento de la matriz de forma individual.
Ejemplo
Dada la siguiente carga útil del dispositivo (matriz JSON):
[ {"measurement_type": "temperature", "room": "kitchen", "timestamp": 1700000000000, "value": 23.5}, {"measurement_type": "humidity", "room": "bedroom", "timestamp": 1700000001000, "value": 60.1} ]
Y la siguiente configuración de acción:
{ "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" } }
La salida del protocolo de línea resultante contiene dos puntos:
temperature,room=kitchen value=23.5 1700000000000 humidity,room=bedroom value=60.1 1700000001000
nota
Un campo al que @{...} se hace referencia con se elimina del conjunto de campos de protocolo de línea, por lo que no aparece también como campo. En este ejemplo, measurement_type se convierte en el nombre de la tabla y room en una etiqueta, por lo que ninguno de los dos aparece en el conjunto de campos; value es el único campo.
Restricciones
-
@{...}solo se admite en la configuración de acciones de InfluxDB (tableNamey en los valores de etiqueta). -
No puede utilizar el SQL (SELECT/WHEREcláusulas)
@{...}en las reglas, las definiciones de acciones de error ni ninguna otra acción de regla. -
En el interior solo se admiten referencias de campo
@{...}. No se admiten funciones. -
Cada valor admite como máximo un
@{...}marcador. Si hay varios marcadores en un solo valor, se produce una excepción de API. -
No se pueden mezclar
${...}dos valores@{...}en el mismo valor. La mezcla produce una excepción de API. -
Un único objeto JSON se trata como una matriz de un elemento.
Contenido del registro de InfluxDB
Para cada registro del resultado de la consulta posterior a SQL, el punto de protocolo de línea de InfluxDB resultante contiene los siguientes componentes:
| Componente | origen |
|---|---|
| Tabla | El valor del parámetro tableName |
| Tags | Los pares clave-valor del parámetro tags |
| Campos | El resto de los atributos de carga útil no se utilizan como etiquetas, nombres de tablas o marcas de tiempo |
| Timestamp | La timestamp clave extraída de la carga |
Conversión de tipos de datos
AWS IoT Core convierte los valores JSON en tipos de protocolo de línea de InfluxDB de la siguiente manera:
| tipo JSON | Tipo de protocolo de línea | Ejemplo |
|---|---|---|
| Entero (−2³ a 2³−1) | Entero con i signo (sufijo) |
42 → 42i |
| Entero (de 2, ³ a 2, -1) | Entero sin u signo (sufijo) |
9223372036854775808 →
9223372036854775808u |
| Entero exterior (−2³ a 2−1) | Rechazado (se ha activado una acción de error) | — |
| Flotante/decimal | IEEE-754 Float de 64 bits | 23.5 → 23.5 |
| Booleano | t o f |
true → t |
| Cadena | Cadena entre comillas | "active" →
"active" |
| Nulo | Omitido (no escrito) | — |
| Objeto o matriz | Cadena JSON compactada (sin espacios en blanco) | {"a":1} →
"{\"a\":1}" |
Restricciones de denominación
-
Las teclas de campo y las teclas de etiqueta no pueden estar vacías ni empezar con un carácter de subrayado (
_). -
En InfluxDB V3, el nombre de la tabla y la clave de la etiqueta deben comenzar con una letra o un dígito.
-
Las comas, los signos de igualdad y los espacios de las claves de campo, las claves de etiqueta y los valores de las etiquetas se omiten automáticamente.
-
Medidas: las comas y los espacios se eliminan automáticamente.
-
Las etiquetas se ordenan alfabéticamente por clave antes de la serialización para mejorar el rendimiento de la ingestión.
-
Los valores de etiqueta vacíos se omiten en la salida.
Claves reservadas
Las siguientes claves de carga útil se eliminan del conjunto de campos durante la conversión de protocolos de línea:
-
timestamp— Se utiliza como marca de tiempo del punto. -
Claves a las que se hace referencia mediante
tableName(mediante${...}o@{...}): se utilizan como nombre de la tabla. -
Claves a las que se hace referencia mediante el valor de la etiqueta (mediante
${...}o@{...}): se utilizan como valores de etiqueta.
Acciones de error
Si la acción de InfluxDB falla, se activa la acción de error configurada.
Uso de InfluxDB como acción de error
Puede configurar la acción de InfluxDB como una acción de error para cualquier regla. Toda la carga útil se escribe en un único registrotableName. Message-scope las plantillas de sustitución (${...}) se admiten en las acciones de error tableName ytags.
Resultado de la acción de error
Cuando se desencadena la acción de error, la carga útil de salida contiene: ruleName topiccloudwatchTraceId,,clientId,sourceIp, base64OriginalPayload (mensaje Base64-encoded original) y una failures matriz en la que cada entrada tiene failedActionfailedResource, yerrorMessage.
En el procesamiento por lotes del lado del servidor, la carga útil utiliza payloadsWithMetadata una entrada para cada mensaje MQTT entrante distinto. affectedIdsLos valores de cada error se refieren a los id valores de esas entradas de mensaje; no son índices de puntos. Una matriz JSON del lado del cliente es un mensaje entrante, aunque produce varios puntos de InfluxDB. Para ver el formato completo de la carga útil, consulte. Acciones de error para el procesamiento por lotes
| Escenario de error | Description (Descripción) |
|---|---|
| Destino DESACTIVADO o ERROR | El destino de la acción de InfluxDB no está habilitado. Compruebe que la validación de la propiedad del terminal se realizó correctamente. |
| El ARN de destino no es válido | El destino especificado no existe. |
| El ARN del rol no es válido | El rol de IAM no existe o carece de permisos. |
| Fallo de recuperación del secreto | El secreto o la configuración secretKey no existen, o el rol de acción de la regla no puede recuperar ni descifrar el secreto. |
| Falta la marca de tiempo | La carga útil no contiene ninguna clave. timestamp Cada objeto de la carga útil debe incluir un timestamp campo con un valor de época Unix entero. |
| Valor de marca de hora no válido | El valor de la marca de tiempo no es un entero (por ejemplo, una cadena, un valor flotante o una ISO-8601 fecha). El valor debe ser una época Unix entera en la unidad especificada por. timestampUnit |
| Carga útil no válida (sin campos) | La carga útil no contiene campos válidos para el protocolo de línea después de eliminar las claves reservadas. |
| Clave de campo no válida | La clave de campo está vacía o empieza por_. |
| El lote del cliente contiene puntos no válidos | Uno o más elementos de una matriz JSON no pudieron validar el protocolo de línea. |
| Las etiquetas y los campos superan el límite de columnas | Las claves de campo y etiquetas combinadas superan el número máximo de columnas (250). |
| Error de conexión | AWS IoT Core no se pudo conectar al punto final de InfluxDB. |
| Error de autenticación | El token de InfluxDB no es válido o ha caducado. Actualice la entrada secreta. AWS Secrets Manager |
| No se encontró el recurso | La base de datos, tabla u organización especificada no existe en InfluxDB. |
| Conflicto de tipo de campo | Uno o más campos entran en conflicto con el esquema existente. Se produce un error en la escritura del lote completo. |
| Error del servidor InfluxDB | Se ha producido un error interno en InfluxDB. |
| El servicio InfluxDB no está disponible | InfluxDB no está disponible temporalmente. El motor de reglas se reintenta con un retroceso exponencial. |
importante
Un conflicto de tipos de campo en cualquier punto de un lote provoca un error en la escritura del lote completo. InfluxDB no asigna puntos parcialmente; o bien todos los puntos son correctos o se rechaza la escritura completa.
Los errores reintentables (503) se reintentan con un retroceso exponencial. Para obtener una respuesta HTTP 401, AWS IoT Core vuelve a cargar el token desde AWS Secrets Manager y vuelve a intentar la solicitud una vez. Non-retryable los errores (404, 422) activan la acción de error inmediatamente. Para conocer los límites de reintentos, consulta las cuotas AWS IoT Core de servicio.
Ejemplos
Acción reglamentaria de 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" } } ] } }
Carga útil de muestra:
{ "timestamp": 1700000000000, "temperature": 23.5, "humidity": 60.1, "pressure": 1013.25, "battery_level": 87 }
Protocolo de línea resultante:
device_metrics,device_id=myDevice123,location=building-a temperature=23.5,humidity=60.1,pressure=1013.25,battery_level=87i 1700000000000
El orden de los campos del resultado puede variar; los campos no se ordenan alfabéticamente.
Client-batched carga útil de matriz con plantillas por elemento
{ "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" } }
Carga útil de muestra (publicada en): 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} ]
Protocolo de línea resultante:
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
Server-side procesamiento por lotes con InfluxDB
Para añadir el procesamiento por lotes del lado del servidor a cualquier acción de InfluxDB, incluya en la configuración de la acción: batchConfig
"batchConfig": { "maxBatchSize": 50, "maxBatchOpenMs": 1000, "maxBatchSizeBytes": 65536, "batchAcrossTopics": false }
Política de IAM para la función de acción de reglas
Política de confianza:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Service": "iot.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }
Política de permisos
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:us-west-2:111122223333:secret:my-influxdb-secret-a1b2c3" } ] }
Procesamiento por lotes combinado del lado del cliente y del lado del servidor (reordenamiento de puntos)
Al habilitar tanto el procesamiento por lotes del lado del cliente (cargas útiles de matrices JSON) como el procesamiento por lotes del lado del servidor (), tenga en cuenta que el lote del lado del servidor puede reordenar los puntos de una carga por lotes del lado del cliente. batchConfig El motor de reglas acumula puntos de varios mensajes entrantes en un único lote del lado del servidor. Como los mensajes llegan de forma asincrónica desde diferentes dispositivos o temas, los puntos que se ordenaron dentro de la carga útil original del cliente pueden intercalarse con los puntos de otros mensajes en la escritura final.
Configuración de la acción:
{ "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 } } }
El dispositivo A publica devices/deviceA/telemetry en el momento 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} ]
El dispositivo B publica devices/deviceB/telemetry en el momento T+10 ms:
[ {"measurement_type": "temperature", "floor": "3", "timestamp": 1700000000050, "value": 21.8}, {"measurement_type": "humidity", "floor": "3", "timestamp": 1700000000150, "value": 62.3} ]
Ambos mensajes llegan dentro del intervalo de 500 ms por lotes (maxBatchOpenMs), por lo que el motor de reglas combina los cinco puntos en un único lote del lado del servidor.
Protocolo de línea resultante (escritura por lotes en el servidor):
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
Observe que los puntos ya no están en el orden en que aparecían en cada carga útil de cliente. Los tres puntos del dispositivo A (marcas de tiempo 1700000000000, 1700000000100, 1700000000200) se intercalan con los dos puntos del dispositivo B (marcas de tiempo 1700000000050, 1700000000150). El lote del servidor no garantiza el pedido original de cada mensaje. InfluxDB utiliza el campo de marca de tiempo para colocar cada punto en la línea de tiempo, por lo que el reordenamiento no afecta a la exactitud de las consultas. Sin embargo, si su aplicación se basa en la semántica del orden de escritura (por ejemplo, gestionar los conflictos entre tipos de campo o la deduplicación de la última escritura gana en el mismo milisegundo), tenga en cuenta que el orden de escritura efectivo puede diferir del orden de publicación.