View a markdown version of this page

InfluxDB - AWS IoT Core

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 monitorizar los datos de series temporales en tiempo real. Puede utilizar el procesamiento por lotes del lado del cliente o del lado del servidor para combinar varios puntos en una sola solicitud de escritura. AWS IoT Core convierte cada mensaje al protocolo de línea InfluxDB y lo escribe en la base de datos y la tabla especificadas. Para obtener más información sobre el formato, consulte el protocolo de línea InfluxDB en la documentación. InfluxData Para obtener información sobre los clústeres gestionados, consulte Amazon Timestream for InfluxDB.

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 acción de InfluxDB.

  • Una función de IAM que AWS IoT puede asumir la función de escribir en sus bases de datos de InfluxDB y realizar la GetSecretValue operación en 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: en el caso de InfluxDB V3, Amazon Timestream para InfluxDB proporciona 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 a partir de su instancia de InfluxDB. Guarde 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:GetSecretValue recuperar 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 entre mayúsculas y minúsculas) con un valor de época entero de Unix. La unidad de marca de tiempo también se puede configurar en la definición de la regla de IoT. AWS IoT Core no genera marcas de tiempo para la acción de InfluxDB, excepto cuando InfluxDB se utiliza como una acción de error.

    nota

    No se puede usar un alias como ts o time no se puede usar en su lugar. timestamp

  • Conectividad HTTPS: se debe poder acceder a su instancia de InfluxDB a través de 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 acción de InfluxDB

Antes de poder utilizar la acción de la regla InfluxDB, debe crear un destino de acción de InfluxDB. El destino define los parámetros de conexión de 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 de conexión HTTPS de la instancia de InfluxDB. No se admite HTTP. Puertos compatibles: 443, 8086, 8181, 8443.
influxDBVersion Cadena Sí La versión 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. Se requiere solo 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 al punto final de las bases de datos de la lista (). 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 una acción de regla de Amazon Timestreamdimensions, el parámetro se asigna a las etiquetas de la acción de InfluxDB y los atributos de los resultados 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 acción de InfluxDB. Admite plantillas de sustitución: No

roleArn

El ARN del rol de IAM que concede 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 se van a escribir los registros. Admite plantillas de sustitución: no. Para enrutar los datos a diferentes bases de datos, cree acciones de regla 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 se van a 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. Admite plantillas de sustitución: no.

tags

Metadatos para cada punto, especificados como un 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 para mejorar el rendimiento de las consultas.

  • En InfluxDB V3, el nombre de cada etiqueta debe ser único dentro de una tabla y no puede duplicar el nombre de un campo.

  • Los valores de las etiquetas admiten plantillas de sustitución por elemento y á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). ns Predeterminado: ms. Admite 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. Rango válido: 1 a 500.

  • maxBatchOpenMs— Tiempo máximo en milisegundos para mantener abierto un lote. Rango válido: de 5 a 1000.

  • maxBatchSizeBytes— Tamaño total máximo en bytes antes del vaciado. Rango válido: 100—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 IoT agrupa los datos de series temporales como una 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 sola 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 (maxBatchSizemaxBatchOpenMs, omaxBatchSizeBytes) configurado.

nota

