Tutorial: Como formatar uma notificação usando uma função AWS Lambda
Este tutorial demonstra como enviar dados da mensagem MQTT para uma ação AWS Lambda para formatação e envio para outro serviço AWS. Neste tutorial, a ação AWS Lambda usa o SDK AWS para enviar a mensagem formatada para o tópico do Amazon SNS que você criou no tutorial sobre como fazer isso. Tutorial:r Como enviar uma notificação do Amazon SNS
No tutorial sobre como fazer issoTutorial:r Como enviar uma notificação do Amazon SNS, o documento JSON resultante da instrução de consulta da regra foi enviado como o corpo da mensagem de texto. O resultado foi uma mensagem de texto parecida com o seguinte exemplo:
{"device_id":"32","reported_temperature":38,"max_temperature":30}
Neste tutorial, você usará uma ação de regra AWS Lambda para chamar uma função AWS Lambda que formata os dados da instrução de consulta de regra em um formato mais amigável, como este exemplo:
Device 32 reports a temperature of 38, which exceeds the limit of 30.
A função AWS Lambda que você vai criar neste tutorial formata a string da mensagem usando os dados da declaração de consulta de regra e chama a função de publicação do SNS
O que você aprenderá neste tutorial
-
Como criar e testar uma função AWS Lambda
-
Como usar o SDK AWS em uma função AWS Lambda para publicar uma notificação do Amazon SNS
-
Como usar consultas e funções SQL simples em uma instrução de consulta de regra
-
Você pode usar o cliente MQTT para testar uma regra AWS IoT
Este tutorial leva cerca de 45 minutos para ser concluído.
Neste tutorial, você vai:
Antes de começar este tutorial, verifique se você tem o seguinte:
-
Configurar o Conta da AWS
Você precisará de sua Conta da AWS e console de AWS IoT para concluir este tutorial.
-
Revisado Visualizar mensagens MQTT com o cliente MQTT do AWS IoT
Certifique-se de que você pode usar o cliente MQTT para fazer a assinatura e publicar em um tópico. Você usará o cliente MQTT para testar a nova regra neste procedimento.
-
Concluídos os outros tutoriais de regras desta seção
Este tutorial requer o tópico de notificação do SNS que você criou no tutorial sobre como fazer isso Tutorial:r Como enviar uma notificação do Amazon SNS. Também pressupõe que você tenha concluído os outros tutoriais relacionados às regras nesta seção.
-
Revisou a visão geral do AWS Lambda
Se você nunca usou o AWS Lambda antes, consulte AWS Lambda e Começar a usar o Lambda para aprender seus termos e conceitos.
Etapa 1: Criar uma função AWS Lambda que envia uma mensagem de texto
A função AWS Lambda neste tutorial recebe o resultado da declaração de consulta da regra, insere os elementos em uma string de texto e envia a string resultante para o Amazon SNS como mensagem em uma notificação.
Ao contrário do tutorial sobre como Tutorial:r Como enviar uma notificação do Amazon SNS, que usou uma ação de regra AWS IoT para enviar a notificação, este tutorial envia a notificação da função do Lambda usando uma função do SDK AWS. No entanto, o tópico real de notificação do Amazon SNS usado neste tutorial é o mesmo que você usou no tutorial sobre como fazer isso Tutorial:r Como enviar uma notificação do Amazon SNS.
Para criar uma função AWS Lambda que envia uma mensagem de texto
-
Criar uma nova função AWS Lambda.
-
No AWS Lambda console
, selecione Criar função. -
Em Criar função, selecione Usar um esquema.
Pesquise e selecione o esquema
hello-world-python
e, em seguida, escolha Configurar. -
Em Informações básicas:
-
Em Nome do perfil, insira o nome da função,
format-high-temp-notification
. -
Em Função de execução, escolha Criar uma nova função a partir dos modelos AWS de política .
-
No campo Nome do perfil, digite o nome da nova função,
format-high-temp-notification-role
. -
Em Modelos de política - opcional, pesquise e selecione a política de publicação do Amazon SNS.
-
Escolha a opção Criar função.
-
-
-
Modifique o código do esquema para formatar e enviar uma notificação do Amazon SNS.
-
Depois de criar sua função, você deverá ver a página de detalhes da notificação em format-high-temp-notification. Caso contrário, abra-a na página Função do Lambda
-
Na página de detalhes format-high-temp-notification, selecione a guia Configuração e navegue até o painel Código da função
-
Na janela Código da função, no painel Ambiente, escolha o arquivo Python,
lambda_function.py
. -
Na janela Código da função, exclua todo o código original do programa do esquema e substitua-o por esse 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 -
Escolha Implantar.
-
-
Em uma nova janela, consulte o nome do recurso da Amazon (ARN) do tópico do Amazon SNS no tutorial sobre como fazer isso Tutorial:r Como enviar uma notificação do Amazon SNS.
-
Em uma nova janela, abra o console página Tópicos no console do Amazon SNS
. -
Na página Tópicos, encontre o tópico de notificação high_temp_notice na lista de tópicos do Amazon SNS.
-
Encontre o ARN do tópico de notificação high_temp_notice para usar na próxima etapa.
-
-
Crie um caso de teste para sua função do Lambda.
-
Na página Funções do Lambda
do console, na página de detalhes format-high-temp-notification, escolha Selecionar um evento de teste no canto superior direito da página (mesmo que pareça desativado) e escolha Configurar eventos de teste. -
Em Selecionar um evento de teste, escolha Configurar evento de teste.
-
Em Nome do evento, insira
SampleRuleOutput
. -
No editor JSON abaixo do Nome do evento, cole esse exemplo de documento JSON. Esse é um exemplo do que a AWS IoT regra enviará para a função do Lambda.
{ "device_id": "32", "reported_temperature": 38, "max_temperature": 30, "notify_topic_arn": "
arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice
" } -
Consulte a janela que tem o ARN do tópico de notificação high_temp_notice e copie o valor do ARN.
-
Substitua o valor
notify_topic_arn
no editor JSON pelo ARN do seu tópico de notificação.Mantenha essa janela aberta para que você possa usar esse valor de ARN novamente ao criar a regra AWS IoT.
-
Escolha Criar.
-
-
Teste a função com dados de amostra.
-
Na página de detalhes format-high-temp-notification, no canto superior direito, confirme que o termo SampleRuleOutput é exibido próximo ao botão de Teste. Caso contrário, selecione-o na lista de eventos de teste disponíveis.
-
Para enviar a mensagem de saída da regra de amostra para a função, escolha Testar.
-
Se a função e a notificação funcionarem, você receberá uma mensagem de texto no telefone de assinatura da notificação.
Se você não recebeu uma mensagem de texto no telefone, verifique o resultado da operação. No painel Código da função, na guia Resultado da execução, revise a resposta para encontrar quaisquer erros ocorridos. Não prossiga para a próxima etapa até que sua função possa enviar a notificação para seu telefone.
Etapa 2: Criar uma AWS IoT regra com uma ação de regra AWS Lambda
Nesta etapa, você usará a instrução de consulta de regras para formatar os dados do dispositivo de sensor climático imaginário para enviar para uma função do Lambda, que formatará e enviará uma mensagem de texto.
Um exemplo de carga útil de mensagem recebida dos dispositivos meteorológicos tem a seguinte aparência:
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
Nessa regra, você usará a instrução de consulta de regras para criar uma carga útil de mensagem para a função do Lambda que se parece com esta:
{ "device_id": "32", "reported_temperature": 38, "max_temperature": 30, "notify_topic_arn": "
arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice
" }
Ela contém todas as informações que a função do Lambda precisa para formatar e enviar a mensagem de texto correta.
Crie uma regra do AWS IoT para chamar a função do Lambda
-
Abra o hub RegrasAWS IoT do console
. -
Para começar a criar sua nova regra em Regras, escolha a opção Criar.
-
Na parte superior da opção Criar uma regra:
-
Em Nome, insira o nome da regra,
wx_friendly_text
.Lembre-se de que um nome de regra deve ser exclusivo na região Conta da AWS e não pode ter espaços. Usamos um caractere sublinhado nesse nome para separar as duas palavras no nome da regra.
-
Em Descrição, descreva a regra.
Uma descrição significativa facilita lembrar o que essa regra faz e por que você a criou. A descrição pode ser tão longa quanto necessário, portanto, seja o mais detalhista possível.
-
-
Na declaração de consulta de regra de Criar uma regra:
-
Em Uso da versão SQL, selecione
2016-03-23
. -
Na caixa de edição Instrução de consulta de regra, insira a instrução:
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 declaração:
-
Recebe mensagens MQTT com um tópico que corresponda ao filtro de tópicos
device/+/data
e que tenha um valortemperature
maior que 30. -
Seleciona o segundo elemento da cadeia de caracteres do tópico, converte-o em um número decimal e o atribui ao campo
device_id
. -
Seleciona o valor do campo
temperature
na carga da mensagem e o atribui ao camporeported_temperature
. -
Cria um valor constante,
30
, para representar o valor limite e o atribui ao campomax_temperature
. -
Cria um valor constante para o campo
notify_topic_arn
.
-
-
Consulte a janela que tem o ARN do tópico de notificação high_temp_notice e copie o valor do ARN.
-
Substitua o valor do ARN (
arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice
) no editor de instruções de consulta de regras pelo ARN do tópico de notificação.
-
-
Em Definir uma ou mais ações:
-
Para abrir a lista de ações de regra para essa regra, escolha Adicionar ação.
-
Em Selecionar uma ação, escolha Enviar uma mensagem para uma função do Lambda.
-
Para abrir a página de configuração da ação selecionada, na parte inferior da lista de ações, escolha Configurar ação.
-
-
Em Configurar ação:
-
Em Nome do perfil, escolha Selecionar.
-
Escolha a opção format-high-temp-notification.
-
Na parte inferior da opção Configurar ação, escolha Adicionar ação.
-
Para criar a regra, na parte inferior da opção Criar uma regra, escolha Criar regra.
-
Etapa 3: Testar a regra AWS IoT e a ação AWS Lambda da regra
Para testar sua nova regra, você usará o cliente MQTT para publicar e assinar as mensagens MQTT usadas por essa regra.
Abra o cliente MQTT no AWS IoT console
Você pode usar o cliente MQTT para testar a regra
-
No cliente MQTT no AWS IoT console
, assine os tópicos de entrada, neste caso, device/+/data
.-
No Cliente MQTT, em Assinaturas, selecione Assine um tópico.
-
Em Tópico de assinatura, insira o tópico do filtro de tópico de entrada,
device/+/data
. -
Deixe os demais campos com as configurações padrão.
-
Escolha Assinar um tópico.
Na coluna Assinaturas, em Publicar em um tópico,
device/+/data
é exibido.
-
-
Publique uma mensagem no tópico de entrada com um ID de dispositivo específico,
device/32/data
. Você não pode publicar nos tópicos MQTT que contenham caracteres curinga.-
No cliente MQTT, em Assinaturas, selecione Publicar em um tópico.
-
No campo Publicar, insira o nome do tópico de entrada,
device/32/data
. -
Copie os dados de amostra mostrados aqui e, na caixa de edição abaixo do nome do tópico, cole os dados de amostra.
{ "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
Escolha Publicar em um tópico para publicar sua mensagem MQTT.
-
-
Confirme se a mensagem de texto foi enviada.
-
No cliente MQTT, em Assinaturas, há um ponto verde ao lado do tópico assinado anteriormente.
O ponto verde indica que uma ou mais mensagens novas foram recebidas desde a última vez que você as visualizou.
-
Em Assinaturas, escolha dispositivo/+/dado para verificar se a carga útil da mensagem corresponde ao que você acabou de publicar e tem a seguinte aparência:
{ "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
Verifique o telefone utilizado para assinar o tópico do SNS e confirme se o conteúdo da carga útil da mensagem tem a seguinte aparência:
Device 32 reports a temperature of 38, which exceeds the limit of 30.
Se você alterar o elemento ID do tópico no tópico da mensagem, lembre-se de que converter o valor
topic(2)
em um valor numérico só funcionará se esse elemento no tópico da mensagem contiver somente caracteres numéricos.
-
-
Tente enviar uma mensagem MQTT na qual a temperatura não exceda o limite.
-
No cliente MQTT, em Assinaturas, selecione Publicar em um tópico.
-
No campo Publicar, insira o nome do tópico de entrada,
device/33/data
. -
Copie os dados de amostra mostrados aqui e, na caixa de edição abaixo do nome do tópico, cole os dados de amostra.
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
Para enviar sua mensagem MQTT, escolha Publicar no tópico.
Você deve ver a mensagem que enviou na assinatura
device/+/data
; no entanto, como o valor da temperatura está abaixo da temperatura máxima na consulta da regra, você não deve receber uma mensagem de texto.Se não encontrar o comportamento correto, confira as dicas de solução de problemas.
-
Solução de problemas com a regra e notificação AWS Lambda
Aqui estão algumas objetos para verificar caso você não esteja vendo os resultados esperados.
-
Você recebeu um banner de erro
Se um erro apareceu quando você publicou a mensagem de entrada, corrija esse erro primeiro. As etapas a seguir podem ajudá-lo a corrigir esse erro.
-
Você não vê a mensagem de entrada no cliente MQTT
Toda vez que você publica sua mensagem de entrada no tópico
device/32/data
, essa mensagem deve aparecer no cliente MQTT, se tiver assinado o filtro de tópicosdevice/+/data
conforme descrito no procedimento.Pontos importantes
-
Verifique o filtro de tópicos em que você fez a assinatura
Se você fez a assinatura no tópico da mensagem de entrada conforme descrito no procedimento, deverá ver uma cópia da mensagem de entrada toda vez que publicá-la.
Se você não visualizar a mensagem, verifique o nome do tópico em que você fez a assinatura e compare-o com o tópico no qual você publicou. Os nomes dos tópicos diferenciam maiúsculas de minúsculas e o tópico no qual você fez a assinatura deve ser idêntico ao tópico no qual você publicou a carga útil da mensagem.
-
Verifique a função de publicação de mensagens
No cliente MQTT, em Assinaturas, escolha dispositivo/+/dados, verifique o tópico da mensagem de publicação e escolha Publicar no tópico. Você deve ver a carga útil da mensagem na caixa de edição abaixo do tópico aparecer na lista de mensagens.
-
-
Se você não receber uma mensagem SMS
Para que sua regra funcione, ela deve ter a política correta que a autorize a receber uma mensagem e enviar uma notificação do SNS, e ela deve receber a mensagem.
Pontos importantes
-
Verifique o Região da AWS do seu cliente MQTT e a regra que você criou
O console no qual você está executando o cliente MQTT deve estar na mesma região AWS da regra que você criou.
-
Verifique se o valor da temperatura na carga útil da mensagem excede o limite de teste
Se o valor da temperatura for menor ou igual a 30, conforme definido na instrução de consulta da regra, a regra não executará nenhuma das ações.
-
Verifique o tópico da mensagem de entrada na instrução de consulta da regra
Para que a regra funcione, ela deve receber uma mensagem com o nome do tópico que corresponda ao filtro do tópico na cláusula FROM da instrução de consulta da regra.
Verifique a ortografia do filtro de tópico na declaração de consulta de regra com a do tópico no cliente MQTT. Os nomes dos tópicos diferenciam maiúsculas de minúsculas e o tópico da mensagem deve corresponder ao filtro de tópico na instrução de consulta da regra.
-
Verifique o conteúdo da carga útil da mensagem de entrada
Para que a regra funcione, ela deve encontrar o campo de dados na carga da mensagem declarada na instrução SELECT.
Verifique a ortografia do campo
temperature
na instrução de consulta da regra com a da carga útil da mensagem no cliente MQTT. Os nomes dos campos diferenciam maiúsculas de minúsculas e o campotemperature
na instrução de consulta da regra deve ser idêntico ao campotemperature
na carga útil da mensagem.Verifique se o documento JSON na carga útil da mensagem está formatado corretamente. Se o JSON tiver algum erro, como uma vírgula ausente, a regra não poderá lê-lo.
-
Verifique a notificação do Amazon SNS
EmEtapa 1: criar um tópico do Amazon SNS que envia uma mensagem de texto SMS, consulte a etapa 3 que descreve como testar a notificação do Amazon SNS e testar a notificação para garantir que a notificação funcione.
-
Verifique a função do Lambda
Em Etapa 1: Criar uma função AWS Lambda que envia uma mensagem de texto, consulte a etapa 5 que descreve como testar a função do Lambda usando dados de teste e testar a função do Lambda.
-
Verifique a função que está sendo usada pela regra
A ação da regra deve ter permissão para receber o tópico original e publicar o novo tópico.
As políticas que autorizam a regra a receber dados de mensagens e republicá-los são específicas para os tópicos usados. Se você alterar o tópico usado para republicar os dados da mensagem, deverá atualizar a função da ação de regra para atualizar sua política conforme o tópico atual.
Se você suspeitar que esse é o problema, edite a ação da regra de republicação e crie uma nova função. As novas funções criadas pela ação da regra recebem as autorizações necessárias para realizar essas ações.
-
Etapa 4: revisar os resultados e as próximas etapas
Neste tutorial:
-
Você criou uma regra AWS IoT para chamar uma função do Lambda que enviou uma notificação do Amazon SNS usando sua carga de mensagem personalizada.
-
Você usou uma consulta SQL simples e funções em uma instrução de consulta de regra para criar uma nova carga de mensagem para a função do Lambda.
-
Você pode usar o cliente MQTT para testar a regra AWS IoT.
Próximas etapas
Depois de enviar algumas mensagens de texto com essa regra, experimente usá-la para ver como a alteração de alguns aspectos do tutorial afeta a mensagem e quando ela é enviada. Aqui estão algumas ideias para você começar.
-
Altere o
device_id
no tópico da mensagem de entrada e observe o efeito no conteúdo da mensagem de texto. -
Altere os campos selecionados na instrução de consulta de regras, atualize a função do Lambda para usá-los em uma nova mensagem e observe o efeito no conteúdo da mensagem de texto.
-
Altere o teste na consulta da regra para testar uma temperatura mínima em vez de uma temperatura máxima. Atualize a função do Lambda para formatar uma nova mensagem e lembre-se de alterar o nome de
max_temperature
. -
Para saber mais sobre como encontrar erros que possam ocorrer durante o desenvolvimento e o uso de regras de AWS IoT, consulte Como monitorar o AWS IoT.