本記事は
AWSアワード受賞者祭り
18日目の記事です。
✨🏆
17日目
▶▶ 本記事 ▶▶
19日目
🏆✨

こんにちは、後藤です。いつもはTerraform系のネタを中心に書いていますが、今回はAWSリソース設定中に遭遇した「意外なハマりポイント」について共有したいと思います。
AWSを触っていると、一見うまく設定したはずなのに「なぜか動かない」という場面に出くわすことがあると思います。今回取り上げるのは、Amazon API Gateway(以下、API Gateway)のプライベートカスタムドメインの設定でのお話です。
API Gatewayプライベートカスタムドメインとは
まず簡単に、API Gatewayのカスタムドメインについて説明しておきます。
通常、API GatewayでREST APIやHTTP APIを作成すると、エンドポイントはAWSが用意したドメインになります。
例:https://<api-id>.execute-api.<region>.amazonaws.com
このままでも動作には問題ありませんが、独自のドメイン(例:https://api.example.com)を使いたいケースも多いはずです。
例えば、「複数のAPIを統一されたドメイン配下で管理したい」だったり、「エンドユーザーにAWS臭を出したくない」だったり、「サブドメイン単位で用途を分けたい(auth.example.comやapi.example.comなど)」などといった理由が考えられます。
そんなときに便利なのが「カスタムドメイン」で、ACMで取得したSSL証明書とRoute53などのDNS設定を組み合わせることで、独自ドメイン名をAPIエンドポイントとして利用できます。
プライベートカスタムドメインは、それを閉じたネットワーク内で利用することができます。イメージするなら以下のような構成です。

カスタムドメインを設定してアクセスしても、エラー!
DNS設定もばっちり。証明書も設定済み。プライベートカスタムドメインとAPIマッピングもステージデプロイも完了。
「これでアクセスできるはず!」と意気込んでアクセスすると……
"Missing Authentication Token"
というエラーが表示されました。
なぜ!?
原因:リソースポリシーのデフォルト設定
意外なところに落とし穴がありました。それはAPI Gatewayのプライベートカスタムドメイン作成時に、カスタムドメインに自動的に※リソースポリシーが設定されるという点です。しかもそのリソースポリシーは、以下のように明示的にアクセス拒否(Deny)する設定になっていました。

S3やLambdaなどの他のリソースでは初期状態でリソースポリシーが空であることが多いため、このリソースもそうだろうと思い込んでいました。
さらにややこしくしているのは、API Gateway本体を作成するだけではリソースポリシーは自動で設定されないのに、プライベートカスタムドメインの場合は作成すると自動的にDenyのリソースポリシーが追加されるのです。
自動でDeny設定がされていることに気づかず、アクセスして弾かれていたようです
解決方法
答えはシンプルです。カスタムドメインに対して、明示的に許可のリソースポリシーを設定する必要があります。
その際に、DenyをAllowに書き換えるだけでなく、IP制限やVPC制限、IAM認証などと組み合わせることをお勧めします。
以下は修正後のサンプルポリシーで、特定のVPCエンドポイントからのみ許可しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowFromVPCEndpoint",
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:ap-northeast-1:123456789012:abcd1234/*",
"Condition": {
"StringEquals": {
"aws:SourceVpce": "vpce-123456789012"
}
}
}
]
}
まとめ
API Gatewayのプライベートカスタムドメインは便利ですが、デフォルトのリソースポリシーに注意が必要です。
「デプロイ忘れ」や「パス間違い」はAPI Gatewayのエラーあるあるですが、プライベートカスタムドメインを設定している場合はリソースポリシーによるアクセス拒否の可能性を疑ってみてください。
同じようにハマっている方の参考になれば幸いです!
※リソースポリシーとは
リソースポリシーとは特定のAWSリソースに対して「どのユーザーやサービスが、どういった操作をできるのか」を制御するJSON形式の設定です。
IAMポリシーが「ユーザーに対する許可」を与えるのに対して、リソースポリシーは「リソース側からの制御」を行います。API Gatewayでリソースポリシーを使うことで、特定のIPアドレスやVPC、特定のAWSアカウントやIAMロールにのみアクセス許可することができます。