Tutorial: Formatear una notificación mediante una función AWS Lambda - 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.

Tutorial: Formatear una notificación mediante una función AWS Lambda

En este tutorial se muestra cómo enviar los datos de los mensajes MQTT a una AWS Lambda acción para formatearlos y enviarlos a otro AWS servicio. En este tutorial, la AWS Lambda acción utiliza el AWS SDK para enviar el mensaje formateado al tema de Amazon SNS que creó en el tutorial sobre cómo hacerlo. Tutorial: Envío de una notificación de Amazon SNS

En el tutorial sobre cómo Tutorial: Envío de una notificación de Amazon SNS, el documento JSON resultante de la declaración de consulta de la regla se envió como cuerpo del mensaje de texto. El resultado fue un mensaje de texto parecido al siguiente ejemplo:

{"device_id":"32","reported_temperature":38,"max_temperature":30}

En este tutorial, utilizarás una acción de AWS Lambda regla para llamar a una AWS Lambda función que formatea los datos de la declaración de consulta de la regla en un formato más sencillo, como en este ejemplo:

Device 32 reports a temperature of 38, which exceeds the limit of 30.

La AWS Lambda función que crearás en este tutorial formatea la cadena del mensaje con los datos de la declaración de consulta de la regla y llama a la función de publicación de SNS del AWS SDK para crear la notificación.

Lo que aprenderá en este tutorial:
  • Cómo crear y probar una función AWS Lambda

  • Cómo utilizar el AWS SDK en una AWS Lambda función para publicar una notificación de Amazon SNS

  • Cómo utilizar consultas y funciones SQL sencillas en una declaración de consulta de reglas

  • ¿Cómo usar el cliente MQTT para probar una regla AWS IoT

Para completar este tutorial se necesitan aproximadamente 45 minutos.

Antes de empezar este tutorial, asegúrese de que tiene:

Paso 1: Cree una AWS Lambda función que envíe un mensaje de texto

La AWS Lambda función de este tutorial recibe el resultado de la declaración de consulta de reglas, inserta los elementos en una cadena de texto y envía la cadena resultante a Amazon SNS como mensaje en una notificación.

A diferencia del tutorial sobre cómo Tutorial: Envío de una notificación de Amazon SNS hacerlo, que utilizaba una acción de AWS IoT regla para enviar la notificación, este tutorial envía la notificación desde la función Lambda mediante una función del AWS SDK. Sin embargo, el tema de notificación de Amazon SNS que se utiliza en este tutorial es el mismo que utilizó en el tutorial sobre cómo Tutorial: Envío de una notificación de Amazon SNS.

