API Gateway プライベート API エンドポイントへの接続時に発生する問題をトラブルシューティングする方法を教えてください。
Amazon Virtual Private Cloud (Amazon VPC) に配置した Amazon API Gateway プライベート API エンドポイントに接続する際の問題をトラブルシューティングしたいです。
簡単な説明
次の原因で、Amazon VPC の AWS リソースがプライベート API エンドポイントに接続できない場合があります。
- プライベート API エンドポイントの API Gateway リソースポリシーが正しく設定されていない。
- インターフェイス VPC エンドポイントの VPC エンドポイントポリシーが正しく設定されていない。
- Amazon VPC セキュリティグループのルールが正しく設定されていない。
- プライベート API の呼び出し URL に正しい DNS 名が含まれていない。
- プライベートカスタムドメイン名が VPC エンドポイントに関連付けられていない。
- プライベートカスタムドメイン名のリソースポリシーが正しく設定されていない。
原因を特定するには、API で Amazon CloudWatch Logs を有効化し、ログを確認します。
CloudWatch Logs を有効にした後に API リクエストがログを生成しない場合、リクエストはエンドポイントに到達していません。API リクエストがエンドポイントに到達していない場合は、プライベート API の呼び出し URL が正しく設定されていることを確認してください。
詳細については、「CloudWatch ログで API Gateway REST API エラーを特定する方法を教えてください」を参照してください。
注: API Gateway リソースポリシーが正しく設定されていなかったり、プライベート API エンドポイントの呼び出し URL で DNS 名が誤っていたりする場合、接続の問題が発生する可能性があります。
解決策
エラーの原因を確認する
次の手順を実行します。
- プライベート REST API で CloudWatch Logs を有効にします。
- [ログレベル] で [INFO] を選択し、[リクエスト / レスポンスデータ全体をログ記録] を選択します。
- CloudWatch で REST API の実行ログを参照し、問題の原因を特定します。
API リクエストがエンドポイントに到達できている場合は、次の例のいずれかに類似したエラーメッセージが表示されます。
- 「User: anonymous is not authorized to perform: execute-api:Invoke on resource: (ユーザー anonymous は、次のリソースに execute-api:Invoke を実行できません)」
- 「SSL: no alternative certificate subject name matches target host name custom-domain.com/resource (代替証明書のサブジェクト名がターゲットホスト名と一致しません)」
- 「Connection timed out」
- 「Could not resolve host: https://example.com/resource」
「User: anonymous is not authorized to perform: execute-api:Invoke on resource: (ユーザー anonymous は、次のリソースに execute-api:Invoke を実行できません)」
この問題を解決するには、次のポリシーを設定します。
- プライベート API の API Gateway リソースポリシーは、インターフェイス VPC エンドポイントまたはソース VPC から、API エンドポイントへのトラフィックを許可する必要があります。
- VPC エンドポイントポリシーは、プライベート API エンドポイントへのクライアントアクセスを許可する必要があります。これは execute-api サービス用のリソースポリシーです。
- カスタムドメイン名のリソースポリシーは、プライベートカスタムドメイン名を呼び出すための VPC エンドポイントへのアクセスを許可する必要があります。デフォルトでは、API Gateway はカスタムドメイン名のリソースポリシー内の明示的な deny を使用してカスタムドメイン名をプロビジョニングします。詳細については、「チュートリアル: プライベート API 用のカスタムドメイン名を作成して呼び出す」を参照してください。
重要: API のリソースポリシーを変更する場合は、API をステージにデプロイして変更を保存します。
「SSL: no alternative certificate subject name matches target host name custom-domain.com/resource (代替証明書のサブジェクト名がターゲットホスト名と一致しません)」
この問題を解決するには、execute-api サービスに、プライベート VPC エンドポイント用のプライベートカスタムドメイン名のアクセス関連付けが作成済みかどうかを確認します。
「Connection timed out」
接続タイムアウトの問題を解決するには、次の手順を実行します。
-
クライアントをホストする VPC に execute-api VPC エンドポイントが存在することを確認します。次に、そのエンドポイントがプライベート API と同じ AWS リージョンにあることを確認します。エンドポイントが存在しない場合は、API Gateway execute-api 用のインターフェイス VPC エンドポイントを作成します。
-
traceroute を使用して、プライベート API を呼び出すクライアントが同じ VPC 内に存在するか、VPC エンドポイントを使用して VPC にアクセスできることを確認します。
traceroute をインストールするには、次のコマンドを実行します。
Amazon Linux
sudo yum install tracerouteUbuntu
sudo apt-get install traceroutetraceroute を使用して接続をテストするには、次のコマンドを実行します。
sudo traceroute -n -T -p 443 VPC-endpoint IP-address注: 引数 -T -p 443 -n により、ポート 443 で TCP ベースのトレースを実行します。VPC-endpoint IP-address は、実際の VPC エンドポイントの IP アドレスに置き換えます。
-
Amazon VPC セキュリティグループのルールが正しく設定されていることを確認します。
Amazon VPC セキュリティグループをテストするには、プライベート API エンドポイントにリクエストを行うクライアントから次のコマンドを実行します。telnet public-dns-hostname.execute-api.region.vpce.amazonaws.com 443注: public-dns-hostname は、お使いの API 用の VPC エンドポイント ID を含むパブリック DNS ホスト名に置き換えます。さらに、region をインターフェイス VPC エンドポイントが配置されたリージョンに置き換えます。
または、プライベート API カスタムドメイン名をリクエストするクライアントから次のコマンドを実行します。
telnet custom-domain-name 443注: custom-domain-name は、実際のプライベート API のカスタムドメイン名に置き換えます。
接続がタイムアウトした場合は、Amazon VPC セキュリティグループのルールが正しく設定されていません。
リクエスト元リソースには、VPC エンドポイントの IP アドレス範囲またはセキュリティグループへのアウトバウンドトラフィックを TCP ポート 443 で許可するセキュリティグループのルールが必要です。また、VPC エンドポイントには、リクエスト元リソースの IP アドレス範囲またはセキュリティグループからのインバウンドトラフィックを TCP ポート 443 で許可するセキュリティグループルールが必要です。
詳細については、「Amazon VPC リソースに出入りするトラフィックを制限する方法を教えてください」を参照してください。
「Could not resolve host:https://www.example.com/resource」
この問題を解決するには、次の手順を実行します。
- Amazon Route 53 ホストゾーンに正しい VPC が関連付けられていることを確認してください。
- Route 53 ホストゾーンで、VPC エンドポイント の DNS 名へのエイリアスとして、ターゲットを使用してカスタムドメイン名用のレコードを作成済みであることを確認します。
プライベート API エンドポイントのドメインが VPC エンドポイントの IP アドレスに正しく解決されるかどうかをテストする
注: クライアントが execute-api VPC エンドポイントを配置した VPC 内にあることを確認します。
次の手順を実行します。
- プライベート API エンドポイントにリクエストを行うクライアントから、次の nslookup コマンドを実行します。
注: 実際のものでそれぞれ、restapi-id をプライベート API の ID に、region をプライベート API エンドポイントを配置したリージョンに置き換えます。nslookup restapi-id.execute-api.region.amazonaws.com - プライベート API のカスタムドメイン名をリクエストするクライアントから、次の nslookup コマンドを実行します。
注: custom-domain-name は、実際のプライベート API のカスタムドメイン名に置き換えます。正常に出力されると、VPC エンドポイントのプライベート IP アドレスが表示されます。nslookup custom-domain-name - 次の nslookup コマンドを実行します。
注: public-dns-hostname は、お使いの API 用の VPC エンドポイント ID を含むパブリック DNS ホスト名に置き換えます。region は、インターフェイス VPC エンドポイントを配置したリージョンに置き換えます。正常に出力されると、VPC エンドポイントのプライベート IP アドレスが表示されます。nslookup public-dns-hostname.execute-api.region.vpce.amazonaws.com - 各コマンドの出力で、IP アドレスを比較します。各コマンド出力の IP アドレスが一致している場合は、セットアップは想定どおりに機能します。
VPC エンドポイントでプライベート DNS を有効にするには、次の手順を実行します。
- Amazon VPC コンソールを開きます。
- [エンドポイント] ペインで、該当するインターフェイス VPC エンドポイントを選択します。
- [アクション] を選択します。
- [プライベート DNS 名の変更] を選択します。
- [プライベート DNS 名を有効にする] を選択し、[変更を保存] を選択します。
CloudWatch ログをアクティブにした後、API リクエストが CloudWatch Logs を生成しない
この問題を解決するには、次の手順を実行します。
- プライベート API エンドポイントの API Gateway リソースポリシーを正しく設定します。
- プライベート API の呼び出し URL を正しくフォーマットして、プライベート API エンドポイントにアクセスします。
注: プライベート DNS が有効化済みの場合は、エンドポイント固有のパブリック DNS ホスト名を使用する必要があります。プライベート DNS を有効にしていない場合は、プライベート DNS 名を使用します。 - プライベート API のカスタムドメイン名を正しい API ステージにマッピングします。
関連情報
インターフェイス VPC エンドポイントを使用して、別のアカウントにある API Gateway プライベート REST API にアクセスする方法を教えてください
VPC から API ゲートウェイ API への接続時に HTTP 403 Forbidden エラーが発生する理由を知りたいです
フローログを使用して VPC のトラフィックを監視する方法を教えてください
API Gateway REST API または WebSocket API のトラブルシューティング用に、CloudWatch Logs を有効にする方法を教えてください

