Tutoriel : Formatage d'une notification à l'aide d'une AWS Lambda fonction - AWS IoT Core

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Tutoriel : Formatage d'une notification à l'aide d'une AWS Lambda fonction

Ce didacticiel explique comment envoyer des données de message MQTT à une AWS Lambda action pour le formatage et l'envoi à un autre AWS service. Dans ce didacticiel, l' AWS Lambda action utilise le AWS SDK pour envoyer le message formaté à la rubrique Amazon SNS que vous avez créée dans le didacticiel sur la procédure à suivre. Tutoriel : envoi d'une notification Amazon SNS

Dans le didacticiel expliquant comment procéderTutoriel : envoi d'une notification Amazon SNS, le document JSON issu de l'déclararionde requête de la règle a été envoyé dans le corps du message texte. Le résultat a été un message texte qui ressemblait à cet exemple :

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

Dans ce didacticiel, vous allez utiliser une action de AWS Lambda règle pour appeler une AWS Lambda fonction qui met en forme les données de l'instruction de requête de règle dans un format plus convivial, comme dans cet exemple :

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

La AWS Lambda fonction que vous allez créer dans ce didacticiel formate la chaîne du message en utilisant les données de l'instruction de requête de règle et appelle la fonction de publication SNS du AWS SDK pour créer la notification.

Ce que vous allez apprendre dans ce didacticiel
  • Comment créer et tester une AWS Lambda fonction

  • Comment utiliser le AWS SDK dans une AWS Lambda fonction pour publier une notification Amazon SNS

  • Comment utiliser des requêtes et des fonctions SQL simples dans une déclararionde requête de règle

  • Comment utiliser le client MQTT pour tester une règle AWS IoT

Ce didacticiel vous prendra environ 45 minutes.

Avant de commencer ce didacticiel, assurez-vous de disposer des éléments suivants :
  • Configurez votre Compte AWS

    Vous aurez besoin de votre AWS IoT console Compte AWS et de votre console pour terminer ce didacticiel.

  • Révisé Afficher les messages MQTT avec le client AWS IoT MQTT

    Assurez-vous de pouvoir utiliser le client MQTT pour vous abonner à un objet et le publier. Vous allez utiliser le client MQTT pour tester votre nouvelle règle dans le cadre de cette procédure.

  • Vous avez terminé les autres didacticiels sur les règles de cette section

    Ce didacticiel nécessite la rubrique de notification SNS que vous avez créée dans le didacticiel pour savoir comment Tutoriel : envoi d'une notification Amazon SNS. Cela suppose également que vous avez suivi les autres didacticiels relatifs aux règles de cette section.

  • J'ai revu l'AWS Lambda aperçu

    Si vous ne l'avez jamais utilisé AWS Lambda auparavant, consultez le AWS Lambdaguide Getting started with Lambda pour en apprendre les termes et les concepts.

Étape 1 : créer une AWS Lambda fonction qui envoie un message texte

La AWS Lambda fonction de ce didacticiel reçoit le résultat de l'instruction de requête de règle, insère les éléments dans une chaîne de texte et envoie la chaîne résultante à Amazon SNS sous forme de message dans une notification.

Contrairement au didacticiel expliquant commentTutoriel : envoi d'une notification Amazon SNS, qui utilisait une action de AWS IoT règle pour envoyer la notification, ce didacticiel envoie la notification à partir de la fonction Lambda à l'aide d'une fonction du AWS SDK. Le objet des notifications Amazon SNS utilisé dans ce didacticiel est toutefois le même que celui que vous avez utilisé dans le didacticiel expliquant comment procéder. Tutoriel : envoi d'une notification Amazon SNS