Para crear una AWS Lambda función que envíe un mensaje de texto
  1. Cree una AWS Lambda función nueva.

    1. En la consola de AWS Lambda, elija Create function (Crear función).

    2. En Crear función, seleccione Usar un esquema.

      Busque y seleccione el esquema hello-world-python y, a continuación, elija Configurar

    3. En Información básica:

      1. En Nombre de la función, escriba el nombre de esta función, format-high-temp-notification.

      2. En Función de ejecución, elija Crear una nueva función a partir de plantillas de AWS políticas.

      3. En Nombre del rol, introduzca el nombre del nuevo rol, format-high-temp-notification-role.

      4. En Plantillas de políticas (opcional), busque y seleccione la política de publicación de Amazon SNS.

      5. Seleccione Crear función.

  2. Modifique el código del esquema para formatear y enviar una notificación de Amazon SNS.

    1. Tras crear la función, debería ver la página de format-high-temp-notificationdetalles. Si no lo hace, ábrala desde la página de Funciones de Lambda.

    2. En la página de format-high-temp-notificationdetalles, selecciona la pestaña Configuración y desplázate hasta el panel de códigos de función.

    3. En la ventana Código de función, en el panel Entorno, elija el archivo Python, lambda_function.py.

    4. En la ventana de códigos de funciones, elimine todo el código original del programa del esquema y sustitúyalo por este código.

      import boto3 # # expects event parameter to contain: # { # "device_id": "32", # "reported_temperature": 38, # "max_temperature": 30, # "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice" # } # # sends a plain text string to be used in a text message # # "Device {0} reports a temperature of {1}, which exceeds the limit of {2}." # # where: # {0} is the device_id value # {1} is the reported_temperature value # {2} is the max_temperature value # def lambda_handler(event, context): # Create an SNS client to send notification sns = boto3.client('sns') # Format text message from data message_text = "Device {0} reports a temperature of {1}, which exceeds the limit of {2}.".format( str(event['device_id']), str(event['reported_temperature']), str(event['max_temperature']) ) # Publish the formatted message response = sns.publish( TopicArn = event['notify_topic_arn'], Message = message_text ) return response
    5. Seleccione Implementar.

  3. En una ventana nueva, busque el nombre de recurso de Amazon (ARN) del tema de Amazon SNS del tutorial sobre cómo Tutorial: Envío de una notificación de Amazon SNS

    1. En una nueva ventana, abra la página Temas de la consola Amazon SNS.

    2. En la página de temas, busque el tema de notificación high_temp_notice en la lista de temas de Amazon SNS.

    3. Busque el ARN del tema de notificación high_temp_notice para usarlo en el siguiente paso.

  4. Cree un caso de prueba para la función de Lambda.

    1. En la página Funciones Lambda de la consola, en la página de format-high-temp-notificationdetalles, elija Seleccionar un evento de prueba en la esquina superior derecha de la página (aunque parezca deshabilitado) y, a continuación, elija Configurar eventos de prueba.

    2. En Configurar evento de prueba, seleccione Crear nuevo evento de prueba.

    3. En Nombre del evento, escriba SampleRuleOutput.

    4. En el editor de JSON, debajo del nombre del evento, pegue este ejemplo de documento JSON. Este es un ejemplo de lo que la AWS IoT regla enviará a la función Lambda.

      { "device_id": "32", "reported_temperature": 38, "max_temperature": 30, "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice" }
    5. Consulte la ventana que contiene el ARN del tema de notificación high_temp_notice y copie el valor del ARN.

    6. Sustituya el valor notify_topic_arn del editor JSON por el ARN del tema de notificaciones.

      Mantenga esta ventana abierta para poder volver a utilizar este valor de ARN al crear la regla AWS IoT .

    7. Seleccione Crear.

  5. Pruebe la función con datos de ejemplo.

    1. En la página de format-high-temp-notificationdetalles, en la esquina superior derecha de la página, confirme que SampleRuleOutputaparece junto al botón Probar. Si no es así, selecciónelo de la lista de eventos de prueba disponibles.

    2. Para enviar el ejemplo de mensaje de salida de la regla a su función, elija Probar.

Si tanto la función como la notificación han funcionado, recibirá un mensaje de texto en el teléfono suscrito a la notificación.

Si no recibió un mensaje de texto en el teléfono, verifique el resultado de la operación. En el panel de códigos de función, en la pestaña Resultado de la ejecución, revise la respuesta para encontrar cualquier error que se haya producido. No continúe con el siguiente paso hasta que la función pueda enviar la notificación a su teléfono.

Paso 2: Crea una AWS IoT regla con una AWS Lambda acción de regla

En este paso, utilizará la sentencia de consulta de reglas para formatear los datos del dispositivo sensor meteorológico imaginario y enviarlos a una función de Lambda, que formateará y enviará un mensaje de texto.

Una muestra de la carga útil de un mensaje recibido de los dispositivos meteorológicos tiene el siguiente aspecto:

{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }

En esta regla, utilizará la sentencia de consulta de reglas para crear una carga de mensajes para la función de Lambda con el siguiente aspecto:

{ "device_id": "32", "reported_temperature": 38, "max_temperature": 30, "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice" }

Contiene toda la información que la función de Lambda necesita para formatear y enviar el mensaje de texto correcto.

