いわさです。
Amazon Location Service の先日のアップデートでトラッカーの位置情報更新イベントがサポートされました。
最初、あれ?トラッカー前まで使えてなかったか?と思いました。
過去に次の記事でジオフェンスとトラッカーを組み合わせイベントを EventBridge で受信したことがありました。
今回のアップデート情報や公式ドキュメントの変更点を比較してみたところ違いがわかりました。
まず、以前まではジオフェンスに対するトラッキングデバイスの ENTER と EXIT イベントの検出がサポートされていました。
そして今回のアップデートでは、ジオフェンス関係なくトラッカーにデバイスの位置情報が送信された時に EventBridge へイベントを発行することが出来るようになりました。
これによって、以前まではデバイスの位置情報更新データを確認するためにトラッカーに対して位置情報の読み取りを行う必要があったのですが、ジオフェンス関係なく EventBridge を使ってデバイス位置情報の更新を検知出来るようなりました。
トラッカーの EventBridge 構成を有効化する必要がある
本機能はデフォルトではオフになっていて、これまでと同様にジオフェンスの ENTER と EXIT のみが検出出来る状態となっています。
新規トラッカーの作成時、あるいは既存トラッカーを更新して EventBridge へのイベントを送信機能を有効化します。
Location Device Position Event が検出出来る
あとはデバイスの位置情報を更新して、EventBridge 経由で受信するだけです。
batch-update-device-position
でデバイスの位置情報更新データをバッチ送信出来るようなので、こちらを使ってみます。
% cat position.json
{
"TrackerName": "explore.tracker",
"Updates": [
{
"Accuracy": {
"Horizontal": 10.30
},
"DeviceId": "hoge0713device0",
"Position": [
141.35455553388053,
43.06588598345024
],
"SampleTime": "2023-07-12T00:00:00"
}
]
}
% aws location batch-update-device-position --cli-input-json file://position.json
{
"Errors": []
}
EventBridge で次のイベントデータを受信することが出来ました。
{
"version": "0",
"id": "03a5a084-9a8e-1fed-9ae4-c7c97f8ee4e5",
"detail-type": "Location Device Position Event",
"source": "aws.geo",
"account": "123456789012",
"time": "2023-07-12T20:59:39Z",
"region": "ap-northeast-1",
"resources": [
"arn:aws:geo:ap-northeast-1:123456789012:tracker/explore.tracker"
],
"detail": {
"EventType": "UPDATE",
"TrackerName": "explore.tracker",
"DeviceId": "hoge0713device0",
"SampleTime": "2023-07-12T00:00:00Z",
"ReceivedTime": "2023-07-12T20:59:39.163Z",
"Position": [
141.35455553388053,
43.06588598345024
],
"Accuracy": {
"Horizontal": 10.3
}
}
}
トラッカーの EventBridge 構成を無効化してみた
次のようにデフォルトの無効化状態でも動作確認してみました。
先程と同じ方法で位置情報更新イベントを送信してみましたがイベントが発生しませんでした。
ちなみに、BatchUpdateDevicePosition
API を実行しているので、本機能の有効化状態に関わらずAWS API Call via CloudTrail
イベントは発生してます。
そこからも情報は一部取得出来るのですが、Position についてはマスクされていました。
{
"version": "0",
"id": "b2810708-1886-b31c-98cf-b0f968a57c32",
"detail-type": "AWS API Call via CloudTrail",
"source": "aws.geo",
"account": "123456789012",
"time": "2023-07-12T21:03:42Z",
"region": "ap-northeast-1",
"resources": [],
"detail": {
"eventVersion": "1.08",
"userIdentity": {
"type": "IAMUser",
"principalId": "*****",
"arn": "arn:aws:iam::123456789012:user/hoge",
"accountId": "123456789012",
"accessKeyId": "*****",
"userName": "hoge"
},
"eventTime": "2023-07-12T21:03:42Z",
"eventSource": "geo.amazonaws.com",
"eventName": "BatchUpdateDevicePosition",
"awsRegion": "ap-northeast-1",
"sourceIPAddress": "203.0.113.1",
"userAgent": "aws-cli/2.13.0 Python/3.11.4 Darwin/22.5.0 exe/x86_64 prompt/off command/location.batch-update-device-position",
"requestParameters": {
"TrackerName": "explore.tracker",
"Updates": [
{
"Accuracy": {
"Horizontal": 10.3
},
"DeviceId": "hoge0713device0",
"Position": "***",
"SampleTime": "2023-07-12T01:00:00Z"
}
]
},
"responseElements": {
"Errors": [],
"Access-Control-Expose-Headers": "x-amzn-errortype,x-amzn-requestid,x-amzn-errormessage,x-amzn-trace-id,x-amz-apigw-id,date"
},
"requestID": "ffd3aec1-cac3-4037-aea3-900a812317ba",
"eventID": "fdfcfde8-9324-4549-90d0-d3e8286db5d4",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "123456789012",
"eventCategory": "Management"
}
}
連続したデータを送ってみる
BatchUpdateDevicePosition
は複数位置情報をバッチ送信するものです。
まとめて送ったときにイベントデータがどのように発生しているのかを確認してみました。
なお CloudTrail や他のルールを除外するために、ルールを次のように設定しています。
{
"source": ["aws.geo"],
"detail-type": ["Location Device Position Event"]
}
札幌〜江別間のいくつかの駅の位置情報を一括で送信してみました。
% cat position1.json
{
"TrackerName": "explore.tracker",
"Updates": [
{
"Accuracy": {
"Horizontal": 10.30
},
"DeviceId": "hoge0713ebetsu",
"Position": [
141.55723,
43.11111
],
"SampleTime": "2023-07-12T02:00:00"
},
{
"Accuracy": {
"Horizontal": 10.30
},
"DeviceId": "hoge0713ebetsu",
"Position": [
141.52936,
43.09246
],
"SampleTime": "2023-07-12T02:10:00"
},
{
"Accuracy": {
"Horizontal": 10.30
},
"DeviceId": "hoge0713ebetsu",
"Position": [
141.49712,
43.07285
],
"SampleTime": "2023-07-12T02:20:00"
},
{
"Accuracy": {
"Horizontal": 10.30
},
"DeviceId": "hoge0713sapporo",
"Position": [
141.35079,
43.06892
],
"SampleTime": "2023-07-12T02:00:00"
},
{
"Accuracy": {
"Horizontal": 10.30
},
"DeviceId": "hoge0713sapporo",
"Position": [
141.37363,
43.06966
],
"SampleTime": "2023-07-12T02:10:00"
},
{
"Accuracy": {
"Horizontal": 10.30
},
"DeviceId": "hoge0713sapporo",
"Position": [
141.41390,
43.05528
],
"SampleTime": "2023-07-12T02:20:00"
}
]
}
% aws location batch-update-device-position --cli-input-json file://position1.json
{
"Errors": []
}
EventBridge のターゲットに CloudWatch Logs を指定しました。
ロググループに送信されたイベントデータは次のように、位置情報ごとに 1 イベントデータが発生していることが確認出来ました。これは良いですね。
CloudWatch Logs Insights から CSV 形式でエクスポートして QuickSight かなにかで見てみます。
CSV ファイルをデータセットとしてアップロードし、座標の定義を設定します。
マップビューでポイント描画してみました。
この使い方は、時系列の表現が出来ないのでイマイチだった気がします。
デバイスの最新位置情報を保持しておき、EventBridge から位置情報更新イベントを受信したタイミングで位置情報を更新するなどをすると、ニアリアルタイムでデバイス位置情報を可視化出来る地図アプリケーションとか作成出来そうですね。
さいごに
本日は Amazon Location Service のトラッカーから EventBridge へ位置情報更新イベントが送信出来るようになったので使ってみました。
これまではトラッカーを使ったデバイスをイベント駆動させるためには、ジオフェンスと組み合わせる、あるいは CloudTrail イベントから API イベントを拾ったあとにトラッカーに対して位置情報を問い合わせるなど、工夫が必要だったと思います。
今回のアップデートで、とてもシンプルにイベント駆動アプリケーションを作成することが出来るようになったのではないでしょうか。