

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

# MQTT AWS Lambda で を使用する
<a name="tracking-using-mqtt-with-lambda"></a>

追跡のために Amazon Location にデバイスロケーションデータを送信するときに を使用する必要がなくなりました AWS Lambda が、場合によっては Lambda を使用することをお勧めします。例えば、デバイスの位置情報データを Amazon Location に送信する前に、ご自身で処理したい場合などです。以下のトピックでは、トラッカーに送信する前に、Lambda を使用してメッセージを処理する方法について説明します。このパターンの詳細については、[リファレンスアーキテクチャ](https://d1.awsstatic.com/architecture-diagrams/ArchitectureDiagrams/amazon-location-service-ra.pdf)をご覧ください。

**Topics**
+ [前提条件](#mqtt-prerequisite-with-lambda)
+ [Lambda 関数を作成する](#mqtt-with-lambda-create-lambda)
+ [AWS IoT Core ルールを作成する](#mqtt-create-iot-rule-with-lambda)
+ [コンソールで AWS IoT Core ルールをテストする](#mqtt-test-iot-rule-with-lambda)

## 前提条件
<a name="mqtt-prerequisite-with-lambda"></a>

トラッキングを開始する前に、[トラッカーリソースを作成する](start-tracking.md)必要があります。トラッカーリソースを作成するには、Amazon Location コンソール、、 AWS CLIまたは Amazon Location APIsを使用できます。

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

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

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

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

1. 次のボックスに入力します。
   + **名前** — 最大 100 文字のユニークな名前に入力します。英数字、ハイフン、ピリオド、アンダースコアを使用できます。例えば、*MyTracker* と入力します。
   + **説明** – 任意の説明を入力します。例えば、* AWS IoT Core デバイスの位置を保存するためのトラッカー*などです。
   + **位置フィルター** — 位置の更新に使用するフィルターを選択します。例えば、**精度ベースのフィルタリング**などです。

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

## Lambda 関数を作成する
<a name="mqtt-with-lambda-create-lambda"></a>

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

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

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

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

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

1. 次のボックスに入力します。
   + **[関数の名前]** - 関数の名前を入力します。有効なエントリには、英数字、ハイフン、およびスペースなしのアンダースコアが含まれます。例えば *MyLambda* などです。
   + **ランタイム**: *Python 3.8* を選択します。

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

1. **[コード]** タブを選択してエディタを開きます。

1. `lambda_function.py` のプレースホルダーコードを以下のように書き換え、`TRACKER_NAME` に割り当てられた値を[前提条件](#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. **[デプロイ]** を選択して、関数を更新します。

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

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

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

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

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

1. **ポリシーの確認**を選択します。

1. ポリシー名を入力します。例えば、*AmazonLocationTrackerWriteOnly* などです。

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

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

## AWS IoT Core ルールを作成する
<a name="mqtt-create-iot-rule-with-lambda"></a>

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

**注記**  
 AWS IoT コンソールは が Lambda 関数 AWS IoT Core を呼び出すために必要なアクセス許可を処理しますが、 AWS CLI または SDK からルールを作成する場合は、アクセス[許可を付与するポリシーを設定 AWS IoT](https://docs.aws.amazon.com/iot/latest/developerguide/lambda-rule-action.html#lambda-rule-action-requirements)する必要があります。

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

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

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

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

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

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

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

1. **1 つ以上のアクションを設定する**で、**アクションの追加**を選択します。

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

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

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

1. **Add action**を選択します。

1. **[‬ルールを作成]‭** を選択します。

## コンソールで AWS IoT Core ルールをテストする
<a name="mqtt-test-iot-rule-with-lambda"></a>

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

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

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

1. **トピックに発行** で、**トピック名**を *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" }
     }
   }
   ```

1. テストメッセージを送信するには、**[発行]** を選択します。

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

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