Para crear la AWS IoT regla para llamar a una función Lambda
  1. Abra el centro de reglas de la AWS IoT consola.

  2. Para empezar a crear su nueva regla en Reglas, seleccione Crear.

  3. En la parte superior de Crear una regla:

    1. En Nombre, introduzca el nombre de la regla, wx_friendly_text

      Recuerda que el nombre de una regla debe ser único en tu región Cuenta de AWS y no puede tener espacios. Hemos utilizado un carácter de subrayado en este nombre para separar las dos palabras del nombre de la regla.

    2. En Descripción, describa la regla.

      Una descripción significativa hace que sea más fácil recordar lo que hace esta regla y por qué la creó. La descripción puede ser tan larga como sea necesario, por lo que debe ser lo más detallada posible.

  4. En Declaración de consulta de la regla de Crear una regla:

    1. En la versión Uso de SQL, seleccione 2016-03-23.

    2. En el cuadro de edición de la declaración de consulta de reglas, introduzca la siguiente declaración:

      SELECT cast(topic(2) AS DECIMAL) as device_id, temperature as reported_temperature, 30 as max_temperature, 'arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice' as notify_topic_arn FROM 'device/+/data' WHERE temperature > 30

      Esta declaración:

      • Escucha los mensajes MQTT con un tema que coincida con el filtro de temas device/+/data y que tengan un valor temperature superior a 30.

      • Selecciona el segundo elemento de la cadena de temas, lo convierte en un número decimal y lo asigna al campo device_id.

      • Selecciona el valor del campo temperaturede la carga útil del mensaje y lo asigna al campo reported_temperature.

      • Crea un valor constante, 30, para representar el valor límite y lo asigna al campo max_temperature.

      • Crea un valor constante para el campo notify_topic_arn.

    3. Consulte la ventana que contiene el ARN del tema de notificación high_temp_notice y copie el valor del ARN.

    4. Sustituya el valor del ARN (arn:aws:sns:us-east- 1:57 Example833:HIGH_TEMP_NOTICE) en el editor de sentencias de consulta de reglas por el ARN del tema de notificación.

  5. En Establecer una o más acciones:

    1. Para abrir la lista de acciones de regla para esta regla, seleccione Añadir acción.

    2. En Seleccionar una acción, elija Enviar un mensaje a una función de Lambda.

    3. Para abrir la página de configuración de la acción seleccionada, en la parte inferior de la lista de acciones, seleccione Configurar acción.

  6. En Acciones de configuración:

    1. En Nombre de la función, elija Seleccionar.

    2. Elige format-high-temp-notification.

    3. En la parte inferior de Configurar acción, seleccione Añadir acción.

    4. Para crear la regla, en la parte inferior de Crear una regla, seleccione Crear regla.

Paso 3: Pruebe la AWS IoT regla y la acción de AWS Lambda la regla

Para probar la nueva regla, utilizará el cliente MQTT para publicar y suscribirse a los mensajes MQTT utilizados por esta regla.

Abra el cliente MQTT de la consola AWS IoT en una ventana nueva. Ahora puede editar la regla sin perder la configuración de su cliente MQTT. Si abandona el cliente MQTT para ir a otra página de la consola, perderá sus suscripciones o los registros de mensajes.

