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 acción AWS Lambda para formatearlos y enviarlos a otro servicio AWS. En este tutorial, la acción AWS Lambda utiliza el SDK AWS para enviar el mensaje formateado al tema de Amazon SNS que creó en el tutorial sobre cómo 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 regla AWS Lambda para llamar a una función AWS Lambda 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 función AWS Lambda que creará 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
Lo que aprenderá en este tutorial:
-
Cómo crear y probar una función AWS Lambda
-
Cómo utilizar el SDK de AWS en una función AWS Lambda para publicar una notificación de Amazon SNS
-
Cómo utilizar consultas y funciones SQL sencillas en una declaración de consulta de reglas
-
Puede utilizar el cliente MQTT de AWS IoT para probar una regla .
Para completar este tutorial se necesitan aproximadamente 45 minutos.
En este tutorial, podrá:
Antes de empezar este tutorial, asegúrese de que tiene:
-
Configuración de Cuenta de AWS
Necesitará su Cuenta de AWS y la consola de AWS IoT para completar este tutorial.
-
Ver los mensajes de MQTT con el cliente MQTT de AWS IoT revisado
Asegúrese de poder utilizar el cliente MQTT para suscribirse a un tema y publicar en él. En este procedimiento, utilizará el cliente MQTT para probar la nueva regla.
-
Completó los demás tutoriales de reglas de esta sección
Este tutorial requiere el tema de notificaciones de SNS que creó en el tutorial sobre cómo Tutorial: Envío de una notificación de Amazon SNS. También asume que ha completado los otros tutoriales relacionados con las reglas de esta sección.
-
Ha revisado la descripción general de AWS Lambda
Si no lo ha utilizado AWS Lambda antes, consulte AWS Lambda e Introducción a Lambda para conocer sus términos y conceptos.
Paso 1: Crear una función AWS Lambda que envía un mensaje de texto
La función AWS Lambda 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, que utilizaba una acción de regla AWS IoT para enviar la notificación, este tutorial envía la notificación desde la función de Lambda mediante una función del SDK AWS. 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 función AWS Lambda que envía un mensaje de texto
-
Crear una nueva función de AWS Lambda.
-
En la consola de AWS Lambda
, elija Create function (Crear función). -
En Crear función, seleccione Usar un esquema.
Busque y seleccione el esquema
hello-world-python
y, a continuación, elija Configurar -
En Información básica:
-
En Nombre de la función, escriba el nombre de esta función,
format-high-temp-notification
. -
En Rol de ejecución, seleccione Crear un nuevo rol a partir de plantillas de políticas AWS.
-
En Nombre del rol, introduzca el nombre del nuevo rol,
format-high-temp-notification-role
. -
En Plantillas de políticas (opcional), busque y seleccione la política de publicación de Amazon SNS.
-
Elija Crear función.
-
-
-
Modifique el código del esquema para formatear y enviar una notificación de Amazon SNS.
-
Tras crear la función, debería ver la página de detalles sobre el format-high-temp-notification. Si no lo hace, ábrala desde la página de Funciones de Lambda
. -
En la página de detalles de format-high-temp-notification, seleccione la pestaña Configuración y desplácese hasta el panel de códigos de funciones.
-
En la ventana Código de función, en el panel Entorno, elija el archivo Python,
lambda_function.py
. -
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 -
Elija Implementar.
-
-
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
-
En una nueva ventana, abra la página Temas de la consola Amazon SNS
. -
En la página de temas, busque el tema de notificación high_temp_notice en la lista de temas de Amazon SNS.
-
Busque el ARN del tema de notificación high_temp_notice para usarlo en el siguiente paso.
-
-
Cree un caso de prueba para la función de Lambda.
-
En la página Funciones de Lambda
de la consola, en la página de detalles de format-high-temp-notification, 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. -
En Configurar evento de prueba, seleccione Crear nuevo evento de prueba.
-
En Nombre del evento, escriba
SampleRuleOutput
. -
En el editor de JSON, debajo del nombre del evento, pegue este ejemplo de documento JSON. Este es un ejemplo de lo que la regla AWS IoT enviará a la función de Lambda.
{ "device_id": "32", "reported_temperature": 38, "max_temperature": 30, "notify_topic_arn": "
arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice
" } -
Consulte la ventana que contiene el ARN del tema de notificación high_temp_notice y copie el valor del ARN.
-
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.
-
Seleccione Crear.
-
-
Pruebe la función con datos de ejemplo.
-
En la página de detalles format-high-temp-notification, en la esquina superior derecha de la página, confirme que aparece SampleRuleOutput junto al botón Probar. Si no es así, selecciónelo de la lista de eventos de prueba disponibles.
-
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: Crear una regla AWS IoT con una acción de regla AWS Lambda
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 regla AWS IoT para llamar a una función de Lambda
-
Abra el centro de reglas de la consola de AWS IoT
. -
Para empezar a crear su nueva regla en Reglas, seleccione Crear.
-
En la parte superior de Crear una regla:
-
En Nombre, introduzca el nombre de la regla,
wx_friendly_text
Recuerde que el nombre de una regla debe ser único en su Cuenta de AWS y región, 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.
-
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.
-
-
En Declaración de consulta de la regla de Crear una regla:
-
En la versión Uso de SQL, seleccione
2016-03-23
. -
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 > 30Esta declaración:
-
Escucha los mensajes MQTT con un tema que coincida con el filtro de temas
device/+/data
y que tengan un valortemperature
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
temperature
de la carga útil del mensaje y lo asigna al camporeported_temperature
. -
Crea un valor constante,
30
, para representar el valor límite y lo asigna al campomax_temperature
. -
Crea un valor constante para el campo
notify_topic_arn
.
-
-
Consulte la ventana que contiene el ARN del tema de notificación high_temp_notice y copie el valor del ARN.
-
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.
-
-
En Establecer una o más acciones:
-
Para abrir la lista de acciones de regla para esta regla, seleccione Añadir acción.
-
En Seleccionar una acción, elija Enviar un mensaje a una función de Lambda.
-
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.
-
-
En Acciones de configuración:
-
En Nombre de la función, elija Seleccionar.
-
Elija el formato de notificación de alta temperatura.
-
En la parte inferior de Configurar acción, seleccione Añadir acción.
-
Para crear la regla, en la parte inferior de Crear una regla, seleccione Crear regla.
-
Paso 3: Probar la regla AWS IoT y la acción la regla AWS Lambda
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
Para utilizar el cliente MQTT para probar su regla
-
En el cliente MQTT de la consola de AWS IoT
, suscríbase a los temas de entrada, en este caso, device/+/data
.-
En el cliente MQTT, en Suscripciones, seleccione Suscribirse a un tema.
-
En el tema de suscripción, introduzca el tema del filtro de temas de entrada,
device/+/data
. -
No cambie el resto de los valores predeterminados de los demás ajustes.
-
Elija Suscribirse al tema.
En la columna Suscripciones, aparece
device/+/data
en Publicar en un tema.
-
-
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.-
En el cliente MQTT, en Suscripciones, seleccione Publicar en tema.
-
En el campo Publicar, introduzca el nombre del tema de entrada,.
device/32/data
-
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 } }
-
Para publicar su mensaje MQTT, elija Publicar en tema.
-
-
Confirme que se envió el mensaje de texto.
-
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ó.
-
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 } }
-
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.
-
-
Intente enviar un mensaje MQTT en el que la temperatura no supere el límite.
-
En el cliente MQTT, en Suscripciones, seleccione Publicar en tema.
-
En el campo Publicar, introduzca el nombre del tema de entrada,.
device/33/data
-
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 } }
-
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.
-
Solucionar problemas con la regla AWS Lambda y 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 temasdevice/+/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 la Región de AWS de su cliente MQTT y la regla que ha creado
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 campotemperature
de la declaración de consulta de la regla debe ser idéntico al campotemperature
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 Paso 1: 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: Crear una función AWS Lambda que envía 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 regla AWS IoT 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.
-
Ha utilizado el cliente MQTT para probar su 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 saber más sobre cómo encontrar los errores que pueden producirse mientras implementa y utiliza las reglas de AWS IoT, consulte Supervisión de AWS IoT.