はじめに
ある 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 で定義することで、こういうケースでも対応しやすかったとは思います