カスタムドメイン設定済みの API Gateway に対して無理やり別ドメインでのアクセスを通す
前置き
とある調査の副産物的な形で見つけた挙動。いつか役に立つかもしれないのでメモっておく。といっても、無理やり感が満載な上に、全く実用的で無いと思われる構成なので、その辺はご承知おきを。
調査内容
全く別のドメインを2つ取得済みだとして、「ドメインA」を API Gateway のカスタムドメインとして割り当て、「ドメインB」にドメインAを向き先にしたCNAME レコードを登録した場合、ドメインB から API Gateway にリクエストを通せるのかという調査をしてみた。
結論
下記2点を考慮することで、ドメインB で API Gateway へのリクエストを通すことができた。
詳細 - リクエストを通す
以下では、ドメインAを「api.example.com」、ドメインBを「api.example.jp」とする。
ドメインAの場合
通常のリクエスト方法。
$ curl https://api.example.com/pets [ { "id": 1, "type": "dog", "price": 249.99 }, { "id": 2, "type": "cat", "price": 124.99 }, { "id": 3, "type": "fish", "price": 0.99 } ]
ドメインBの場合
今回の調査で通そうとしていた別ドメインでのリクエスト。HTTP ヘッダー「Host」にドメインAの値を設定することでアクセスが通る。
$ curl -H 'Host: api.example.com' https://api.example.jp/pets [ { "id": 1, "type": "dog", "price": 249.99 }, { "id": 2, "type": "cat", "price": 124.99 }, { "id": 3, "type": "fish", "price": 0.99 } ]
ダメな例
ドメインBでアクセスするが、Host の値を変更しない場合
403 エラーが返る。Host の値がカスタムドメインと異なる場合、API Gateway はそのリクエストを拒否る仕様?
$ curl -i https://api.example.jp/pets HTTP/2 403 date: Fri, 17 Jun 2022 16:09:56 GMT content-type: application/json content-length: 23 x-amzn-requestid: e80d5f9a-6480-4a13-9c96-90b97c18be7a x-amzn-errortype: ForbiddenException x-amz-apigw-id: T38VKGgJNjMFaAw= {"message":"Forbidden"}
逆に、ドメインAでアクセスするけど、Host の値をドメインBに設定したら?
$ curl -i -H 'Host: api.example.jp' https://api.example.com/pets HTTP/2 403 date: Fri, 17 Jun 2022 16:15:24 GMT content-type: application/json content-length: 23 x-amzn-requestid: c75c221f-069d-4238-b26d-2bea64353a6c x-amzn-errortype: ForbiddenException x-amz-apigw-id: T39IjGPvtjMFuuw= {"message":"Forbidden"}%
ビンゴ。API Gateway が Host の値を見て一致しないなら拒否る仕様なんだと思われる。Host を見て内部でルーティングとかやってる感じ?少なくとも、API Gateway にリクエストを投げる際の Host を変に書き換えると変な挙動をする可能性があるということは覚えておこう。
ACM で取得するサーバ証明書のドメインにドメインBを含めない場合
証明書のサブジェクト名とリクエストしたドメイン名が一致しないということでエラーが発生する。
$ curl -H 'Host: api.example.com' https://api.example.jp/pets curl: (60) SSL: no alternative certificate subject name matches target host name 'api.example.jp' More details here: https://curl.haxx.se/docs/sslcerts.html curl failed to verify the legitimacy of the server and therefore could not establish a secure connection to it. To learn more about this situation and how to fix it, please visit the web page mentioned above.
おわりに
一応、リクエストは通せるようになったが、Host の値を付け加えたりすることを考えると、一体どんな用途で今回の調査結果が使えるのかはよく分からない。もっと良い方法があるかもしれない。ただ、API Gateway の挙動を確認することができたので、色々と面白かった。