2023/11に Amazon Location(以下Location) のアップデートで Maps, Places, Routes はユーザー側でリソース作成が不要になりました(それまではユーザー側でリソースを作成する必要があった)。
※アップデートでは Enhanced Places, Routes, Maps と呼称されていますが、この記事ではこれらを Enhanced API と記載します。
また Location のAPI 利用における認証としてAPIキーが用意されています。
このAPIキーはCDK L1 / CFn で作成ができるのですが、Enhanced API用のAPIキーの設定方法がCFn のドキュメントには 書かれていません(執筆時点)。
試したところ、ドキュメントには記載がないものの、Enhanced API に対応した API キーは作成可能なのでその内容をまとめておきます。
目次
最初に結論
以下のようにすれば作成できます(CDK L1の場合)。
new CfnAPIKey(this, 'ApiKey', { keyName: 'api-key', noExpiry: true, restrictions: { allowActions: [ // Mapのアクション 'geo-maps:GetStaticMap', 'geo-maps:GetTile', // Placeのアクション 'geo-places:Autocomplete', 'geo-places:Geocode', 'geo-places:GetPlace', 'geo-places:ReverseGeocode', 'geo-places:SearchNearby', 'geo-places:SearchText', 'geo-places:Suggest', // Routeのアクション 'geo-routes:CalculateIsolines', 'geo-routes:CalculateRoutes', 'geo-routes:CalculateRouteMatrix', 'geo-routes:OptimizeWaypoints', 'geo-routes:SnapToRoads', ], allowResources: [ // リソースは一律固定 `arn:aws:geo-maps:${Stack.of(this).region}::provider/default`, `arn:aws:geo-places:${Stack.of(this).region}::provider/default`, `arn:aws:geo-routes:${Stack.of(this).region}::provider/default`, ], }, }); new CfnAPIKey(this, 'ApiKeyForAnyActions', { keyName: 'api-key-for-any-actions', noExpiry: true, restrictions: { allowActions: [ // ワイルドカード指定も可能 'geo-maps:*', 'geo-places:*', 'geo-routes:*', ], allowResources: [ `arn:aws:geo-maps:${Stack.of(this).region}::provider/default`, `arn:aws:geo-places:${Stack.of(this).region}::provider/default`, `arn:aws:geo-routes:${Stack.of(this).region}::provider/default`, ], }, });
詳細
allowActions について
以下のドキュメントを見ればわかります。
- https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonlocationservicemaps.html
- https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonlocationserviceplaces.html
- https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonlocationserviceroutes.html
サービス名のPrefixが以下のように変わっています。執筆時点のCFnドキュメントには1しか書いていないため、この通りに設定してしまうと Enhanced API 用のAPIキーを作成できません。
そのため2をもとに定義します。
- 従来のLocation Service関連:
geo
- Enhanced API:
geo-maps
,geo-places
,geo-routes
また実装例のようにワイルドカード指定も可能です。
allowResources について
ユーザー側でのリソース作成が不要になったため、AWSマネージドなリソース名を指定します。
アカウントIDは含まず以下のような形になります。基本的にはリージョン名が変わるのみとなります。
- Mapの場合:
arn:aws:geo-maps:us-east-1::provider/default
- Placeの場合:
arn:aws:geo-places:us-east-1::provider/default
- Routeの場合:
arn:aws:geo-routes:us-east-1::provider/default
デプロイしてみる
実装例のAPIキーをデプロイしてみます。
前者の allowActions
を個別に指定した方は、マネコン上も Action がすべて入っていることがわかります。
一方、後者の Action をワイルドカード指定した方は、マネコン上だと Action が空で設定値を確認できません。
CLI だと正しく設定されていることが確認できます。
% aws location describe-key --key-name api-key-for-any-actions --region us-east-1 { "Key": "Dummy", "KeyArn": "arn:aws:geo:us-east-1:0123456789012:api-key/api-key-for-any-actions", "KeyName": "api-key-for-any-actions", "Restrictions": { "AllowActions": [ "geo-maps:*", "geo-places:*", "geo-routes:*" ], "AllowResources": [ "arn:aws:geo-maps:us-east-1::provider/default", "arn:aws:geo-places:us-east-1::provider/default", "arn:aws:geo-routes:us-east-1::provider/default" ], "AllowReferers": [ "*" ] },
ワイルドカード指定のAPIキーでAPIを叩いてみたところ動作しました。問題ないですね。
% curl --silent -X "POST" "https://places.geo.us-east-1.amazonaws.com/v2/geocode?key=DUMMY" -d $'{ "QueryText": "Grand Place, Lille, France" }' # Result {"ResultItems":[{"PlaceId":"AQAAAEkAFVdpLM3zFe6lTG-775xrqgiWmcgHU9lMPDyt6QpX2U_D8YYeFqiacn7pOsZfHgEIROlZ0z6cWk7zv_3afxUow4lxNbg6CcnN1iEqRdG5v2mZAfSykqcpL7YWnC5IQ3FqEn5QapeBoG5U","PlaceType":"Street","Title":"Grand'Place, 59800 Lille, France","Address":{"Label":"Grand'Place, 59800 Lille, France","Country":{"Code2":"FR","Code3":"FRA","Name":"France"},"Region":{"Code":"HDF","Name":"Hauts-de-France"},"SubRegion":{"Name":"Nord"},"Locality":"Lille","District":"Centre","PostalCode":"59800","Street":"Grand'Place","StreetComponents":[{"BaseName":"Grand'Place","Language":"fr"}]},"Position":[3.06361,50.63706],"MapView":[3.0628,50.6367,3.06413,50.63729],"MatchScores":{"Overall":1,"Components":{"Address":{"Country":1,"Locality":1,"Intersection":[1]}}}}]}
おわりに
CFn の docs に Enhanced API の記載を追加してほしい、というフィードバックを以下のIssueで起票しています。
また Enhanced API に対応した APIキー のL2 Construct を以下で作成中です。
実装自体はほぼ終わっているのですが、Locationは比較的マイナー(?)なサービスかと思い、CFn の docsが反映されてからの方が良いと考え一旦ドラフトにしています。 頃合いみてOpenにする予定です。