[アップデート] Amazon Location Service でジオフェンスデータにカスタムメタデータを設定出来るようになりました

2023.06.18

いわさです。

Amazon Location Service ではジオフェンスの機能があり、ディベロッパーが特定のエリアを座標で指定し、デバイスやユーザーなどの位置情報を送信出来るオブジェクトがそのエリア内に入ったタイミングでイベントを発生させることが出来ます。

これまでは純粋なエリアの位置や大きさを指定出来るくらいだったのですが、先日のアップデートで独自のメタデータを付与出来るようになりました。

これによって、ジオフェンスのタイプやアプリケーション独自の情報を付与して、アプリケーションを拡張することが出来るようになります。

今回カスタムメタデータを設定したジオフェンスが存在する状態で、位置情報を送信して検知ログの確認まで行ってみましたので紹介します。

ジオフェンスデータを作成

カスタムメタデータは API でput-geofenceを実行する際に設定することが出来ます。

今回、新規作成したジオフェンスコレクションに、クラスメソッド札幌オフィスとクラスメソッド日比谷オフィスの 2 つのジオフェンスデータを作成してみました。

クラスメソッド札幌オフィス(メタデータなし)

こちらはカスタムメタデータなしのジオフェンスデータです。

% cat put-geofence.json
{
    "CollectionName": "hoge0618collection1",
    "GeofenceId": "hoge-geo-1",
    "Geometry": {
        "Circle": {
            "Center": [
                141.35455553388053,
                43.06588598345024
            ],
            "Radius": 100000
        }
    }
}
% aws location put-geofence --cli-input-json file://put-geofence.json
{
    "CreateTime": "2023-06-18T10:54:05.880000+00:00",
    "GeofenceId": "hoge-geo-1",
    "UpdateTime": "2023-06-18T10:54:05.880000+00:00"
}

クラスメソッド日比谷オフィス(メタデータあり)

こちらはカスタムメタデータが付与されています。
先程と異なりオプションのGeofencePropertiesが設定されています。

% cat put-geofence2.json                                             
{
    "CollectionName": "hoge0618collection1",
    "GeofenceId": "hoge-geo-2",
    "GeofenceProperties": {
        "hoge-office": "hibiya"
    },
    "Geometry": {
        "Circle": {
            "Center": [
                139.75297,
                35.67097
            ],
            "Radius": 100000
        }
    }
}
% aws location put-geofence --cli-input-json file://put-geofence2.json
{
    "CreateTime": "2023-06-18T10:56:16.356000+00:00",
    "GeofenceId": "hoge-geo-2",
    "UpdateTime": "2023-06-18T10:56:16.356000+00:00"
}

カスタムメタデータの有無を確認する

ジオフェンスコレクションに登録されているジオフェンス ID についてはマネジメントコンソールから確認することが出来るのですが、本日時点ではカスタムメタデータを確認することは出来ません。
まぁエリア情報についても元々確認は出来ないのですが、メタデータについても同様にマネジメントコンソール上からは確認が出来ません。

list-geofencesAPI を使うことでメタデータを確認することが出来ます。

% aws location list-geofences --collection-name hoge0618collection1
{
    "Entries": [
        {
            "CreateTime": "2023-06-18T10:54:05.880000+00:00",
            "GeofenceId": "hoge-geo-1",
            "Geometry": {
                "Circle": {
                    "Center": [
                        141.35455553388053,
                        43.06588598345024
                    ],
                    "Radius": 100000
                }
            },
            "Status": "ACTIVE",
            "UpdateTime": "2023-06-18T10:54:05.983000+00:00"
        },
        {
            "CreateTime": "2023-06-18T10:56:16.356000+00:00",
            "GeofenceId": "hoge-geo-2",
            "GeofenceProperties": {
                "hoge-office": "hibiya"
            },
            "Geometry": {
                "Circle": {
                    "Center": [
                        139.75297,
                        35.67097
                    ],
                    "Radius": 100000
                }
            },
            "Status": "ACTIVE",
            "UpdateTime": "2023-06-18T10:56:16.408000+00:00"
        }
    ]
}

メタデータの有無や内容を確認する際にも API が必要という点を覚えておきましょう。

検知した時のイベント

ジオフェンスコレクションの検知動作は以前も確認したことがあります。

今回も同じ方法で、batch-evaluate-geofences API で位置情報を送信してイベントデータを確認してみます。
なお、今回は新規でジオフェンスコレクションをマネジメントコンソールから作成した際に、イベントルールやターゲットの CloudWatch ロググループまで自動作成してくれるオプションを選択したので、次のように検出されるとすぐにイベントデータが確認できる状態になっていました。こいつは便利だ。