Tanto el procesamiento por lotes del lado del servidor como el procesamiento por lotes del lado del cliente (cargas útiles de matriz 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 de cada elemento. Para obtener más información, consulte Per-element sustitución de cargas útiles de matriz en AWS IoT reglas.

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 producida 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 @{...} in tableName y tag para resolver la expresión en 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 acciones:

{ "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 de 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 hace referencia @{...} se elimina del conjunto de campos de protocolo de línea, por lo que no aparece también como un campo. En este ejemplo, measurement_type pasa a ser el nombre de la tabla y room se convierte 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 las etiquetas).

  • No puede utilizar @{...} en la regla el SQL (SELECT/WHEREcláusulas), las definiciones de acciones de error ni ninguna otra acción de la 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 ${...} y @{...} tener 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 Los atributos de carga útil restantes no se utilizan como etiquetas, nombre de tabla o marca de tiempo
Timestamp La timestamp clave extraída de la carga útil

Conversión de tipos de datos

AWS IoT Core convierte los valores JSON en los tipos de protocolo de línea InfluxDB de la siguiente manera:

Tipo JSON Tipo de protocolo de línea Ejemplo
Entero (de −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 (de −2³ a 2−1) Rechazado (se desencadena una acción de error) —
Flotante/decimal IEEE-754 flotante 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 de etiqueta no pueden estar vacías ni empezar por un guión bajo (_).

  • En InfluxDB V3, el nombre de la tabla y la clave de etiqueta deben empezar con una letra o un dígito.

  • Las comas, los signos iguales y los espacios en las claves de campo, las claves de etiquetas y los valores de las etiquetas se eliminan automáticamente.

  • Medidas: las comas y los espacios se separan automáticamente.

  • Las etiquetas se ordenan alfabéticamente por clave antes de la serialización para mejorar el rendimiento de la ingesta.

  • Los valores de las etiquetas vacías se omiten de la salida.

Claves reservadas

Las siguientes claves de carga útil se eliminan del conjunto de campos durante la conversión de protocolo de línea:

  • timestamp— Se utiliza como marca de tiempo puntual.

  • Claves a las que se hace referencia mediante tableName (${...}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.

Usar 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 (${...}) son compatibles con la acción de error tableName ytags.

Resultado de la acción de error

Cuando se activa la acción de error, la carga útil de salida contiene: ruleNametopic,cloudwatchTraceId,clientId,sourceIp, base64OriginalPayload (mensaje Base64-encoded original) y una failures matriz en la que cada entrada tiene failedActionfailedResource, yerrorMessage.

Con el procesamiento por lotes del lado del servidor, la carga utilizapayloadsWithMetadata, con una entrada para cada mensaje MQTT entrante distinto. affectedIdsLos valores de cada error se refieren a los id valores de esas entradas de mensajes; no son índices puntuales. Una matriz JSON del lado del cliente es un mensaje entrante aunque produzca varios puntos de InfluxDB. Para ver el formato completo de la carga útil, consulte. Acciones de error al procesar por lotes

Escenario de fallo Description (Descripción)
Destino deshabilitado o error El destino de la acción de InfluxDB no está habilitado. Compruebe que la validación de propiedad del punto final se realizó correctamente.
ARN de destino no válido El destino especificado no existe.
ARN de rol no válido El rol de IAM no existe o carece de permisos.
Fallo al recuperar el secreto El secreto o el configurado secretKey no existen, o la función 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 entero de Unix.
Valor de marca de tiempo no válido El valor de la marca de tiempo no es un entero (por ejemplo, una cadena, un valor flotante o una fecha). ISO-8601 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 un punto no válido Uno o más elementos de una matriz JSON fallaron en la validación del protocolo de línea.
Las etiquetas y los campos superan el límite de columnas Las claves combinadas de etiquetas y campos 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. Actualiza el secreto en. AWS Secrets Manager
No se encontró el recurso La base de datos, tabla u organización especificada no existe en InfluxDB.
Conflicto de tipos de campo Uno o más campos entran en conflicto con el esquema existente. Se produce un error al escribir todo el lote.
Error en el 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 vuelve a intentarlo con un retraso exponencial.
importante

Un conflicto de tipo de campo en cualquier punto de un lote provoca un error en la escritura de todo el lote. InfluxDB no asigna puntos parcialmente: todos los puntos son correctos o se rechaza toda la escritura.

Los errores que se pueden volver a intentar (503) se vuelven a intentar con un retroceso exponencial. Para obtener una respuesta HTTP 401, AWS IoT Core recarga el token desde AWS Secrets Manager la solicitud y vuelve a intentarlo 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 de la regla 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" } } ] } }

Ejemplo de carga útil:

{ "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 en la salida puede variar; los campos no están ordenados 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" } }

Ejemplo de carga útil (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 la regla

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)

Si habilita el procesamiento por lotes del lado del cliente (cargas útiles de matriz JSON) y el procesamiento por lotes del lado del servidor (), tenga en cuenta que el lote del lado del servidor puede reordenar los puntos batchConfig de una carga útil del lado del cliente. El motor de reglas acumula los puntos de varios mensajes entrantes en un único lote del lado del servidor. Como los mensajes llegan de forma asíncrona desde distintos dispositivos o temas, los puntos que estaban ordenados dentro de la carga útil original del cliente pueden intercalarse con los puntos de otros mensajes al escribirlos finalmente.

Configuración de acciones:

{ "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 lotes de 500 ms (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 lado del 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 dentro de la carga útil de cada 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 usa 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 la consulta. Sin embargo, si su aplicación se basa en la semántica del orden de escritura (por ejemplo, gestiona los conflictos de tipos de campo o la deduplicación de la última escritura en el mismo milisegundo), tenga en cuenta que el orden de escritura efectivo puede diferir del orden de publicación.