mazyu36の日記

某SIer所属のクラウドエンジニアのブログ

CDK L1 / CloudFormationでAmazon LocationのAPI Key (Enhanced API 対応版) を作成する

2023/11に Amazon Location(以下Location) のアップデートで Maps, Places, Routes はユーザー側でリソース作成が不要になりました(それまではユーザー側でリソースを作成する必要があった)。

※アップデートでは Enhanced Places, Routes, Maps と呼称されていますが、この記事ではこれらを Enhanced API と記載します。

aws.amazon.com

aws.amazon.com

また Location のAPI 利用における認証としてAPIキーが用意されています。

dev.classmethod.jp

このAPIキーはCDK L1 / CFn で作成ができるのですが、Enhanced API用のAPIキーの設定方法がCFn のドキュメントには 書かれていません(執筆時点)。

docs.aws.amazon.com

試したところ、ドキュメントには記載がないものの、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 について

以下のドキュメントを見ればわかります。

サービス名のPrefixが以下のように変わっています。執筆時点のCFnドキュメントには1しか書いていないため、この通りに設定してしまうと Enhanced API 用のAPIキーを作成できません。

そのため2をもとに定義します。

  1. 従来のLocation Service関連:geo
  2. Enhanced APIgeo-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で起票しています。

github.com

また Enhanced API に対応した APIキー のL2 Construct を以下で作成中です。

実装自体はほぼ終わっているのですが、Locationは比較的マイナー(?)なサービスかと思い、CFn の docsが反映されてからの方が良いと考え一旦ドラフトにしています。 頃合いみてOpenにする予定です。

github.com