Amazon Virtual Private Cloud (Amazon VPC) から Amazon API Gateway パブリック API を呼び出すと、HTTP "403 Forbidden" エラーが表示されます。
簡単な説明
Amazon VPC インターフェイスエンドポイントはトラフィックをプライベート API にのみルーティングするため、API Gateway パブリック API にアクセスしようとすると、HTTP "403 Forbidden" エラーが発生することがあります。
プライベート DNS 名が有効になっている VPC から API Gateway パブリック API にアクセスしようとすると、HTTP "403 Forbidden" エラーが発生します。プライベート DNS 名を有効にすると、Amazon VPC から API Gateway API へのすべてのリクエストがインターフェイス VPC エンドポイントに解決されます。
ただし、エンドポイントのプライベート DNS 名は***.execute-api.{リージョン}.amazonaws.com** という形式であるため、インターフェイス VPC エンドポイントを使用してパブリック API に接続することはできません。* の文字は API ID のプレースホルダーです。この形式は、パブリック API とプライベート API の API Gateway のデフォルト呼び出し URL と一致します。
プライベート DNS 名を有効にすると、*.execute-api.{リージョン}.amazonaws.com という形式の API Gateway API URL への呼び出しは、インターフェイス VPC エンドポイントのプライベート IP アドレスに解決されます。この設定では、パブリック API とプライベート API のインターフェイス VPC エンドポイントを介して、すべてのトラフィックが API Gateway にルーティングされます。
また、AWS Direct Connect を使用してデフォルトの execute-api URL を呼び出し、オンプレミスネットワークからプライベート API に接続すると、"403 Forbidden" エラーが発生します。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
Amazon VPC がプライベート DNS 設定を使用しているかどうかを確認する
HTTP "403 Forbidden" エラーを解決するには、まず Amazon VPC がプライベート DNS 設定とパブリック DNS 設定のどちらを使用しているかを確認します。AWS CLI、または Amazon VPC コンソールのいずれかを使用できます。
AWS CLI
次の describe-vpc-endpoints コマンドを実行します。
export VPC_ID=YOUR_VPC_ID
export REGION=YOUR_REGION
aws ec2 describe-vpc-endpoints \
--filters "Name=vpc-id,Values=${VPC_ID}" \
"Name=service-name,Values=com.amazonaws.${REGION}.execute-api" \
--query 'Amazon VPC endpointndpoints[].{Name:Tags[?Key==`Name`].Value|[0],Amazon VPC endpointndpointId:Amazon VPC endpointndpointId,PrivateDnsEnabled:PrivateDnsEnabled}' \
--output table
注: YOUR_VPC_ID をご使用の VPC ID に、YOUR_REGION をご利用の AWS リージョンに置き換えてください。
Amazon VPC コンソール
インターフェイス VPC エンドポイント設定でプライベート DNS 名を有効にしたかどうかを確認します。また、VPC 内のプライベート REST API にアクセスするためのインターフェイス VPC エンドポイントがあるかどうかも確認します。インターフェイス VPC エンドポイントがある場合は、DNS 属性を有効にしているかどうかを確認します。
プライベート DNS を有効にしてパブリック API に接続する
プライベート DNS を有効にした場合は、エッジ最適化カスタムドメイン名またはリージョナルカスタムドメイン名を設定してパブリック API に接続します。その後、api.example.com などのカスタムドメイン名を使用して API Gateway パブリック API を呼び出すことができます。プライベート REST API への接続は、プライベート REST API エンドポイントを介して引き続き機能します。
クライアントがオンプレミスネットワークから接続する場合は、Amazon Route 53 Resolver のインバウンドエンドポイントを設定します。execute-api 呼び出し URL を使用するには、すべてのプライベート DNS クエリをオンプレミスネットワークからインバウンドエンドポイントに転送します。
注: パブリック API への接続には、VPC リソースにインターネット接続が必要です。
プライベート DNS を無効にしてパブリック API に接続する
パブリック API へのアウトバウンドトラフィックを許可するには、VPC のセキュリティグループを使用します。また、API にアタッチされているリソースポリシーを変更して、VPC からのアクセスを許可します。
VPC にパブリック REST API へのアクセス許可がある場合は、デフォルトの execute-api コマンドを使用してパブリック REST API に接続します。カスタムドメイン名を使用してパブリック REST API に接続することもできます。詳細については、「API Gateway で REST API へのアクセスを制御および管理する」を参照してください。
インターフェイス VPC エンドポイントのプライベート DNS 名をオフにすると、デフォルトの execute-api 呼び出し URL はプライベート REST API に接続しなくなります。
プライベート REST API を呼び出すには、次のいずれかのアクションを実行します。
-
次の例のように、Amazon VPC エンドポイントのホストヘッダーを DNS として使用します。
curl -H "Host: {your-api-id}.execute-api.{region}.amazonaws.com" \
https://Amazon VPC endpoint-xxxxx-xxxxx.execute-api.{region}.Amazon VPC endpoint.amazonaws.com/stage/path
-
execute-api.{リージョン}.amazonaws.com のプライベートホストゾーンを作成します。プライベートホストゾーンで、API 識別子の A レコードを追加します。A レコードにインターフェイス VPC エンドポイントの IP アドレスを指定して、プライベート REST API のデフォルトの execute-api 呼び出し URL を使用できるようにします。
インターフェイス VPC エンドポイントのプライベート DNS 属性を変更する
インターフェイスエンドポイントのプライベート DNS 属性を変更できます。この変更は、API ステージ URL がインターフェイス VPC エンドポイントのプライベート IP アドレスにどのように解決されるかに影響します。また、この変更は、VPC からプライベート API とパブリック API に接続する方法にも影響します。詳細については、「VPC の DNS 属性」を参照してください。
関連情報
Access an AWS service using an interface VPC endpoint (インターフェイス VPC エンドポイントを使用して AWS のサービスにアクセスする)