🌟

カスタムドメイン名はプライベートAPIではサポートされない、とはどういうことか

2022/02/24に公開

API Gatewayのカスタムドメイン名は、プライベートAPIではサポートされていません。
ただし、実際にはプライベートAPIでもカスタムドメイン名を利用することができます。
どういうことでしょう。

API Gatewayのカスタムドメイン名とは

カスタムドメイン名なしでAPI Gatewayを利用する場合、APIのURLは以下のような形式となります。

https://api-id.execute-api.region.amazonaws.com/stage

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-custom-domains.html

ドメインからAPI Gatewayを利用していることが明らかであったり、URLにステージ名が含まれいたりと、利用用途によっては不格好です。
カスタムドメイン名を利用することで、ドメイン部分を任意のドメイン名にし、ステージ名を含めないURLにすることが可能になります。

カスタムドメイン名はプライベートAPIでは利用できない?

ドキュメントにはプライベートAPIではサポートされない、と記載されています。

カスタムドメイン名はプライベート API ではサポートされていません。

一方で、いくつかの記事において、Private APIのVPCエンドポイントの前段にELBを構成することでプライベートAPIでも利用可能な構成例が紹介されています。
https://blog.serverworks.co.jp/private-apigateway-custom-domain
https://www.shinkainoblog.com/aws/private-api-gatewayにカスタムドメインを設定する/

カスタムドメイン名の設定が実施していること

カスタムドメイン名の設定によって以下の2つのことが行われます。

  1. API Gatewayのエンドポイントにカスタムドメイン名で設定したサーバ証明書を紐づける
  2. エンドポイントにカスタムドメイン名でアクセスした場合に、マッピングしたAPIを呼び出す

プライベートAPIの場合、1が実施されません。カスタムドメイン名作成の際にACMに登録した証明書の設定は必要ですが、Private APIに接続した場合には、API Gateway共通の"*.execute-api.region.amazonaws.com"をサブジェクトとした証明書となります。

一方で、2については実施されます。カスタムドメイン名のマッピングをしていない場合、プライベートAPIにVPCエンドポイント経由でアクセスするには、リクエストのHostヘッダに{restapi-id}.execute-api.{region}.amazonaws.comが設定されているか、x-apigw-api-idヘッダでapi-idが設定されることが必要です。
カスタムドメイン名のマッピングをすると、カスタムドメイン名でのリクエストでAPIの呼び出しが可能となります。仮にカスタムドメイン名をexample.comとし、Private APIのVPCエンドポイントのIPアドレスが172.32.0.10であった場合、下記のように証明書検証を無視したコマンドを実行すると、カスタムドメイン名にマッピングしたプライベートAPIは実行できます。

curl https://172.32.0.10/ -H "Host: example.com" --insecure

リクエスト送信元のhostsやプライベートDNSなどで名前解決ができれば、自然なリクエストでAPIの呼び出しが可能です。

curl https://example.com/ --insecure

先に紹介したリンク先の記事のように、前段にELBを配置し、1の機能をELBに担わせ、DNSの名前解決でカスタムドメインをVPCエンドポイントのIPアドレスに解決することで、証明書の検証を無視することもなく、プライベートAPIでも自然にカスタムドメイン名を利用することができるというわけです。

相互TLS認証(mTLS)について

API GatewayはTLSクライアント証明書による相互TLS認証をサポートしていますが、カスタムドメイン名の利用が前提条件となっています。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/rest-api-mutual-tls.html

mTLSについてはカスタムドメイン名の設定において、プライベートAPIにマッピングしようとした時点でエラーとなり設定できません。つまりカスタムドメイン名については、プライベートAPIでも証明書検証を無視するなり、ELBを前段に配置するなりによって利用する方法はありますが、mTLSが利用できないという状況はどうしようもありません。

カスタムドメインは早い者勝ち

カスタムドメイン名ですが、ドキュメントには以下のように記載があります。

API のカスタムドメイン名を設定するには、登録されたインターネットドメイン名が必要です。

この記載は完全には正しくありません。登録されたインターネットドメイン名がなくても作成できてしまいます。
カスタムドメインの作成時に、対応するドメインのACM証明書が必要となりますが、インポートした自己署名の証明書でも通るため、任意のドメイン名でカスタムドメイン名が作成できます。
なお、同一リージョン全体で1つのドメイン名しか利用できません。
既に他のアカウントで利用中の場合、次のようなメッセージでエラーとなります。

The domain name you provided already exists.

つまり、API Gatewayのカスタムドメイン名は早い者勝ちです。
プライベートで利用しているドメインや自身が所有しているドメインであっても、誰かに先に取得されてしまえば利用することができません。
ワイルドカードのドメインについては、ACMが発行する証明書(ACMが発行する証明書を取得するためにはドメインを所有していることが必要)なため、所有していないワイルドカードのカスタムドメイン名を作成することはできません。ただし、ワイルドカードのカスタムドメイン名は、既に重複しているドメインが存在する場合作成できないため、たとえば私がtest.amazon.comというドメインを取得すると、Amazonは*.amazon.comを作成することはできない、という状況になります。

AWSとしてパブリックなカスタムドメイン名とプライベートなカスタムドメイン名については、管理領域を分けたうえで、パブリックなカスタムドメイン名については、ドメイン所有権が確認されたパブリックな証明書を有する場合のみ作成可能なようにするべきでしょう。プライベートAPIに対してはサポートしない、という現在の状況においては、自己署名の証明書でカスタムドメイン名は作成できない方が正しいあり方だと思います。

カスタムドメイン名はプライベートでAPIでサポートされない、とは

カスタムドメイン名はプライベートAPIで全く使えないということはないですが、以下の2つの要素から、やはりサポートされているとは言えない状況です。

  • エンドポイントにカスタムドメイン名のTLS設定が施されない
  • プライベート用途であってもカスタムドメイン名はリージョン全体で一意である必要がある

DirectConnect等で接続したプライベートネットワーク内でもサーバレス構成のサービスを実装をしたい要望は結構あるのではないかと思います。プライベートな利用であっても、URLはそれらしい見栄えにしたいものです。クライアント証明書による認証も使いたいです。プライベートネットワーク内で任意のドメインも安心して利用したいです。

早くカスタムドメイン名がプライベートAPIでもサポートされるようになって欲しいものです。

Discussion