MQTT AWS Lambda との併用 - Amazon Location Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

MQTT AWS Lambda との併用

デバイスの位置情報をトラッキングのために Amazon Location に送信する場合、 AWS Lambda を使う必要はなくなったが、場合によってはまだLambdaを使いたいかもしれない。たとえば、デバイスの位置情報データを Amazon Location に送信する前に、ご自身で処理したい場合などです。以下のトピックでは、トラッカーに送信する前に、Lambda を使用してメッセージを処理する方法について説明します。このパターンの詳細については、リファレンスアーキテクチャをご覧ください。

前提条件

トラッキングを開始する前に、トラッカーリソースを作成する必要があります。トラッカーリソースを作成するには、Amazon Location コンソール、AWS CLI、または Amazon Location API を使用できます。

次の例では、Amazon Location Service コンソールを使用してトラッカーリソースを作成します。

  1. Amazon Location Service コンソール (https://console.aws.amazon.com/location/) を開きます。

  2. 左のナビゲーションペインから、[トラッカー] を選択します。

  3. トラッカーを作成を選択します。

  4. 次のボックスに入力します。

    • 名前 — 最大 100 文字のユニークな名前に入力します。有効な文字として英数字、ハイフン、ピリオド、アンダースコアを使用できます。例えば、 ですMyTracker

    • 説明 – 任意の説明を入力します。たとえば、AWS IoT Coreデバイスの位置を格納するためのトラッカーなどです

    • 位置フィルター — 位置の更新に使用するフィルターを選択します。たとえば、精度ベースのフィルタリングなどです

  5. トラッカーを作成を選択します。

Lambda 関数を作成する

AWS IoT Coreと Amazon Location Service との接続を確立するには、 AWS IoT Core から転送されたメッセージを処理する AWS Lambda 関数が必要です。この関数は、位置データを抽出し、Amazon Location Service 用にフォーマットし、Amazon Location トラッカー API を通じて送信します。この関数は AWS Lambda コンソールから作成することも、AWS Command Line Interface AWS CLI や AWS Lambda API を使用することもできます。

コンソールを使用して Amazon Location に位置更新を公開する Lambda 関数を作成するには:

  1. AWS Lambda コンソールを https://console.aws.amazon.com/lambda/ で開きます。

  2. ナビゲーションペインで、関数 を選択します。

  3. 関数を作成を選択し、最初から作成するが選択されていることを確認します。

  4. 次のボックスに入力します。

    • 関数の名前 に、 関数の名前を入力します。有効なエントリには、英数字、ハイフン、およびスペースなしのアンダースコアが含まれます。例えば、 ですMyLambda

    • ランタイム:Python 3.8を選択します。

  5. 機能の作成を選択します。

  6. JSON タブを選択して JSON エディタを開きます。

  7. lambda_function.py のプレースホルダーコードを以下のように書き換え、 TRACKER_NAME に割り当てられた値を前提条件として作成したトラッカーの名前に置き換える。

    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. デプロイ を選択して、関数を更新します。

  9. 設定タブを選択します。

  10. 権限セクションで、ハイパーリンク付きのロール名を選択し、Lambda 関数に Amazon Location Service アクセス権限を付与します。

  11. ロールの概要ページからアクセス権限の追加を選択し、ドロップダウンリストからインラインポリシーの作成を選択します。

  12. JSON タブを選択して、次の JSON ポリシードキュメントを入力します。これにより、Lambda 関数は、すべてのリージョンのすべてのトラッカーリソースによって管理されているデバイスの位置の更新ができます。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "WriteDevicePosition", "Effect": "Allow", "Action": "geo:BatchUpdateDevicePosition", "Resource": "arn:aws:geo:*:*:tracker/*" } ] }
  13. ポリシーの確認を選択します。

  14. ポリシー名を入力します。例えば、 ですAmazonLocationTrackerWriteOnly

  15. ポリシーを作成を選択します。

この関数コードは必要に応じて変更して、独自のデバイスメッセージスキーマに適合させることができます。

AWS IoT Core ルールを作成します

次に、デバイスの位置テレメトリを AWS Lambda ファンクションに転送し、変換して Amazon Location Service に公開する AWS IoT Core ルールを作成する。提供されているサンプルルールは、デバイスペイロードの必要な変換がすべて Lambda 関数によって処理されることを前提としています。このルールは、AWS IoT Coreコンソール、AWS Command Line Interface AWS CLI、または AWS IoT Core API を使用して作成できます。

注記

AWS IoTLambda関数を呼び出すために AWS IoT Core に必要なパーミッションは AWS IoT コンソールで処理されますが、 AWS CLI やSDKからルールを作成する場合は、 にパーミッションを付与するポリシーを設定する必要があります。

コンソールを使用して を作成するには

  1. https://console.aws.amazon.com/iot/ で AWS IoT Coreコンソールにサインインします。

  2. 左のナビゲーションペインで、ACTを拡張し、ルール の順に選択します。

  3. ルールを作成を選択して新しいルールウィザードを起動します。

  4. ルールの名前と説明を入力します。

  5. ルールクエリステートメントでは、 FROM 属性を更新して、少なくとも 1 つのデバイスが位置を含むテレメトリを公開しているトピックを参照する。ソリューションをテストする場合、変更は必要ありません。

    SELECT * FROM 'iot/topic'
  6. 1 つ以上のアクションを設定する で、アクションの追加 を選択します。

  7. Lambda 関数にメッセージを送信するを選択します。

  8. アクションの設定を選択します。

  9. リストから Lambda 関数を選択します。

  10. Add actionを選択します。

  11. ルールの作成を選択します。

コンソールで AWS IoT Core ルールをテストします。

現在位置情報を含むテレメトリを公開しているデバイスがない場合は、AWS IoT Coreコンソールを使用してルールとこのソリューションをテストすることができます。コンソールにはテストクライアントがあり、サンプルメッセージを公開してソリューションの結果を検証することができます。

  1. https://console.aws.amazon.com/iot/ で AWS IoT Coreコンソールにサインインします。

  2. 左側のナビゲーションメニューの テスト で、MQTT テストクライアント を選択します。

  3. トピックに公開で、トピック名iot/topic (異なる場合は AWS IoT Core ルールで設定したトピックの名前) に設定し、メッセージペイロードには次のように入力します。タイムスタンプ 1604940328 を過去 30 日間の有効なタイムスタンプに置き換えます (30 日を超えるタイムスタンプは無視されます)。

    { "payload": { "deviceid": "thing123", "timestamp": 1604940328, "location": { "lat": 49.2819, "long": -123.1187 }, "accuracy": { "Horizontal": 20.5 }, "positionProperties": { "field1": "value1", "field2": "value2" } } }
  4. MQTT メッセージを送信するには、トピックに発行 を選択します。

  5. メッセージが Amazon Location Service によって受信されたことを確認するには、次の AWS CLI コマンドを使用します。セットアップ中に変更した場合は、トラッカー名とデバイス ID を使用していたものに置き換えてください。

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