ダメ元エンジニアのお勉強おメモ

ほとんど自分用のメモです。AWS をよく触ります。Web アプリとか作ります。Raspberry Pi も好きです。

カスタムドメイン設定済みの 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 でリクエストする場合はこんな感じ。

$ 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 でリクエストする場合はこんな感じ。

$ 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 の挙動を確認することができたので、色々と面白かった。