Tutorial: Use AWS Lambda com o MQTT - Amazon Location Service

Tutorial: Use AWS Lambda com o MQTT

Embora o uso do AWS Lambda não seja mais necessário ao enviar dados de localização do dispositivo para o Amazon Location para rastreamento, talvez você ainda queira usar o Lambda em alguns casos. Por exemplo, se você mesmo quiser processar os dados de localização do seu dispositivo, antes de enviá-los para o Amazon Location. Os tópicos a seguir descrevem como usar o Lambda para processar as mensagens antes de enviá-las ao rastreador. Para obter mais informações sobre esse padrão, consulte a arquitetura de referência.

Pré-requisitos

Antes de começar a rastrear, você deve criar um recurso de rastreador. Para criar um recurso de rastreamento, você pode usar o console do Amazon Location, a AWS CLI, ou as APIs do Amazon Location.

O exemplo a seguir usa o console do Amazon Location Service para criar o recurso rastreador:

  1. Abra o console do Amazon Location Service em https://console.aws.amazon.com/location/.

  2. No painel de navegação à esquerda, selecione Rastreadores.

  3. Selecione Criar rastreador.

  4. Preencha as seguintes caixas:

    • Nome: insira um nome exclusivo com no máximo 100 caracteres. As entradas válidas incluem caracteres alfanuméricos, hífens e sublinhados. Por exemplo, MyTracker.

    • Descrição: insira uma descrição opcional. Por exemplo, Rastreador para armazenar as posições do dispositivo AWS IoT Core.

    • Filtragem de posição: selecione a filtragem que você deseja usar para atualizações de posição. Por exemplo, Filtragem baseada em precisão.

  5. Selecione Criar rastreador.

Criar uma função do Lambda

Para criar uma conexão entre AWS IoT Core o Amazon Location Service, você precisa de uma função AWS Lambda para processar as mensagens encaminhadas pelo AWS IoT Core. Essa função extrairá todos os dados posicionais, os formatará para o Amazon Location Service e os enviará por meio da API do rastreador do Amazon Location. Você pode criar essa função por meio do console AWS Lambda ou usar o AWS Command Line Interface (AWS CLI) ou as APIs do AWS Lambda.

Para criar uma função do Lambda que publique atualizações de posição no Amazon Location usando o console:

  1. Abra o console AWS Lambda em https://console.aws.amazon.com/lambda/.

  2. No painel de navegação à esquerda, selecione Funções.

  3. Selecione Criar função e confirme se Autor do zero está selecionado.

  4. Preencha as seguintes caixas:

    • Nome da função: insira um nome para a sua função. Entradas válidas incluem caracteres alfanuméricos, hifens, pontos e sublinhados, sem espaços. Por exemplo, MyLambda.

    • Runtime: selecione Python 3.8.

  5. Selecione Criar função.

  6. Selecione a guia Código para abrir o editor.

  7. Substitua o código do espaço reservado em lambda_function.py pelo seguinte, substituindo o valor atribuído a TRACKER_NAME pelo nome do rastreador que você criou como pré-requisito.

    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) }
  8. Selecione Implantar para salvar a função atualizada.

  9. Escolha a guia Configuração.

  10. Na seção Permissões, escolha o nome da Função com hiperlink para conceder permissões do Amazon Location Service à sua função do Lambda.

  11. Na página de Resumo do seu perfil, escolha Adicionar permissões e, na lista suspensa, selecione Criar política embutida.

  12. Escolha a guia JSON e sobrescreva a política com o seguinte documento. Isso permite que sua função do Lambda atualize as posições do dispositivo gerenciadas por todos os recursos do rastreador em todas as Regiões.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "WriteDevicePosition", "Effect": "Allow", "Action": "geo:BatchUpdateDevicePosition", "Resource": "arn:aws:geo:*:*:tracker/*" } ] }
  13. Escolha Revisar política.

  14. Insira um nome de política. Por exemplo, AmazonLocationTrackerWriteOnly.

  15. Escolha Criar política.

Você pode modificar esse código de função, conforme o necessário, para se adaptar ao esquema de mensagens do seu próprio dispositivo.

Criar uma regra de AWS IoT Core

Em seguida, crie uma regra AWS IoT Core para encaminhar a telemetria posicional de seus dispositivos para a função AWS Lambda para transformação e publicação no Amazon Location Service. O exemplo de regra fornecido pressupõe que qualquer transformação necessária das cargas úteis do dispositivo seja tratada pela sua função do Lambda. Você pode criar essa regra por meio do console AWS IoT Core, do AWS Command Line Interface (AWS CLI) ou das APIs AWS IoT Core.

nota

Embora o console AWS IoT gerencie a permissão necessária para permitir AWS IoT Core invocar a função do Lambda, se você estiver criando sua regra a partir da AWS CLI ou SDK, deverá configurar uma política para conceder permissão ao AWS IoT.

Para criar um AWS IoT Core usando o console

  1. Faça login no console do AWS IoT Core em https://console.aws.amazon.com/iot/.

  2. No painel de navegação à esquerda, expanda Agir e Regras.

  3. Escolha Criar uma regra para iniciar o novo assistente de regras.

  4. Insira um nome e uma descrição para a regra.

  5. Para a Declaração de regra de consulta, atualize o atributo FROM para se referir a um tópico em que pelo menos um dispositivo esteja publicando telemetria que inclua a localização. Se você estiver testando a solução, nenhuma modificação será necessária.

    SELECT * FROM 'iot/topic'
  6. Em Definir uma ou mais ações, selecione Adicionar ação.

  7. Selecione Enviar uma mensagem para uma função do Lambda.

  8. Escolha Configurar ação.

  9. Encontre e selecione sua função do Lambda na lista.

  10. Selecione Adicionar ação.

  11. Escolha Criar regra.

Teste sua regra de AWS IoT Core no console

Se nenhum dispositivo estiver publicando telemetria que inclua localização no momento, você poderá testar sua regra e essa solução usando o console AWS IoT Core. O console tem um cliente de teste no qual você pode publicar uma mensagem de amostra para verificar os resultados da solução.

  1. Faça login no console do AWS IoT Core em https://console.aws.amazon.com/iot/.

  2. No painel de navegação à esquerda, expanda Teste e escolha Cliente de teste MQTT.

  3. Em Publicar em um tópico, defina o Nome do tópico como iot/tópico (ou o nome do tópico que você configurou na sua regra AWS IoT Core, se for diferente) e forneça o seguinte para a Carga útil da mensagem. Substitua o carimbo de data/hora 1604940328 por um carimbo de data/hora válido nos últimos 30 dias (qualquer carimbo de data/hora anterior a 30 dias é ignorado).

    { "payload": { "deviceid": "thing123", "timestamp": 1604940328, "location": { "lat": 49.2819, "long": -123.1187 }, "accuracy": { "Horizontal": 20.5 }, "positionProperties": { "field1": "value1", "field2": "value2" } } }
  4. Escolha Publicar no tópico para enviar a mensagem de teste.

  5. Para validar se a mensagem foi recebida pelo Amazon Location Service, use o comando AWS CLI a seguir. Se você o modificou durante a configuração, substitua o nome do rastreador e o ID do dispositivo pelos que você usou.

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