0
2

More than 1 year has passed since last update.

API Gateway の API バージョン指定(ベースパス)で Lambda の処理を分岐させる

Last updated at Posted at 2022-02-01

はじめに

ある API で v2 と v3 を並行稼働させることになりました

URL は以下の想定

v2 と v3 を個別の REST API やステージとして構築すれば簡単に実装できます

しかし、この API では API_KEY を使った使用量制限などを行っているため、
個別に実装してしまうと、 v2 と v3 で API_KEY を別々にしなければなりません

  • 全ユーザー用に新しい API_KEY を発行する必要がある
  • ユーザーは新しい API_KEY を使う必要がある
  • 新旧どちらの API_KEY も発行できるようにシステム改修する必要がある

そこで、 v2 も v3 も同じ REST_API 、ステージに設定した上で、
ユーザーがアクセスしてきた URL によって処理を分岐させることにしました

これにより、ユーザーは同じ API_KEY のまま URL を変えるだけで移行が可能になります

この実装のため、検証した内容を残しておきます

同一リソースへのベースパスマッピング

以下のどちらへのアクセスも同じ API へ繋げなければなりません

API Gateway のベースパスマッピングでは、問題なく同一リソースに別のパスを設定できました

Terraform では以下のような形になります

resource "aws_api_gateway_base_path_mapping" "api-v2" {
  api_id      = aws_api_gateway_rest_api.some-api.id
  stage_name  = aws_api_gateway_stage.some-api.stage_name
  domain_name = aws_api_gateway_domain_name.some-api.domain_name
  base_path   = "v2" # ここだけ違う
}

resource "aws_api_gateway_base_path_mapping" "api-v3" {
  api_id      = aws_api_gateway_rest_api.some-api.id
  stage_name  = aws_api_gateway_stage.some-api.stage_name
  domain_name = aws_api_gateway_domain_name.some-api.domain_name
  base_path   = "v3" # ここだけ違う
}

API Gateway から Lambda へのベースパス連携

既存の実装では Lambda でベースパス( /v2//v3/ の部分)は取得できませんでした
/some_items の部分は取得できましたが)

そのため、 API Gateway の requestTemplates に以下のようにパス情報を追加しました

{
  ...
  "path" : "$context.path"
}

これにより、 Lambda 側で以下のようにベースパスが参照できるようになりました

exports.handle = (event, context, callback) => {
  const path = event.path;
  ...

以下の AWS 公式ドキュメントを参考にしています

おわりに

特殊なケースなのであまり参考にはならないかも、、、

ただ、 Terraform で定義することで、こういうケースでも対応しやすかったとは思います

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2