【アップデート】AWS IoT Core から位置データをルーティングする Location Action のルールが追加されました

2022.11.02

タイトルの通り、AWS IoT Core から Amazon Location Service へ位置情報をルーティングするルールが追加されました。

このルールを使うことで従来 Lambda を使っていたものを置き換えることができるようになりました。もちろんこのルールだけで要件が満たせない場合は、引き続き Lambda などを利用することになります。

それでは早速試してみたいと思います。

Amazon Location Serviceの設定

まず、最低限のリソースとして事前にトラッカーを作成しておきましょう。

01-make-tracker.png

「位置のフィルタリング」は今回は 「時間ベースのフィルタリング」 で作成しました。

02-detail-tracker.png

Location 側の作業は以上です。

AWS IoT Rule の作成

次に AWS IoT Core 側でルールを作成していきます。詳細は下記のドキュメントを参考にして下さい。

ルール名は適当なものを付けます。

03-named-rule-option.png

SQL ステートメントは、今回はトピック location/test に来るメッセージ内容の全てを対象としました。

04-rule-sql.png

次の 「ルールアクション」 は実際に受信するメッセージに合わせて設定します。
今回利用するメッセージのサンプルは次のとおりです。

{
  "payload": {
    "deviceid": "thing123",
    "timestamp": 1604940328,
    "location": { "lat": 49.2819, "long": -123.1187 },
    "accuracy": { "Horizontal": 20.5 },
    "positionProperties": { "field1": "value1", "field2": "value2" }
  }
}

このサンプルは下記ドキュメントにあるフォーマットのものをそのまま利用しました。

このフォーマットを踏まえてそれぞれ次の通りに設定します。

  • アクション:Amazon Location Service を選択
  • トラッカー名:先ほど作成したものを指定
  • デバイスID:置換テンプレートで ${payload.deviceid} を指定
  • 経度:${payload.location.long}
  • 緯度:${payload.location.lat}
  • タイムスタンプ:${payload.timestamp}
  • タイムスタンプの単位:SECONDS

05-rule-action-settings.png

最後に、このルールが Location Service を利用するための IAM Role を設定します。

06-iam-role.png

今回は 「新しいロール」 から iot-location-rule-test という名前の IAM Role を作成しています。

07-created-iam-role.png

しかし、作成後に IAM のコンソールで IAM Role を確認すると、なぜかポリシーに何も設定されていないロールが作成されていました。
当然、この IAM Role では今回のルールアクションは権限不足でエラーになります。

08-no-policy.png

そのため、後からポリシーを追加します。
(下記のポリシーは権限がゆるいので必要に応じて修正して下さい)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "geo:BatchUpdateDevicePosition",
            "Resource": "*"
        }
    ]
}

09-iot-location-rule-role.png

動作確認

これで設定作業が一通り終わったので、最後に動作確認を行います。
適当なMQTTクライアントから先程のフォーマットに基づいたメッセージを Publish してみます。(今回は MQTTX を利用)

10-mqttx.jpg

メッセージの Publish ができたら下記のコマンドで位置情報が取得できることを確認します。

$ aws location batch-get-device-position \
    --tracker-name TestTracker \
    --device-ids thing123
{
    "ResponseMetadata": {
        "RequestId": "xxxxxxxx-cb13-46bc-b77b-46e9xxxxxxxx",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "date": "Tue, 01 Nov 2022 14:36:58 GMT",
            "content-type": "application/json",
            "content-length": "166",
            "connection": "keep-alive",
            "x-amzn-requestid": "xxxxxxxx-cb13-46bc-b77b-46e9xxxxxxxx",
            "access-control-allow-origin": "*",
            "x-amz-apigw-id": "a7RJsFBxxxxxxxx=",
            "access-control-expose-headers": "x-amzn-errortype,x-amzn-requestid,x-amzn-errormessage,x-amzn-trace-id,x-amz-apigw-id,date",
            "x-amzn-trace-id": "Root=1-xxxxxxxx-4bd9c85c0c1402acxxxxxxxx"
        },
        "RetryAttempts": 0
    },
    "DevicePositions": [
        {
            "DeviceId": "thing123",
            "Position": [
                -127.1288,
                49.2823
            ],
            "ReceivedTime": "2022-11-01T14:36:23.145000+00:00",
            "SampleTime": "2022-11-01T14:36:09+00:00"
        }
    ],
    "Errors": []
}

位置情報を変えて何度か送ってみた後、位置の履歴も確認できました。

$ aws location get-device-position-history \
    --device-id thing123 \
    --start-time-inclusive "2022-11-01T14:30:00.000Z" \
    --end-time-exclusive "2022-11-01T14:50:00.000Z" \
    --tracker-name TestTracker
{
    "DevicePositions": [
        {
            "DeviceId": "thing123",
            "Position": [
                -127.1288,
                49.2823
            ],
            "ReceivedTime": "2022-11-01T14:36:23.145000+00:00",
            "SampleTime": "2022-11-01T14:36:09+00:00"
        },
        {
            "DeviceId": "thing123",
            "Position": [
                -127.1359,
                52.2823
            ],
            "ReceivedTime": "2022-11-01T14:37:45.330000+00:00",
            "SampleTime": "2022-11-01T14:37:15+00:00"
        },
        {
            "DeviceId": "thing123",
            "Position": [
                -126.1355,
                49.2789
            ],
            "ReceivedTime": "2022-11-01T14:41:04.705000+00:00",
            "SampleTime": "2022-11-01T14:40:40+00:00"
        }
    ]
}

最後に

これまでは、IoT Core経由で位置情報を Amazon Location Service に送るには Lambda アクションを使う必要がありましたが、これからはルールアクションの設定だけで簡単に送ることができるようになりました。

位置情報は IoT で利用することが多いと思いますので、ぜひこのアップデートを活用していただければと思います。