

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.

# Utilisation AWS Lambda avec MQTT
<a name="tracking-using-mqtt-with-lambda"></a>

Bien que l'utilisation ne AWS Lambda soit plus obligatoire lors de l'envoi des données de localisation de l'appareil à Amazon Location à des fins de suivi, vous souhaiterez peut-être toujours utiliser Lambda dans certains cas. Par exemple, si vous souhaitez traiter vous-même les données de localisation de votre appareil avant de les envoyer à Amazon Location. Les rubriques suivantes décrivent comment utiliser Lambda pour traiter les messages avant de les envoyer à votre tracker. Pour plus d'informations sur ce modèle, consultez l'[architecture de référence](https://d1.awsstatic.com/architecture-diagrams/ArchitectureDiagrams/amazon-location-service-ra.pdf).

**Topics**
+ [Prérequis](#mqtt-prerequisite-with-lambda)
+ [Création d’une fonction Lambda](#mqtt-with-lambda-create-lambda)
+ [Création d'une AWS IoT Core règle](#mqtt-create-iot-rule-with-lambda)
+ [Testez votre AWS IoT Core règle dans la console](#mqtt-test-iot-rule-with-lambda)

## Prérequis
<a name="mqtt-prerequisite-with-lambda"></a>

Avant de commencer le suivi, vous devez [créer une ressource de suivi](start-tracking.md). Pour créer une ressource de suivi, vous pouvez utiliser la console Amazon Location AWS CLI, ou Amazon Location APIs. 

L'exemple suivant utilise la console Amazon Location Service pour créer la ressource de suivi :

1. Ouvrez la console Amazon Location Service à l'adresse [https://console.aws.amazon.com/location/](https://console.aws.amazon.com/location/home).

1. Dans le volet de navigation de gauche, choisissez **Trackers**. 

1.  Choisissez **Créer un tracker**. 

1. Remplissez les cases suivantes :
   + **Nom** — Entrez un nom unique comportant un maximum de 100 caractères. Les entrées valides incluent les caractères alphanumériques, les traits d'union et les traits de soulignement. Par exemple, *MyTracker*.
   + **Description** — Entrez une description facultative. Par exemple, *Tracker for storing AWS IoT Core device positions*.
   + **Filtrage des positions** : sélectionnez le filtrage que vous souhaitez utiliser pour les mises à jour des positions. Par exemple, le filtrage **basé sur la précision**.

1. Choisissez **Créer un tracker**. 

## Création d’une fonction Lambda
<a name="mqtt-with-lambda-create-lambda"></a>

Pour créer une connexion entre Amazon Location Service AWS IoT Core et Amazon, vous avez besoin d'une AWS Lambda fonction permettant de traiter les messages transférés par AWS IoT Core. Cette fonction permet d'extraire toutes les données de position, de les formater pour Amazon Location Service et de les envoyer via l'API Amazon Location Tracker. Vous pouvez créer cette fonction par le biais de la AWS Lambda console, ou vous pouvez utiliser le AWS Command Line Interface (AWS CLI) ou le AWS Lambda APIs. 

Pour créer une fonction Lambda qui publie des mises à jour de position sur Amazon Location à l'aide de la console :

1. Ouvrez la AWS Lambda console à l'adresse [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/home).

1. Dans le menu de navigation de gauche, choisissez **Functions**. 

1.  Choisissez **Créer une fonction** et assurez-vous que **l'option Auteur à partir de zéro** est sélectionnée. 

1. Remplissez les cases suivantes :
   + **Nom de la fonction** — Entrez un nom unique pour votre fonction. Les entrées valides incluent les caractères alphanumériques, les traits d'union et les traits de soulignement sans espaces. Par exemple, *MyLambda*.
   + **Runtime** — Choisissez*Python 3.8*.

1. Choisissez **Créer une fonction**. 

1. Cliquez sur l'onglet **Code** pour ouvrir l'éditeur.

1. [Remplacez le code de l'espace réservé `lambda_function.py` par le code suivant, en remplaçant la valeur attribuée `TRACKER_NAME` par le nom du tracker que vous avez créé comme condition préalable.](#mqtt-prerequisite-with-lambda)

   ```
   from datetime import datetime
   import json
   import os
   
   import boto3
   
   # Update this to match the name of your Tracker resource
   TRACKER_NAME = "MyTracker"
   
   """
   This Lambda function receives a payload from AWS IoT Core and publishes device updates to 
   Amazon Location Service via the BatchUpdateDevicePosition API.
   
   Parameter 'event' is the payload delivered from AWS IoT Core.
   
   In this sample, we assume that the payload has a single top-level key 'payload' and a nested key
   'location' with keys 'lat' and 'long'. We also assume that the name of the device is nested in
   the payload as 'deviceid'. Finally, the timestamp of the payload is present as 'timestamp'. For
   example:
   
   >>> event
   { 'payload': { 'deviceid': 'thing123', 'timestamp': 1604940328,
     'location': { 'lat': 49.2819, 'long': -123.1187 },
     'accuracy': {'Horizontal': 20.5 },
     'positionProperties': {'field1':'value1','field2':'value2'} }
   }
   
   If your data doesn't match this schema, you can either use the AWS IoT Core rules engine to
   format the data before delivering it to this Lambda function, or you can modify the code below to
   match it.
   """
   def lambda_handler(event, context):
     update = {
         "DeviceId": event["payload"]["deviceid"],
         "SampleTime": datetime.fromtimestamp(event["payload"]["timestamp"]).strftime("%Y-%m-%dT%H:%M:%SZ"),
         "Position": [
           event["payload"]["location"]["long"],
           event["payload"]["location"]["lat"]
           ]
       }
     if "accuracy" in event["payload"]:
         update["Accuracy"] = event["payload"]['accuracy']
     if "positionProperties" in event["payload"]:
         update["PositionProperties"] = event["payload"]['positionProperties']
    
     client = boto3.client("location")
     response = client.batch_update_device_position(TrackerName=TRACKER_NAME, Updates=[update])
   
     return {
       "statusCode": 200,
       "body": json.dumps(response)
     }
   ```

1. Choisissez **Déployer** pour enregistrer la fonction mise à jour.

1. Cliquez sur l’onglet **Configuration**.

1. Dans la section **Autorisations**, choisissez le nom du rôle en lien hypertexte pour accorder à Amazon Location Service des autorisations pour votre fonction Lambda.

1. Sur la page **Résumé** de votre rôle, choisissez **Ajouter des autorisations**, puis dans la liste déroulante, sélectionnez **Créer une politique intégrée.**

1. Choisissez l'onglet **JSON** et remplacez la politique par le document suivant. Cela permet à votre fonction Lambda de mettre à jour les positions des appareils gérées par toutes les ressources de suivi dans toutes les régions.

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "WriteDevicePosition",
         "Effect": "Allow",
         "Action": "geo:BatchUpdateDevicePosition",
         "Resource": "arn:aws:geo:*:*:tracker/*"
       }
     ]
   }
   ```

1. Choisissez **Examiner une politique**.

1. Entrez un nom de stratégie. Par exemple, *AmazonLocationTrackerWriteOnly*.

1. Choisissez **Create Policy** (Créer une politique).

Vous pouvez modifier ce code de fonction, le cas échéant, pour l'adapter au schéma de message de votre appareil.

## Création d'une AWS IoT Core règle
<a name="mqtt-create-iot-rule-with-lambda"></a>

Créez ensuite une AWS IoT Core règle pour transmettre la télémétrie de position de vos appareils à la AWS Lambda fonction de transformation et de publication sur Amazon Location Service. L'exemple de règle fourni suppose que toute transformation nécessaire des charges utiles des appareils est gérée par votre fonction Lambda. Vous pouvez créer cette règle via la AWS IoT Core console, le AWS Command Line Interface (AWS CLI) ou le AWS IoT Core APIs.

**Note**  
Bien que la AWS IoT console gère les autorisations nécessaires AWS IoT Core pour appeler votre fonction Lambda, si vous créez votre règle à partir du SDK AWS CLI ou du SDK, vous devez [configurer une politique à laquelle accorder](https://docs.aws.amazon.com/iot/latest/developerguide/lambda-rule-action.html#lambda-rule-action-requirements) l'autorisation. AWS IoT

**Pour créer un à AWS IoT Core l'aide de la console**

1. Connectez-vous à la AWS IoT Core console à l'adresse [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/home).

1. Dans le volet de navigation de gauche, développez **Act**, puis sélectionnez **Rules**.

1. Choisissez **Créer une règle** pour démarrer le nouvel assistant de règles.

1. Saisissez un nom et une description pour la règle.

1. Pour l'**instruction de requête Rule**, mettez à jour l'`FROM`attribut pour faire référence à une rubrique dans laquelle au moins un appareil publie des données de télémétrie incluant la localisation. Si vous testez la solution, aucune modification n'est nécessaire.

   ```
   SELECT * FROM 'iot/topic'
   ```

1. Sous **Définir une ou plusieurs actions**, choisissez **Ajouter une action**.

1. Sélectionnez **Envoyer un message à une fonction Lambda.**

1. Choisissez **Configurer une action**.

1. Recherchez et sélectionnez votre fonction Lambda dans la liste.

1. Choisissez **Add action**.

1. Choisissez **Créer une règle**.

## Testez votre AWS IoT Core règle dans la console
<a name="mqtt-test-iot-rule-with-lambda"></a>

Si aucun appareil ne publie actuellement de télémétrie incluant la localisation, vous pouvez tester votre règle et cette solution à l'aide de la AWS IoT Core console. La console dispose d'un client de test dans lequel vous pouvez publier un exemple de message pour vérifier les résultats de la solution.

1. Connectez-vous à la AWS IoT Core console à l'adresse [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/home).

1. Dans le volet de navigation de gauche, développez **Test**, puis choisissez le **client de test MQTT**.

1. Sous **Publier dans un sujet**, définissez le **nom du sujet** sur *iot/topic* (ou le nom du sujet que vous avez défini dans votre AWS IoT Core règle, s'il est différent) et fournissez les informations suivantes pour la **charge utile du message**. Remplacez l'horodatage *1604940328* par un horodatage valide au cours des 30 derniers jours (tout horodatage de plus de 30 jours est ignoré).

   ```
   {
     "payload": {
       "deviceid": "thing123",
       "timestamp": 1604940328,
       "location": { "lat": 49.2819, "long": -123.1187 },
       "accuracy": { "Horizontal": 20.5 },
       "positionProperties": { "field1": "value1", "field2": "value2" }
     }
   }
   ```

1. Choisissez **Publier** dans le sujet pour envoyer le message de test.

1. Pour vérifier que le message a bien été reçu par Amazon Location Service, utilisez la AWS CLI commande suivante. Si vous les avez modifiés lors de la configuration, remplacez le nom du tracker et l'identifiant de l'appareil par ceux que vous avez utilisés.

   ```
   aws location batch-get-device-position --tracker-name MyTracker --device-ids thing123
   ```