皆様、こんにちは。ソリューションアーキテクトの松永(ニックネーム:taketo)です。
今回は先日AWS Signature V4へ対応したデータ転送サービス「SORACOM Beam」(以下、Beam)を使ったAmazon Location Serviceへの連携についてご紹介致します。
これにより、デバイスに認証情報と SigV4 生成ロジックを持たずともAmazon Location ServiceのAPIを呼び出すことが可能になります。例えば、デバイスの位置情報を送信しAmazon Location Serviceに保管したり、Amazon Location ServiceのGeofence機能で送信された位置情報を元に特定のエリアに入ったことを検知し通知などのアクションを実行するといったことが可能になります。AWS Location Serviceの位置情報を保管するサービスTrackingへの連携方法は「SORACOMユーザードキュメント:IAM 認証を利用して Amazon Location Service の Tracking にリクエストを送信する」を参照ください。本ブログでは、そもそもAmazon Location Serviceとはなにか?ジオフェンスを利用するにはどうするのかなど説明をさせて頂きます。
Amazon Location Serviceとは?
公式サイトには下記のように記載されていますね。Amazon Location Serviceを利用することにより、位置情報を利用したアプリケーションを容易に開発することができます。
Amazon Location Service は、デベロッパーが地理空間データと位置情報機能をアプリケーションに追加するために使用できる位置情報ベースのサービスです。お客様は、マップ上でデータを視覚化し、ルートを推奨できるほか、ジオコーディングを使用してプレーンテキストの住所を地理座標に変換したり、リバースジオコーディングを使用して緯度と経度の座標を住所に変換したりすることもでき、さらに車両フリートなどのアセットをモニタリングおよび追跡できます。
Amazon Location Serviceには「AWS公式サイト:Amazon Location overview」に記載されている通り、5つ機能が存在します。それぞれどのような機能か簡単に解説します。
- Maps:お客様のカスタムアプリケーションに地図を表示する機能を追加することができます。
- Place indexes:施設の位置情報などを検索することができ、例えば「東京スカイツリー」というテキストから実際の東京スカイツリーの緯度経度や住所を取得することができます。
- Route:2つの緯度経度情報から経路を割り出すAPIで、リアルタイムの混雑状況を考慮した上で移動における経路情報や所要時間を計算します。車での移動経路やその所要時間を表示することができるようになります。
- Trackers:デバイスの位置情報を保管することができMapsと合わせてデバイスの所在を表示するなどが可能になります。
- Geofence:Trackersの移動において事前に指定したエリアへ入る・出る挙動をした際にイベントを発行しAmazon EventBridgeに連携することができます。Amazon EventBridgeを返して通知など処理が可能になります。
Amazon Location Service機能(出典:AWS公式サイト:Amazon Location overview)
ジオフェンスをやってみる
デバイスが特定のエリアに出入りしたことを検知するジオフェンスをやってみましょう。実装に関しては、Amazon Location Serviceの「AWS公式ドキュメント:Geofencing an area of interest using Amazon Location」も参考にしてみてください。
本ブログの例では、ジオフェンスへのデバイスが出入りしたタイミングでメールを送信する例をご紹介します。
1.Amazon Location Service Trackingへ位置情報の送信
まずは、「SORACOMユーザードキュメント:IAM 認証を利用して Amazon Location Service の Tracking にリクエストを送信する」の通り設定し、デバイスからAmazon Location Serviceへ位置情報を送信する仕組みを構築してください。
2.Geofence Collection作成
Amazon Location ServiceからGeofence Collectionを作成します。この時、EventBridgeのルールを有効にしておくと、通知サービスへの連携が簡単にできます。作成したGeofence Collectionに検知対象のエリアの緯度経度情報を登録します。エリア情報はgeojson.ioを利用すると、様々な形のジオフェンスを定義できJsonのファイルをダウンロードできます。「AWS公式ガイド:add geofence」を参考に、ダウンロードしたGeofence Collectionへ登録してください。
本ガイドの例では、SORACOMの赤坂オフィス周辺にジオフェンスを登録し、このエリアに出入りするデバイスを検知します。
3.Amazon Simple Notification Serviceの作成
Amazon Simple Notification Service(以降、Amazon SNS)を利用して、Emailを送信する仕組みを構築します。Amazon SNSのトピックにイベントが入ったら、SubscriptionがEmailを送信する仕組みを例としております。
4.Amazon EventBridgeとAmazon SNSの連携
Amazon Location ServiceのGeofence CollectionのEventBridgeのルールを編集し、前ステップで作成したAmazon SNSのTopicを連携先として指定します。この作業によりAmazon Location Serviceがジオフェンスのイベントを検知した際に、Amazon SNSを通じてEmailが送信される仕組みができます。
5.IAMロール権限の編集
ステップ1で参照した「ガイド:ステップ 1: IAM ロールを作成して SORACOM の AWS アカウントに割り当てる」で作成したIAMロールを編集して、「geo:AssociateTrackerConsumer」権限を付与してください。デバイスの位置情報をジオフェンスと関連付けするAPIを実行するのに必要となります。
*編集後のIAMロール権限の例
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"geo:GetDevicePositionHistory",
"geo:AssociateTrackerConsumer",
"geo:TagResource",
"geo:UpdateTracker",
"geo:BatchUpdateDevicePosition"
],
"Resource": "arn:aws:geo:ap-northeast-1:***:tracker/*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "geo:CreateTracker",
"Resource": "*"
}
]
}
6.TrackersとGeofenceの関連付け
デバイスから、下記のようにリクエストを送信して、デバイスの位置情報をGeofence Collectionに登録したジオフェンスの監視対象として登録します。
#Link tracker with geo fence
import requests
import json
geofence_arn_akasakaoffice = "{ステップ2で作成したGeofence CollectionのARN}"
ls_trackers_consumer_url = "http://beam.soracom.io:18080/tracking/v0/trackers/" + tracker_id + "/consumers"
consumer_request = {
"ConsumerArn": geofence_arn_akasakaoffice
}
linked_tracker = requests.post(ls_trackers_consumer_url, data=json.dumps(consumer_request)).json()
print(linked_tracker)
7.デバイスから位置情報の送信と通知
それでは、早速デバイスから位置情報を送信し、Emailが来ることを確認します。
「ガイド:データを送信する」を参考に、ジオフェンスの外から中、もしくは中から外へ移動するように位置情報を送信してみましょう。
例として、新橋駅から虎ノ門、SORACOMの赤坂オフィスと移動する緯度経度をサンプルとして2秒間隔で送信しています。
すると、ほぼ遅延なくEmailが受信できました。良くみるとEventTypeに「Enter」とあることからジオフェンスに入ったことが検知できたことがわかります。
#Update device positions
import requests
import json
import datetime
import time
ls_trackers_positions_url = "http://beam.soracom.io:18080/tracking/v0/trackers/" + tracker_id + "/positions"
locations = [[139.7583, 35.6664], [139.7501, 35.6701], [139.744207, 35.669823]]
for location in locations:
update_location = {
"Updates": [
{
"Accuracy": {
"Horizontal": 1
},
"DeviceId": device_id,
"Position": location,
"SampleTime": datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%dT%H:%M:%S.%fZ')
}
]
}
updated_tracker = requests.post(ls_trackers_positions_url, data=json.dumps(update_location))#.json()
print(updated_tracker)
time.sleep(2)
さいごに
いかがだったでしょうか?IoTプロジェクトの中でデバイスのトラッキングは非常に多くの事例があります。Amazon Location Serviceを利用することで、位置情報を扱うカスタムアプリケーションが構築できますが、SORACOM Beamを経由することでよりセキュアで簡単にデータ連携ができることがわかりますね。
是非、お客様のプロジェクトでご活用ください!
― ソラコム松永 (taketo)