Para utilizar el cliente MQTT para probar su regla
  1. En el cliente MQTT de la consola de AWS IoT, suscríbase a los temas de entrada, en este caso, device/+/data.

    1. En el cliente MQTT, en Suscripciones, seleccione Suscribirse a un tema.

    2. En el tema de suscripción, introduzca el tema del filtro de temas de entrada, device/+/data.

    3. No cambie el resto de los valores predeterminados de los demás ajustes.

    4. Elija Suscribirse al tema.

      En la columna Suscripciones, aparece device/+/data en Publicar en un tema.

  2. Publique un mensaje en el tema de entrada con un identificador de dispositivo específico, device/32/data No puede publicar en MQTT temas que contengan caracteres comodín.

    1. En el cliente MQTT, en Suscripciones, seleccione Publicar en tema.

    2. En el campo Publicar, introduzca el nombre del tema de entrada,. device/32/data

    3. Copie los datos de ejemplo que se muestran aquí y, en el cuadro de edición situado debajo del nombre del tema, péguelos.

      { "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. Para publicar su mensaje MQTT, elija Publicar en tema.

  3. Confirme que se envió el mensaje de texto.

    1. En el cliente de MQTT, en Suscripciones, hay un punto verde junto al tema al que se ha suscrito anteriormente.

      El punto verdes indica que se han recibido uno o más mensajes nuevos desde la última vez que los consultó.

    2. En Suscripciones, seleccione device/+/data para comprobar que la carga útil de los mensajes coincide con la que acaba de publicar y tiene este aspecto:

      { "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    3. Compruebe el teléfono que utilizó para suscribirse al tema SNS y confirme que el contenido de la carga útil del mensaje tiene este aspecto:

      Device 32 reports a temperature of 38, which exceeds the limit of 30.

      Si cambia el elemento ID del tema en el tema del mensaje, recuerde que la conversión del valor topic(2) a un valor numérico sólo funcionará si ese elemento en el tema del mensaje sólo contiene caracteres numéricos.

  4. Intente enviar un mensaje MQTT en el que la temperatura no supere el límite.

    1. En el cliente MQTT, en Suscripciones, seleccione Publicar en tema.

    2. En el campo Publicar, introduzca el nombre del tema de entrada,. device/33/data

    3. Copie los datos de ejemplo que se muestran aquí y, en el cuadro de edición situado debajo del nombre del tema, péguelos.

      { "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. Para enviar su mensaje MQTT, seleccione Publicar en tema.

    Debería ver el mensaje que envió en la suscripción device/+/data; sin embargo, como el valor de la temperatura está por debajo de la temperatura máxima en la sentencia de consulta de la regla, no debería recibir un mensaje de texto.

    Si no observa el comportamiento correcto, consulte los consejos para la solución de problemas.

Solución de problemas con AWS Lambda la regla y la notificación

He aquí algunas cosas que debe comprobar, en caso de que no esté viendo los resultados que espera.

  • ¿Tiene un mensaje de error

    Si apareció un error al publicar el mensaje de entrada, corrija primero ese error. Los siguientes pasos pueden ayudarle a corregir ese error.

  • No ve el mensaje de entrada en el cliente MQTT

    Cada vez que publique su mensaje de entrada en el tema device/32/data, dicho mensaje debería aparecer en el cliente MQTT si se ha suscrito al filtro de temas device/+/data tal y como se describe en el procedimiento.

    Cosas que debe comprobar
    • Compruebe el filtro de temas al que se ha suscrito

      Si se ha suscrito al tema del mensaje de entrada como se describe en el procedimiento, debería ver una copia del mensaje de entrada cada vez que lo publique.

      Si no ve el mensaje, compruebe el nombre del tema al que se suscribió y compárelo con el tema en el que lo publicó. Los nombres de los temas distinguen entre mayúsculas y minúsculas y el tema al que te suscribiste debe ser idéntico al tema en el que publicaste la carga útil del mensaje.

    • Compruebe la función de publicación de mensajes

      En el cliente MQTT, en Suscripciones, elija device/+/data, marque el tema del mensaje de publicación y, a continuación, elija Publicar en tema. Debería ver la carga útil del mensaje en el cuadro de edición situado debajo del tema en la lista de mensajes.

  • Si no recibe el mensaje SMS:

    Para que su regla funcione, debe tener la política correcta que la autorice a recibir un mensaje y enviar una notificación SNS, y debe recibir el mensaje.

    Cosas que debe comprobar
    • Compruebe el Región de AWS de su cliente MQTT y la regla que creó

      La consola en la que ejecuta el cliente MQTT debe estar en la misma región AWS que la regla que creó.

    • Compruebe que el valor de temperatura de la carga útil del mensaje supera el umbral de prueba

      Si el valor de temperatura es inferior o igual a 30, tal como se define en la sentencia de consulta de la regla, la regla no realizará ninguna de sus acciones.

    • Compruebe el tema del mensaje de entrada en la declaración de consulta de la regla

      Para que la regla funcione, debe recibir un mensaje con el nombre del tema que coincida con el filtro de tema de la cláusula FROM de la declaración de consulta de la regla.

      Compruebe la ortografía del filtro de temas de la declaración de consulta de reglas con la del tema en el cliente MQTT. Los nombres de los temas distinguen mayúsculas de minúsculas y el tema del mensaje debe coincidir con el filtro de tema de la declaración de consulta de reglas.

    • Compruebe el contenido de la carga útil del mensaje de entrada

      Para que la regla funcione, debe encontrar el campo de datos en la carga útil del mensaje que se declara en la sentencia SELECT.

      Compruebe la ortografía del campo temperature en la declaración de consulta de la regla con la de la carga útil del mensaje en el cliente MQTT. Los nombres de los campos distinguen mayúsculas de minúsculas y el campo temperature de la declaración de consulta de la regla debe ser idéntico al campo temperature de la carga útil del mensaje.

      Asegúrese de que el documento JSON de la carga útil del mensaje tenga el formato correcto. Si el JSON contiene algún error, como la falta de una coma, la regla no podrá leerlo.

    • Compruebe la notificación de Amazon SNS

      En Crear un tema de Amazon SNS que envía un mensaje de texto SMS, consulte el paso 3, que describe cómo probar la notificación de Amazon SNS y probar la notificación para asegurarse de que funciona.

    • Comprobar la función de Lambda

      En Paso 1: Cree una AWS Lambda función que envíe un mensaje de texto, consulte el paso 5, que describe cómo probar la función de Lambda con datos de prueba y probar la función de Lambda.

    • Compruebe el rol que utiliza la regla

      La acción de la regla debe tener permiso para recibir el tema original y publicar el tema nuevo.

      Las políticas que autorizan a la regla a recibir datos de los mensajes y volver a publicarlos son específicas de los temas utilizados. Si cambia el tema utilizado para volver a publicar los datos del mensaje, debe actualizar la función de la acción de regla para actualizar su política y que coincida con el tema actual.

      Si sospecha que este es el problema, edite la acción Volver a publicar la regla y cree un nuevo rol. Los nuevos roles creados por la acción de regla reciben las autorizaciones necesarias para realizar estas acciones.

Paso 4: Revisar los resultados y los siguientes pasos

En este tutorial:
  • Creó una AWS IoT regla para llamar a una función de Lambda que enviaba una notificación de Amazon SNS que utilizaba su carga de mensajes personalizada.

  • Utilizó una consulta y funciones SQL sencillas en una sentencia de consulta de reglas para crear una nueva carga útil de mensajes para la función de Lambda.

  • Utilizó el cliente MQTT para probar la regla. AWS IoT

Siguientes pasos

Después de enviar unos cuantos mensajes de texto con esta regla, pruebe a experimentar con ella para ver cómo el cambio de algunos aspectos del tutorial afecta al mensaje y al momento en que se envía. He aquí algunos ejemplos para empezar.

  • Cambie el device_id en el tema del mensaje de entrada y observe el efecto en los contenidos del mensaje de texto.

  • Cambie los campos seleccionados en la sentencia de consulta de reglas, actualice la función de Lambda para utilizarlos en un nuevo mensaje y observe el efecto en el contenido del mensaje de texto.

  • Cambie la prueba en la declaración de consulta de reglas para probar una temperatura mínima en lugar de una temperatura máxima. Actualice la función de Lambda para formatear un mensaje nuevo y recuerde cambiar el nombre de max_temperature.

  • Para obtener más información sobre cómo encontrar los errores que pueden producirse al desarrollar y utilizar AWS IoT reglas, consulteMonitorización AWS IoT.