[アップデート] API Gatewayのカスタムドメインでルーティングルールが設定可能になりました
大阪オフィスの小倉です。
API Gatewayのカスタムドメインで、ルーティングルールが設定可能になりましたので、試してみた内容を紹介します。
Amazon API Gateway introduces routing rules for REST APIs - AWS
Dynamically routing requests with Amazon API Gateway routing rules | AWS Compute Blog
ルーティングルールとは
API Gatewayのカスタムドメインは、 カスタムドメイン配下の特定のパスに対するリクエストを、
任意のAPIのステージにルーティングする、というマッピングをしています(以降APIマッピングと呼称します)。
今回追加されたルーティングルールを使うと、
ヘッダとパスの組み合わせから構成されるルールから、任意のAPIのステージにリクエストをルーティングすることができるようになりました。
また、ルーティングルールに一致しなければAPIマッピングでルーティングするという方法も選択できます。
カスタムドメイン作成時に、これらのルールを選択可能になっています。
ルーティング方法 | 意味 |
---|---|
APIマッピングのみ | パスによるルーティング |
(NEW) ルーティングルールのみ | ヘッダとパスの組み合わせルールによるルーティング |
(NEW) ルーティングルール、その後にAPIマッピング | まずルーティングルールを評価し、一致しなければAPIマッピングの設定に従う |
AWS Blogにも挙げられていますが、例えばAPIのバージョンを /v1/, /v2/ のようにパスに含めてルーティング先APIを管理しているようなケースでは、
今後はHTTPヘッダに version=1 のような値を含めることでルーティングをすることが可能です。
なお考慮事項として、ルーティング先のAPIはREST APIのみ対応しており、WebSocketとHTTP APIにルーティングすることは出来ないようです。
Send traffic to your APIs through your custom domain name in API Gateway - Amazon API Gateway
ルーティングルール
まずはルーティングルールのみのパターンを試していきます。
事前にルーティングのターゲットとなるサンプルAPIを3つほど作成しました。(名前が雑ですみません。。。)
- PetStore
- PetStore v1
- PetStore v2
それぞれGET /pets/1
にリクエストした場合に、以下のレスポンスが返ります。
PetStore API の GET /pets/1
{
"id": 1,
"type": "dog",
"price": 249.99
}
PetStore v1 API の GET /pets/1
{
"id": 1,
"version": 1,
"type": "dog"
}
PetStore v2 API の GET /pets/1
{
"id": 1,
"version": 2,
"type": "cat"
}
それではカスタムドメインを作成します。
ルーティングモードの選択が増えているので、「ルーティングルールのみ」を選択して作成します。
既存の手順ではありますが、カスタムドメイン作成後はRoute53でのレコード登録も実施しておいてください。
作成後、画面最下部の「ルーティングルールを追加」を選択すると、条件とアクションの編集に移ります。
1つのルール条件につき、ヘッダに関して最大2つ、パスに関して最大1つの設定が可能です。
まずはヘッダのmy-api-version
が1
の場合、 PetStore v1というAPIのdevステージにルーティングするルールを設定します。
次に複数ルールが存在する場合の優先度を設定します。 優先度は、数字の小さいものから順に評価されます。
ドキュメントによると、1 〜 1,000,000の間で設定可能との事でした。
この要領で、3つのAPIを以下のようにマッピングしました。優先度の数値の小さい上から順に評価されます。
my-api-version
が2
の場合、PetStore v2 のdevステージへmy-api-version
が1
の場合、PetStore v1 のdevステージへ- 上記以外の場合、PetStore のdevステージへ
実際にPostMan経由でリクエストを送信して、期待どおりか確認してみます。
my-api-version
が 2
の場合、PetStore v2 のdevステージへ
my-api-version
が 1
の場合、PetStore v1 のdevステージへ
上記以外の場合、PetStore のdevステージへ
期待通りのレスポンスが表示されました。
また、3番目のルールである上記以外の〜
のルールを削除し、
どのルールにもマッチしないようなリクエストを送信すると、レスポンスはForbidden
となりました。
ルーティングルール、その後にAPIマッピング
こちらも簡単に確認します。
カスタムドメインを作成すると、ルーティングルールとAPIマッピングの両方を設定可能になっています。
以下のようにマッピングしました。優先度の数値の小さい上から順に評価されます。
my-api-version
が2
の場合、PetStore v2 のdevステージへ- 上記以外の場合、APIマッピングの判定へ
- PetStore v1 のdevステージへ
確認します。
my-api-version
が 2
の場合、PetStore v2 のdevステージへ
上記以外の場合、APIマッピングの判定で、PetStore v1 のdevステージへ
my-api-version
が 3
の場合に該当するルールがないため、APIマッピングの判定へ
こちらも期待どおりですね。
まとめ
API Gatewayのルーティングにヘッダの値が使えるようになったのは面白いですね。
v1,v2のようなバージョン管理やdev,stg,prdなどの環境分けにも使えそうです。
個人の感覚ですが、「ルーティングルール、その後にAPIマッピング」は若干複雑に感じる気がしたので、
まずはAPIマッピングのみ、またはルーティングルールのみのどちらかから使っていこうかなと思いました。