[アップデート] Amazon Location Service で API キーがプレビューでサポートされました

2023.02.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

先日のアップデートでどうやら Amazon Location Service で API キーが使えるようになったようです。
What's New でのアナウンスはまだないのですが、マネジメントコンソール上からは既に利用可能になっていました。

また、公式ドキュメントの更新履歴では言及はないのですが、アクセス許可のページではしっかり言及されています。

少し使ってみましたので紹介しますね。

本機能は記事作成時点でプレビューです。今後のアップデートで変更や削除される可能性があります。

API キーを生成してマップに関連付けする

Location Service コンソールメニューに「API keys (Preview)」が追加されています。
ここで API キーの管理を行うことが出来ます。

API キーはリソースと関連付けを行う必要があります。
本日時点で関連付け出来るリソースはマップのみです。今後トラッカーやルート計算でも利用出来るようになるのかは気になるところですが情報は見当たりませんでした。

キーを作成すると Show API key value ボタンから簡単にキー値を参照することが出来ます。
このあたりの温度感は API Gateway の API キーと同じですね。IAM のシークレットなどよりは秘匿性が低いという前提で取り扱う必要がありそうです。

マップのコンソール上でも API keys タブから既存のキーを関連付けすることが出来ます。

有効期限とリファラー

関連付けリソース以外の属性として、API キーに有効期限を設定することが出来ます。
また、マップ埋め込み時を想定してリファラーを制限することも出来ます。特定ドメインへの埋め込み時のみ API キーの利用を許可する形ですね。

API キーを使って埋め込みマップを表示する

マップコンソールの埋め込みマップタブから認証方法別に埋め込み方法のサンプルコードを生成することが出来ます。
従来の Cognito ID プールに加えて、今回追加された API keys も対応しています。

API keys を選択すると対象の既存 API キーを選択することで次のようにそのまま利用出来るサンプルコードが生成されます。
画面表示上 API キーはマスクされています。

しかし、コピーしたコードを見てみると API キーが次のように展開されていました。

index.html

<html>
  <head>
    <link href="https://unpkg.com/maplibre-gl@1.14.0/dist/maplibre-gl.css" rel="stylesheet" />
    <style>
      body { margin: 0; }
      #map { height: 100vh; }
    </style>
  </head>
  <body>
    <div id="map" />
    <script src="https://unpkg.com/maplibre-gl@1.14.0/dist/maplibre-gl.js"></script>
    <script>
      const apiKey = "v1.public.eyJqdGkiOiI5NWUxNWM0Yi0yNjZiLTRkZGYtYTU5Yi1hNDkzZTI4NTE0YWUifVOWyk0Cew77Hz27nTMpl3eHJI8MgASrmRiLd-4A0WH5zSAdEAW9A2CnYcSEIdp4nnY40kJE2nyWMIN6fEHYJQe2zNZdbhNZ8rCmpx_Zmg26zQdRy7DYvg63U8jpTSOHUM5GLKgyezMRHSEgg8FO-eYV_-_pdkIvVacJac0O02f_NLWIrBYBkxUTx68LMYfjaoCkFjLntBKX5nXOT8IyDLwbqslGYhtpxMK_p8DBfZEcqtrftjdxKJiTTtJSJUys6ANfIFKzZlYQ5iFtpt-d0CwEau1XTzPJXI_cV-CXI2IsHAuEDRPY8bbwpfijDHn3cbA8SZAgmA3lseOEunQyrXM.YTAwN2QzYTQtMjA4OC00M2Q5LWE5ZTUtYjk4Y2U1YWUxY2Uy";
      const region = "ap-northeast-1";
      const mapName = "explore.map";
      const styleUrl = `https://maps.geo.${region}.amazonaws.com/maps/v0/maps/${mapName}/style-descriptor?key=${apiKey}`;
      const map = new maplibregl.Map({
        container: "map",
        style: styleUrl,
        center: [-123.1187, 49.2819],
        zoom: 11,
      });
      map.addControl(new maplibregl.NavigationControl(), "top-left");
    </script>
  </body>
</html>

ローカルにこの内容で index.html を作成し、マネジメントコンソールの手順に従ってローカルサーバーを起動してみましょう。

% npx serve

   ┌────────────────────────────────────────┐
   │                                        │
   │   Serving!                             │
   │                                        │
   │   Local:  http://localhost:3000        │
   │                                        │
   │   Copied local address to clipboard!   │
   │                                        │
   └────────────────────────────────────────┘

URL へアクセスするとマップを表示することが出来ました。

試しに index.html へ埋め込んでいる API キーを変更してみると地図が表示されなくなりました。
API キーでの制御が出来ているようです。

コード量は Cognito ID プールよりも少ないですね。

API キーの無効化

API キー管理画面のキー詳細画面で、Deactivate を行うことでキーを無効化出来ます。

一瞬、キーの無効化に失敗したのかと思いましたが、成功しています。
ステータスが inactive に変更されています。

ただし、API キーを無効化してもまだその API キーを使ってマップを表示することが出来ました。
少しタイムラグがあるのかと思い 1 時間程度試してみましたがずっと表示可能でした。半日から 1 日程度待ってまた試してみます。

一度無効化したキーは Restore ボタンから有効化を行うことが出来ます。
有効期限を設定(あるいは期限無し)し、Restore 操作を行います。

API キーの削除

API キーの削除も管理画面から行うことが出来ます。
Delete ボタンから操作出来ます。

ただし削除には条件があるようで、API キーが無効化されていて、かつ無効化後から 90 日経過している必要があるようでした。

GA 時にこのあたりどうなるのか気になるところですが、API キーを大量に発行してもすぐには削除出来ないので気をつけましょう。

AWS CLI でもサポート

AWS CLI でも v 1.27.78 で以下のコマンドが実装され、API キー周りの操作が出来るようになりました。

プレビューということで、各コマンドには次のような注意書きがありました。

The API keys feature is in preview. We may add, change, or remove features before announcing general availability.

Deactivate のコマンドが見当たらないなマネジメントコンソールのみの機能か?と最初思ったのですが、Deativate 時には次の CloudTrail ログが出力されていました。

{
:
    "eventTime": "2023-02-27T20:54:05Z",
    "eventSource": "geo.amazonaws.com",
    "eventName": "UpdateKey",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "203.0.113.1",
    "requestParameters": {
        "KeyName": "hoge0228mapkey",
        "ExpireTime": "2023-02-27T20:54:04Z",
        "ForceUpdate": true
    },
:
}

実際の操作としては ForceUpdate で有効期限を設定することで API キーを無効化するという仕組みになっているようですね。

さいごに

本日は Amazon Location Service で API キーがプレビューでサポートされていることを発見したので、試しに使ってみました。

API キーの無効化がうまく動いていないようでしたが、少し試して結果が変わらないようであれば何らかの方法でフィードバックしたいと思います。プレビューですからね。

公式ドキュメントによると API キーを使う場合は Cognito ID プールよりも認証が単純になるのでパフォーマンスが高速になることが期待されるそうです。
一方できめ細かい制御は出来ないのと、トラッカーやルート計算での利用は出来ないということで、Cognito ID プールよりも劣る点もあるようです。
GA 時のサポート状況次第ですが、使い分けが必要そうですね。

ちなみに、API キーの認証期限ですが今回の機能と似たようなことを実は以下で行おうとしていて、タイムリーすぎて驚きました。

リファラーについては盲点でしたね。
QuickSight でもリファラー制限機能がありましたが、たしかに埋め込み出来るサービスであればリファラー制限は欲しいかもしれないですね。