Pour créer une AWS Lambda fonction qui envoie un message texte
  1. Créez une nouvelle AWS Lambda fonction.

    1. Dans la AWS Lambda console, choisissez Créer une fonction.

    2. Dans Créer une fonction, sélectionnez Utiliser un plan.

      Recherchez et sélectionnez le hello-world-python plan, puis choisissez Configurer.

    3. Dans Informations de base :

      1. Dans Nom de la fonction, entrez le nom de votre fonction, par exemple format-high-temp-notification.

      2. Dans Rôle d'exécution, choisissez Créer un nouveau rôle à partir de modèles de AWS politique.

      3. Dans Role name, entrez un nom pour le nouveau rôle.

      4. Dans Modèles de politiques- (facultatif), recherchez et sélectionnez la politique de publication Amazon SNS.

      5. Choisissez Créer une fonction.

  2. Modifiez le code du plan pour formater et envoyer une notification Amazon SNS.

    1. Après avoir créé votre fonction, vous devriez voir la page de format-high-temp-notificationdétails. Si ce n'est pas le cas, ouvrez-le depuis la page des Lambdafonctions.

    2. Sur la page de format-high-temp-notificationdétails, choisissez l'onglet Configuration et faites défiler l'écran jusqu'au panneau des codes de fonction.

    3. Dans la fenêtre Code de fonction, dans le volet Environnement, choisissez le fichier Python, lambda_function.py.

    4. Dans la fenêtre Code de fonction, supprimez tout le code du programme d'origine du plan et remplacez-le par ce code.

      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. Choisissez Deploy (Déployer).

  3. Dans une nouvelle fenêtre, recherchez l'Amazon Resource Name (ARN) de votre rubrique Amazon SNS Tutoriel : envoi d'une notification Amazon SNS

    1. Dans une nouvelle fenêtre ouvrez la Topics (Rubriques) de la console Amazon SNS.

    2. Sur la page Rubriques, recherchez la rubrique de notification high_temp_notice dans la liste des rubriques Amazon SNS.

    3. Trouvez l'ARN de la rubrique de notification high_temp_notice à utiliser à l'étape suivante.

  4. Créez un scénario de test pour votre fonction Lambda.

    1. Sur la page Fonctions Lambda de la console, sur la page de format-high-temp-notificationdétails, choisissez Sélectionner un événement de test dans le coin supérieur droit de la page (même s'il semble désactivé), puis sélectionnez Configurer les événements de test.

    2. Dans Configure test event (Configurer un événement de test) choisissez Select a test event (Sélectionner un événement de test).

    3. Dans Event name (Nom de l'événement), saisissez SampleRuleOutput.

    4. Dans l'éditeur JSON sous Nom de l'événement, collez cet exemple de document JSON. Voici un exemple de ce que votre AWS IoT règle enverra à la fonction Lambda.

      { "device_id": "32", "reported_temperature": 38, "max_temperature": 30, "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice" }
    5. Reportez-vous à la fenêtre contenant l'ARN de la rubrique de notification high_temp_notice et copiez la valeur de l'ARN.

    6. Remplacez la notify_topic_arn valeur dans l'éditeur JSON par l'ARN de votre objet de notification.

      Gardez cette fenêtre ouverte afin de pouvoir réutiliser cette valeur ARN lors de la création de la AWS IoT règle.

    7. Choisissez Créer.

  5. Testez la fonction avec des exemples de données.

    1. Sur la page de format-high-temp-notificationdétails, dans le coin supérieur droit de la page, vérifiez que cela SampleRuleOutputapparaît à côté du bouton Test. Si ce n'est pas le cas, sélectionnez-le dans la liste des événements de test disponibles.

    2. Pour envoyer le message de sortie de l'exemple de règle à votre fonction, choisissez Test.

Si la fonction et la notification ont toutes deux fonctionné, vous recevrez un message texte sur le téléphone abonné à la notification.

Si vous n'avez pas reçu de SMS au téléphone, vérifiez le résultat de l'opération. Dans le panneau Code de fonction, dans l'onglet Résultat de l'exécution, passez en revue la réponse pour détecter les erreurs qui se sont produites. Ne passez pas à l'étape suivante tant que votre fonction n'a pas pu envoyer la notification à votre téléphone.

Étape 2 : Création d'une AWS IoT règle avec une action de AWS Lambda règle

Au cours de cette étape, vous allez utiliser l'déclararionde requête de règle pour formater les données provenant du capteur météo imaginaire à envoyer à une fonction Lambda, qui formatera et enverra un message texte.

Voici un exemple de charge utile des messages reçus des appareils météorologiques :

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

Dans cette règle, vous allez utiliser l'déclararionrule query pour créer une charge utile de message pour la fonction Lambda qui ressemble à ceci :

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

Il contient toutes les informations dont la fonction Lambda a besoin pour formater et envoyer le message texte correct.

Pour créer la AWS IoT règle permettant d'appeler une fonction Lambda
  1. Ouvrez le hub de règles de la AWS IoT console.

  2. Pour commencer à créer votre nouvelle règle dans Règles, choisissez Créer.

  3. Dans la partie supérieure de Créer une règle :

    1. Dans Nom, entrez le nom de la règle, wx_friendly_text.

      N'oubliez pas qu'un nom de règle doit être unique dans votre région Compte AWS et qu'il ne doit pas comporter d'espaces. Nous avons utilisé un trait de soulignement dans ce nom pour séparer les deux mots du nom de la règle.

    2. Dans Description, décrivez la règle.

      Une description significative permet de se souvenir plus facilement du rôle de cette règle et de la raison pour laquelle vous l'avez créée. La description peut être aussi longue que nécessaire, donc soyez aussi détaillée que possible.

  4. Dans l'déclararionde requête règle de Create a rule :

    1. Dans Utiliser la version SQL, sélectionnez 2016-03-23.

    2. Dans la zone d'édition de la instruction de requête de règle, entrez l'instruction :

      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

      Cette instruction :

      • Écoute les messages MQTT dont le objet correspond au filtre de device/+/data objet et dont la temperature valeur est supérieure à 30.

      • Sélectionne le deuxième élément dans la chaîne de l'objet, le convertit en nombre décimal, puis l'affecte au device_id champ.

      • Sélectionne la valeur du temperature champ dans la charge utile du message et l'affecte au reported_temperature champ.

      • Crée une valeur constante, 30, pour représenter la valeur limite et l'affecte au max_temperature champ.

      • Crée une valeur constante pour le notify_topic_arn champ.

    3. Reportez-vous à la fenêtre contenant l'ARN de la rubrique de notification high_temp_notice et copiez la valeur de l'ARN.

    4. Remplacez la valeur de l'ARN (arn:aws:sns:us-east- 1:57 example833:high_temp_notice) dans l'éditeur d'instructions de requête de règle par l'ARN de votre objet de notification.

  5. Dans Définir une ou plusieurs actions :

    1. Pour ouvrir la liste des actions de règle pour cette règle, choisissez Ajouter une action.

    2. Dans Sélectionner une action, choisissez Envoyer un message à une fonction Lambda.

    3. Pour ouvrir la page de configuration de l'action sélectionnée, en bas de la liste d'actions, choisissez Configurer l'action.

  6. Sous Configurer les actions :

    1. Dans Nom de la fonction, choisissez Sélectionner.

    2. Choisissez format-high-temp-notification.

    3. Au bas de Configurer l'action, choisissez Ajouter une action.

    4. Pour créer la règle, en bas de Créer une règle, sélectionnez Créer une règle.

Étape 3 : tester la AWS IoTAWS Lambda règle et son action

Pour tester votre nouvelle règle, vous allez utiliser le client MQTT pour publier et vous abonner aux messages MQTT utilisés par cette règle.

Ouvrez le client MQTT dans la AWS IoT console dans une nouvelle fenêtre. Vous pouvez désormais modifier la règle sans perdre la configuration de votre client MQTT. Si vous quittez le client MQTT pour accéder à une autre page de la console, vous perdrez vos abonnements ou vos journaux de messages.

Vous pouvez utiliser le client MQTT pour tester votre règle.
  1. Dans le client MQTT de la AWS IoT console, abonnez-vous aux rubriques d'entrée, dans ce cas, device/+/data.

    1. Dans le client MQTT, sous Souscriptions, choisissez Publish to topic.

    2. Dans Sujet d'abonnement, entrez le objet du filtre de objet d'entrée,device/+/data.

    3. Conservez les valeurs par défaut des autres paramètres.

    4. Choisissez Subscribe to topic (S'abonner à la rubrique).

      Dans la colonne Abonnements, la section Publier dans un objet device/+/data apparaît.

  2. Publiez un message sur le objet d'entrée avec un identifiant d'appareil spécifique, device/32/data. Vous ne pouvez pas publier au format MQTT des objets contenant des caractères génériques.

    1. Dans le client MQTT, sous Souscriptions, choisissez Publier dans la rubrique.

    2. Dans le champ Publier, entrez le nom de l'objet d'entrée, device/32/data.

    3. Copiez les exemples de données présentés ici et, dans la zone d'édition située sous le nom de l'objet, collez les exemples de données.

      { "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. Choisissez Publier dans la rubrique pour publier votre message dans .

  3. Confirmez que le message texte a été envoyé.

    1. Dans le client MQTT, sous Abonnements, il y a un point vert à côté de l'objet auquel vous vous êtes abonné plus tôt.

      Le point vert indique qu'un ou plusieurs nouveaux messages ont été reçus depuis la dernière fois que vous les avez consultés.

    2. Sous Abonnements, choisissez device/+/data pour vérifier que la charge utile du message correspond à ce que vous venez de publier et ressemble à ceci :

      { "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    3. Vérifiez le téléphone que vous avez utilisé pour vous abonner à la rubrique SNS et vérifiez que le contenu de la charge utile du message ressemble à ceci :

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

      Si vous modifiez l'élément ID de objet dans le objet du message, n'oubliez pas que la conversion de la topic(2) valeur en valeur numérique ne fonctionnera que si cet élément de l'objet du message contient uniquement des caractères numériques.

  4. Essayez d'envoyer un message MQTT dans lequel la température ne dépasse pas la limite.

    1. Dans le client MQTT, sous Souscriptions, choisissez Publier dans la rubrique.

    2. Dans le champ Publier, entrez le nom de l'objet d'entrée, device/33/data.

    3. Copiez les exemples de données présentés ici et, dans la zone d'édition située sous le nom de l'objet, collez les exemples de données.

      { "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. Pour envoyer votre message MQTT, choisissez Publier dans le objet .

    Vous devriez voir le message que vous avez envoyé dans l'device/+/dataabonnement ; toutefois, comme la valeur de température est inférieure à la température maximale indiquée dans l'énoncé de la requête de règle, vous ne devriez pas recevoir de message texte.

    Si vous ne voyez pas le comportement correct, consultez les conseils de dépannage.

Résolution des problèmes liés à votre AWS Lambda règle et à votre notification

Voici quelques points à vérifier, au cas où vous n'obtiendriez pas les résultats escomptés.

  • Vous avez reçu une bannière d'erreur

    Si une erreur est apparue lorsque vous avez publié le message d'entrée, corrigez-la d'abord. Les étapes suivantes peuvent vous aider à corriger cette erreur.

  • Vous ne voyez pas le message d'entrée dans le client MQTT

    Chaque fois que vous publiez votre message d'entrée dans l’device/32/data objet, ce message doit apparaître dans le client MQTT, si vous vous êtes abonné au filtre de device/+/data objet comme décrit dans la procédure.

    À savoir
    • Vérifiez le filtre de objets auquel vous vous êtes abonné

      Si vous vous êtes abonné au objet du message d'entrée comme décrit dans la procédure, vous devriez voir une copie du message d'entrée chaque fois que vous le publiez.

      Si le message ne s'affiche pas, vérifiez le nom de l'objet auquel vous vous êtes abonné et comparez-le au objet dans lequel vous avez publié. Les noms des objets distinguent les majuscules et minuscules et le objet auquel vous vous êtes abonné doit être identique au objet dans lequel vous avez publié la charge utile du message.

    • Vérifiez la fonction de publication des messages

      Dans le client MQTT, sous Abonnements, choisissez device/+/data, vérifiez l’objet du message de publication, puis choisissez Publier dans le objet. La charge utile du message figurant dans la zone d'édition située sous le objet devrait apparaître dans la liste des messages.

  • Si vous ne recevez pas le message :

    Pour que votre règle fonctionne, elle doit disposer de la politique appropriée l'autorisant à recevoir un message et à envoyer une notification SNS, et elle doit recevoir le message.

    À savoir
    • Vérifiez le nom Région AWS de votre client MQTT et la règle que vous avez créée

      La console dans laquelle vous exécutez le client MQTT doit se trouver dans la même AWS région que la règle que vous avez créée.

    • Vérifiez que la valeur de température dans la charge utile du message dépasse le seuil de test

      Si la valeur de température est inférieure ou égale à 30, telle que définie dans l'déclararionde requête de règle, la règle n'exécutera aucune de ses actions.

    • Vérifiez le objet du message d'entrée dans la déclaration de requête de règle

      Pour que la règle fonctionne, elle doit recevoir un message dont le nom de rubrique correspond au filtre de rubrique figurant dans la clause FROM de l'déclararionde requête de règle.

      Vérifiez l'orthographe du filtre de rubrique dans l'déclararionde requête de règle avec celle de l'objet dans le client MQTT. Les noms de objets distinguent les majuscules et minuscules et le objet du message doit correspondre au filtre de objet indiqué dans l'déclararionde requête de règle.

    • Vérifiez le contenu de la charge utile des messages d'entrée

      Pour que la règle fonctionne, elle doit trouver le champ de données dans la charge utile du message déclarée dans l'déclararionSELECT.

      Vérifiez l'orthographe du temperature champ dans l'déclararionde requête de règle avec celle de la charge utile du message dans le client MQTT. Les noms de champs distinguent les majuscules et minuscules et le temperature champ de l'déclararionde requête de règle doit être identique au temperature champ de la charge du message.

      Assurez-vous que le document JSON contenu dans la charge utile du message est correctement formaté. Si le JSON contient des erreurs, telles qu'une virgule manquante, la règle ne pourra pas le lire.

    • Vérifiez la notification Amazon SNS

      DansÉtape 1 : Créer une rubrique Amazon SNS qui envoie un SMS, reportez-vous à l'étape 3 qui décrit comment tester la notification Amazon SNS et tester la notification pour vous assurer qu'elle fonctionne.

    • La fonction Lambda.

      DansÉtape 1 : créer une AWS Lambda fonction qui envoie un message texte, reportez-vous à l'étape 5 qui décrit comment tester la fonction Lambda à l'aide de données de test et tester la fonction Lambda.

    • Vérifiez le rôle utilisé par la règle

      L'action de règle doit être autorisée à recevoir le objet d'origine et à publier le nouveau objet.

      Les politiques qui autorisent la règle à recevoir les données des messages et à les republier sont spécifiques aux objets utilisés. Si vous modifiez le objet utilisé pour republier les données du message, vous devez mettre à jour le rôle de l'action de règle afin de mettre à jour sa politique afin qu'elle corresponde au objet actuel.

      Si vous pensez que c'est le problème, modifiez l'action Republier la règle et créez un nouveau rôle. Les nouveaux rôles créés par l'action de règle reçoivent les autorisations nécessaires pour effectuer ces actions.

Étape 4 : examen des résultats et des étapes suivantes

Dans ce tutoriel :
  • Vous avez créé une AWS IoT règle pour appeler une fonction Lambda qui envoyait une notification Amazon SNS utilisant la charge utile de vos messages personnalisés.

  • Vous avez utilisé une requête SQL simple et des fonctions dans une déclararionde requête de règle pour créer une nouvelle charge utile de message pour votre fonction Lambda.

  • Vous avez utilisé le client MQTT pour tester votre AWS IoT règle.

Étapes suivantes

Après avoir envoyé quelques SMS avec cette règle, essayez de l'utiliser pour voir comment la modification de certains aspects du didacticiel affecte le message et le moment où il est envoyé. Voici quelques idées pour vous aider à démarrer.

  • Modifiez le device_id dans le objet du message d'entrée et observez l'effet dans le contenu du message texte.

  • Modifiez les champs sélectionnés dans l'déclararionde requête de règle, mettez à jour la fonction Lambda pour les utiliser dans un nouveau message et observez l'effet dans le contenu du message texte.

  • Modifiez le test dans l'déclararionde requête de règle pour tester une température minimale au lieu d'une température maximale. Mettez à jour la fonction Lambda pour formater un nouveau message et n'oubliez pas de changer le nom de max_temperature.

  • Pour en savoir plus sur la façon de détecter les erreurs susceptibles de se produire lors du développement et de l'utilisation de AWS IoT règles, consultezSurveillance AWS IoT.