NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

注目のタグ

    API Gatewayプライベートカスタムドメイン作成時のハマりポイント

    本記事は  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.comapi.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ロールにのみアクセス許可することができます。

    執筆者: 後藤 涼太
    AWSをメインとするクラウドエンジニア
    2024 Japan AWS All Certifications Engineers
    2025 Japan AWS All Certifications Engineers
    執筆記事:https://tech.nri-net.com/archive/author/r-goto