この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
タイトルの通り、AWS IoT Core から Amazon Location Service へ位置情報をルーティングするルールが追加されました。
このルールを使うことで従来 Lambda を使っていたものを置き換えることができるようになりました。もちろんこのルールだけで要件が満たせない場合は、引き続き Lambda などを利用することになります。
それでは早速試してみたいと思います。
Amazon Location Serviceの設定
まず、最低限のリソースとして事前にトラッカーを作成しておきましょう。
「位置のフィルタリング」は今回は 「時間ベースのフィルタリング」 で作成しました。
Location 側の作業は以上です。
AWS IoT Rule の作成
次に AWS IoT Core 側でルールを作成していきます。詳細は下記のドキュメントを参考にして下さい。
ルール名は適当なものを付けます。
SQL ステートメントは、今回はトピック location/test
に来るメッセージ内容の全てを対象としました。
次の 「ルールアクション」 は実際に受信するメッセージに合わせて設定します。
今回利用するメッセージのサンプルは次のとおりです。
{
"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
最後に、このルールが Location Service を利用するための IAM Role を設定します。
今回は 「新しいロール」 から iot-location-rule-test
という名前の IAM Role を作成しています。
しかし、作成後に IAM のコンソールで IAM Role を確認すると、なぜかポリシーに何も設定されていないロールが作成されていました。
当然、この IAM Role では今回のルールアクションは権限不足でエラーになります。
そのため、後からポリシーを追加します。
(下記のポリシーは権限がゆるいので必要に応じて修正して下さい)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "geo:BatchUpdateDevicePosition",
"Resource": "*"
}
]
}
動作確認
これで設定作業が一通り終わったので、最後に動作確認を行います。
適当なMQTTクライアントから先程のフォーマットに基づいたメッセージを Publish してみます。(今回は MQTTX を利用)
メッセージの 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 で利用することが多いと思いますので、ぜひこのアップデートを活用していただければと思います。