チュートリアル: MQTT で AWS Lambda を使用する
デバイスの位置情報をトラッキングのために Amazon Location に送信する場合、AWS Lambda を使う必要はなくなったが、場合によってはまだ Lambda を使いたいかもしれない。例えば、デバイスの位置情報データを Amazon Location に送信する前に、ご自身で処理したい場合などです。以下のトピックでは、トラッカーに送信する前に、Lambda を使用してメッセージを処理する方法について説明します。このパターンの詳細については、リファレンスアーキテクチャ
前提条件
トラッキングを開始する前に、トラッカーリソースを作成する必要があります。トラッカーリソースを作成するには、Amazon Location コンソール、AWS CLI、または Amazon Location API を使用できます。
次の例では、Amazon Location Service コンソールを使用してトラッカーリソースを作成します。
-
Amazon Location Service コンソール (https://console.aws.amazon.com/location/
) を開きます。 -
左のナビゲーションペインから、[トラッカー] を選択します。
-
トラッカーを作成を選択します。
-
次のボックスに入力します。
-
名前 — 最大 100 文字のユニークな名前に入力します。英数字、ハイフン、ピリオド、アンダースコアを使用できます。例えば、
MyTracker
と入力します。 -
説明 – 任意の説明を入力します。例えば、
AWS IoT Core デバイスの位置を格納するためのトラッカー
などです。 -
位置フィルター — 位置の更新に使用するフィルターを選択します。例えば、精度ベースのフィルタリングなどです。
-
-
トラッカーを作成を選択します。
「Lambda 関数の作成」
AWS IoT Core と Amazon Location Service との接続を確立するには、AWS IoT Core から転送されたメッセージを処理する AWS Lambda 関数が必要です。この関数は、位置データを抽出し、Amazon Location Service 用にフォーマットし、Amazon Location Tracker API を通じて送信します。この関数は AWS Lambda コンソールから作成することも、AWS Command Line Interface (AWS CLI) や AWS Lambda API を使用することもできます。
コンソールを使用して Amazon Location に位置更新を公開する Lambda 関数を作成するには:
-
AWS Lambda コンソールを https://console.aws.amazon.com/lambda/
で開きます。 -
ナビゲーションペインで、[関数] を選択します。
-
関数を作成を選択し、最初から作成するが選択されていることを確認します。
-
次のボックスに入力します。
-
[関数の名前] - 関数の名前を入力します。有効なエントリには、英数字、ハイフン、およびスペースなしのアンダースコアが含まれます。例えば
MyLambda
などです。 -
ランタイム:
Python 3.8
を選択します。
-
-
機能の作成を選択します。
-
[コード] タブを選択してエディタを開きます。
-
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) }
-
[デプロイ] を選択して、関数を更新します。
-
設定タブを選択します。
-
権限セクションで、ハイパーリンク付きのロール名を選択し、Lambda 関数に Amazon Location Service アクセス権限を付与します。
-
ロールの概要ページからアクセス権限の追加を選択し、ドロップダウンリストからインラインポリシーの作成を選択します。
-
[JSON] タブを選択して、次の JSON ポリシードキュメントを入力します。これにより、Lambda 関数は、すべてのリージョンのすべてのトラッカーリソースによって管理されているデバイスの位置の更新ができます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "WriteDevicePosition", "Effect": "Allow", "Action": "geo:BatchUpdateDevicePosition", "Resource": "arn:aws:geo:*:*:tracker/*" } ] }
-
ポリシーの確認を選択します。
-
ポリシー名を入力します。例えば、
AmazonLocationTrackerWriteOnly
などです。 -
ポリシーを作成を選択します。
この関数コードは必要に応じて変更して、独自のデバイスメッセージスキーマに適合させることができます。
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 IoT Lambda 関数を呼び出すために AWS IoT Core に必要なパーミッションは AWS IoT コンソールで処理されますが、AWS CLI や SDK からルールを作成する場合は、パーミッションを付与するポリシーを設定する必要があります。
コンソールを使用して AWS IoT Core を作成するには
-
AWS IoT Core コンソール (https://console.aws.amazon.com/iot/
) にサインインします。 -
左のナビゲーションペインで、[ACT] を拡張し、[ルール] の順に選択します。
-
ルールを作成を選択して新しいルールウィザードを起動します。
-
ルールの名前と説明を入力します。
-
ルールクエリステートメントでは、
FROM
属性を更新して、少なくとも 1 つのデバイスが位置を含むテレメトリを公開しているトピックを参照する。ソリューションをテストする場合、変更は必要ありません。SELECT * FROM '
iot/topic
' -
1 つ以上のアクションを設定するで、アクションの追加を選択します。
-
[Lambda 関数にメッセージを送信する] を選択します。
-
アクションの設定を選択します。
-
リストから Lambda 関数を探して選択します。
-
Add actionを選択します。
-
ルールの作成を選択します。
コンソールで AWS IoT Core ルールをテストする
現在位置情報を含むテレメトリを公開しているデバイスがない場合は、AWS IoT Core コンソールを使用してルールとこのソリューションをテストすることができます。コンソールにはテストクライアントがあり、サンプルメッセージを公開してソリューションの結果を検証することができます。
-
AWS IoT Core コンソール (https://console.aws.amazon.com/iot/
) にサインインします。 -
左側のナビゲーションメニューの [テスト] で、[MQTT テストクライアント] を選択します。
-
トピックに公開で、トピック名を
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" } } } -
テストメッセージを送信するには、[発行] を選択します。
-
メッセージが Amazon Location Service によって受信されたことを確認するには、次の AWS CLI コマンドを使用します。セットアップ中に変更した場合は、トラッカー名とデバイス ID を使用していたものに置き換えてください。
aws location batch-get-device-position --tracker-name MyTracker --device-ids thing123