札幌オフィスへ移動してみる(メタデータなし)

まずはメタデータなしの札幌オフィスへ移動してみましょう。

% cat batch-evaluate-geofences-sapporo.json
{
    "CollectionName": "hoge0618collection1",
    "DevicePositionUpdates": [
        {
            "Accuracy": {
                "Horizontal": 10.30
            },
            "PositionProperties": {
                "field1": "value1",
                "field2": "value2"
            },
            "DeviceId": "hogeiwasa",
            "Position": [
                141.35455553388053,
                43.06588598345024
            ],
            "SampleTime": "2023-06-18T11:20:00.000Z"
        }
    ]
}
% aws location batch-evaluate-geofences --cli-input-json file://batch-evaluate-geofences-sapporo.json

CloudWatch ロググループへすぐに次の内容のイベントログが出力されていました。

{
    "version": "0",
    "id": "e2db196c-9376-3fb1-05f2-28ca5e075c08",
    "detail-type": "Location Geofence Event",
    "source": "aws.geo",
    "account": "123456789012",
    "time": "2023-06-18T11:25:17Z",
    "region": "ap-northeast-1",
    "resources": [
        "arn:aws:geo:ap-northeast-1:123456789012:geofence-collection/hoge0618collection1"
    ],
    "detail": {
        "EventType": "ENTER",
        "GeofenceId": "hoge-geo-1",
        "DeviceId": "hogeiwasa",
        "SampleTime": "2023-06-18T11:20:00Z",
        "Position": [
            141.35455553388053,
            43.06588598345024
        ],
        "Accuracy": {
            "Horizontal": 10.3
        },
        "PositionProperties": {
            "field1": "value1",
            "field2": "value2"
        }
    }
}

ここではやはりカスタムメタデータについては確認が出来ないですね。

日比谷オフィスへ移動してみる(メタデータあり)

同じ方法で座標を変更して、今度は日比谷オフィス近辺に移動してみました。
次のようにログにカスタムメタデータが出力されていることが確認出来ました。

{
    "version": "0",
    "id": "a852111a-4017-f128-ca83-43f210122b60",
    "detail-type": "Location Geofence Event",
    "source": "aws.geo",
    "account": "123456789012",
    "time": "2023-06-18T11:27:21Z",
    "region": "ap-northeast-1",
    "resources": [
        "arn:aws:geo:ap-northeast-1:123456789012:geofence-collection/hoge0618collection1"
    ],
    "detail": {
        "EventType": "ENTER",
        "GeofenceId": "hoge-geo-2",
        "DeviceId": "hogeiwasa2",
        "SampleTime": "2023-06-18T11:20:00Z",
        "Position": [
            139.75297,
            35.67097
        ],
        "Accuracy": {
            "Horizontal": 10.3
        },
        "PositionProperties": {
            "field1": "value1",
            "field2": "value2"
        },
        "GeofenceProperties": {
            "hoge-office": "hibiya"
        }
    }
}

良いですね。
アプリ側でこのままジオフェンスに含まれるカスタムデータとして使っても良いですし、あるいは EventBridge のルールに含めることも出来るので、様々な応用が考えられそうですね。

設定出来るメタデータは 3 つまで

GeofencePropertiesは Key-Value 型のリスト形式で設定が出来るのですが、本日時点では最大 3 つまでという制限があります。
4 つ設定しようとした場合は次のようにput-geofence時にエラーが発生しました。

% cat put-geofence3.json                                              
{
    "CollectionName": "hoge0618collection1",
    "GeofenceId": "hoge-geo-2",
    "GeofenceProperties": {
        "hoge-office": "hibiya",
        "hoge-key2": "hogevalue2",
        "hoge-key3": "hogevalue3",
        "hoge-key4": "hogevalue4"
    },
    "Geometry": {
        "Circle": {
            "Center": [
                139.75297,
                35.67097
            ],
            "Radius": 100000
        }
    }
}
% aws location put-geofence --cli-input-json file://put-geofence3.json

An error occurred (ValidationException) when calling the PutGeofence operation: 'GeofenceProperties' must have length at most 3

大量に属性を付与するような使い方は出来ないので、設計時にこのあたりは気をつけましょう。

さいごに

本日は Amazon Location Service でジオフェンスデータにカスタムメタデータを設定出来るようになったので使ってみました。

ジオフェンスイベントの検知時に別のデータベースに問い合わせて属性など取得するようなケースがあったと思うのですが、属性情報の更新頻度や更新方法によっては今回のカスタムメタデータ機能は結構活用出来るのではないでしょうか。