

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

# Amazon Location Service により AWS IoT と MQTT を使ってトラッキングする
<a name="tracking-using-mqtt"></a>

[MQTT](http://mqtt.org/) は、制約のあるデバイス用に設計され、軽量で広く採用されているメッセージングプロトコルです。AWS IoT Core は、MQTT プロトコルと MQTT over WebSocket Secure (WSS) プロトコルを使用するデバイス接続をサポートしています。

[AWS IoT Core](https://aws.amazon.com/iot-core/) はデバイスをAWSに接続し、デバイス間でメッセージの送受信を可能にする。AWS IoT Core ルールエンジンは、デバイスのメッセージトピックに関するクエリを保存し、Amazon Location Service などの他の AWS サービスにメッセージを送信するためのアクションを定義できるようにします。位置を座標として認識するデバイスは、ルールエンジンを通じて Amazon Location に位置情報を転送できます。

**注記**  
デバイスは内蔵の GPS などを通じて自分の位置を知ることができます。AWS IoT はサードパーティのデバイスの位置追跡もサポートしています。詳細については、AWS IoT 開発者ガイド (デベロッパーガイド) の「[AWS IoT コアデバイスのデータ](https://docs.aws.amazon.com/iot/latest/developerguide/device-location.html)」を参照してください。

以下のウォークスルーでは、AWS IoT Core ルールを使ったトラッキングについて説明します。Amazon Location に送信する前に処理する必要がある場合は、デバイス情報を独自の AWS Lambda 機能に送信することもできます。Lambda を使用してデバイスの位置を処理する方法の詳細については、「[MQTT AWS Lambda で を使用する](tracking-using-mqtt-with-lambda.md)」を参照してください。

**Topics**
+ [前提条件](#mqtt-prerequisite)
+ [AWS IoT Core ルールを作成します](#mqtt-create-iot-rule)
+ [コンソールで AWS IoT Core ルールをテストする](#mqtt-test-iot-rule)
+ [MQTT AWS Lambda で を使用する](tracking-using-mqtt-with-lambda.md)

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

追跡を開始する前に、以下の前提条件を完了する必要があります。
+ デバイスの位置データを送信する[トラッカーリソースを作成します](start-create-tracker.md)。
+ トラッカーへの AWS IoT Core アクセスを許可する [IAM ロールを作成します](https://docs.aws.amazon.com/iot/latest/developerguide/iot-create-role.html)。

  これらの手順を実行するときは、以下のポリシーを使用してトラッカーへのアクセスを許可してください。

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

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

次に、デバイスの位置テレメトリを Amazon Location Service に転送する AWS IoT Core ルールを作成します。Lambda 関数 URL の詳細については、AWS IoT Core デベロッパーガイドの以下のトピックを参照してください。
+ 「[AWS IoT ルールの作成](https://docs.aws.amazon.com/iot/latest/developerguide/iot-create-rule.html)」には、新しいルールの作成に関する情報が記載されています。
+ Amazon Location に公開するためのルール作成に固有の[ロケーションアクション](https://docs.aws.amazon.com/iot/latest/developerguide/location-rule-action.html) 

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

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

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

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

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

   ```
   {
     "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 コマンドを使用します。セットアップ中に変更した場合は、トラッカー名を使用していたものに置き換えてください。

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

# 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
   ```