API Gateway のプライベート API エンドポイントへの接続に関する問題を解決するにはどうすればよいですか?

最終更新日: 2022 年 2 月 25 日

Amazon 仮想プライベートクラウド (Amazon VPC) にある Amazon API Gateway プライベート API エンドポイントへの接続に問題があります。この問題をトラブルシューティングするにはどうすればよいですか?

簡単な説明

Amazon VPC の AWS リソースは、次のいずれかの理由でプライベート API エンドポイントに接続できないことがあります。

API で Amazon CloudWatch のロギングが有効化されている場合、エラーの原因を示すエラーメッセージが実行ログに表示されます。

ロギングがアクティブ化された後に API リクエストで CloudWatch Logs が生成されない場合、リクエストはエンドポイントに到達していません。API リクエストがエンドポイントに届かない場合は、プライベート API の呼び出し URL が正しくフォーマットされていることを確認してください

注意:別の AWS アカウントまたはオンプレミスネットワークの Amazon VPC など、外部クライアントからの接続の問題の場合:この問題は、API Gateway リソースポリシーが正しく設定されていないか、プライベート API エンドポイントの呼び出し URL の DNS 名が正しくないことが原因である可能性があります。

解決方法

エラーの原因を確認する

1.    プライベート REST API の CloudWatch のロギングをまだオンにしていない場合は、有効にします実行ログの設定を必ず行ってください。

ヒント:ロギング設定を構成するときは、次の操作を行います。
[ログレベル] で [情報] を選択します。
[リクエスト/レスポンスデータをすべてログ] も選択します。

2.    CloudWatch で REST API の実行ログを表示し、エラーの原因を特定します。API リクエストがエンドポイントに到達すると、次のいずれかの例のようなエラーメッセージが表示されます。

  • 「User: anonymous is not authorized to perform: execute-api:Invoke on resource:
  • Connection timed out」

ロギングをアクティブ化した後に API リクエストで CloudWatch Logs が生成されない場合は、プライベート API の呼び出し URL が正しくフォーマットされていることを確認してください。手順については、この記事の「ロギングのアクティブ化後に API リクエストで CloudWatch Logs が生成されない場合」セクションを参照してください。

詳細については、「CloudWatch Logs で API Gateway REST API エラーを見つける方法を教えてください」を参照してください。

「User: anonymous is not authorized to perform: execute-api:Invoke on resource:」のエラーを解決するには

1.    プライベート API エンドポイントの API Gateway リソースポリシーで、インターフェイス VPC エンドポイントまたはソース VPC からプライベート API エンドポイントへのトラフィックが許可されていることを確認します。リソースポリシーの例については、例: ソース VPC または VPC エンドポイントに基づいてプライベート API トラフィックを許可するを参照してください。

2.    VPC エンドポイントポリシーで、クライアントがプライベート API エンドポイントにアクセスできることを確認します。VPC エンドポイントポリシーの例については、「VPC エンドポイントポリシーの例」を参照してください。

API Gateway リソースポリシーをテストする方法については、次の記事「特定の IP アドレスのみに API Gateway REST API へのアクセスを許可する方法」の「リソースポリシーをテストする」セクションを参照してください。

重要:API のリソースポリシーを変更した場合は、API をデプロイして変更をコミットする必要があります。

「Connection timed out」エラーを解決する

Amazon VPC のセキュリティグループのルールが正しく設定されていることを確認します。

Amazon VPC のセキュリティグループをテストするには

プライベート API エンドポイントにリクエストを行っているクライアントから、次のコマンドを実行します。

重要: {public-dns-hostname} を、API の VPC エンドポイント ID を含むパブリック DNS ホスト名に置き換えます。{region} を、インターフェイス VPC エンドポイントが存在する AWS リージョンに置き換えます。

$ telnet {public-dns-hostname}.execute-api.{region}.vpce.amazonaws.com 443

接続がタイムアウトすると、Amazon VPC セキュリティグループのルールが正しく設定されません。

ヒント:接続がタイムアウトした場合は、次の点を確認してください。

  • リクエストしているリソースに、VPC エンドポイントの IP アドレス範囲またはセキュリティグループへの TCP ポート 443 アウトバウンドトラフィックを許可するセキュリティグループルールがある。
  • VPC エンドポイントに、リクエスト元リソースの IP アドレス範囲またはセキュリティグループからの TCP ポート 443 インバウンドトラフィックを許可するセキュリティグループルールがある。

詳細については、「セキュリティグループを使用してリソースへのトラフィックを制御する」を参照してください。

ロギングがアクティブ化された後に API リクエストで CloudWatch Logs が生成されない場合

1.    プライベート API エンドポイントの API Gateway リソースポリシーが正しく設定されていることを確認します。詳細については、この記事の「User: anonymous is not authorized to perform: execute-api:Invoke on resource:」エラーを解決するのセクションを参照してください。

2.    プライベート API の呼び出し URL が正しくフォーマットされていることを確認します。

注: 正しい形式は、VPC エンドポイントに対してプライベート DNS がアクティブ化されているかどうかによって異なります。プライベート DNS がアクティブ化されていない場合は、エンドポイント固有のパブリック DNS ホスト名を使用してプライベート API エンドポイントにアクセスする必要があります。プライベート DNS がアクティブ化されている場合は、プライベート DNS 名を使用してプライベート API エンドポイントにアクセスする必要があります。詳細については、「プライベート API を呼び出す方法」を参照してください。

プライベート API エンドポイントのドメインが VPC エンドポイントの IP アドレスに正しく解決されることをテストするには

1.    プライベート API エンドポイントにリクエストを行っているクライアントから、次の nslookup コマンドを実行します。

重要: {restapi-id} を、プライベート API の ID に置き換えます。{region} を、プライベート API エンドポイントが存在する AWS リージョンに置き換えます。

$ nslookup {restapi-id}.execute-api.{region}.amazonaws.com

正常な出力には、VPC エンドポイントのプライベート IP アドレスが表示されます。

2.    次の nslookup コマンドを実行します。

重要: {public-dns-hostname} を、API の VPC エンドポイント ID を含むパブリック DNS ホスト名に置き換えます。{region} を、インターフェイス VPC エンドポイントが存在する AWS リージョンに置き換えます。

$ nslookup {public-dns-hostname}.execute-api.{region}.vpce.amazonaws.com

正常な出力には、VPC エンドポイントのプライベート IP アドレスが表示されます。

3.    各コマンドの出力の IP アドレスを比較します。各コマンド出力の IP アドレスが一致すれば、セットアップは期待どおりに動作しています。

注意:VPC エンドポイントのプライベート DNS は、Amazon VPC コンソールで次の操作を行っていつでもアクティブ化できます。
[エンドポイント] ペインで、インターフェイス VPC エンドポイントを選択します。
[アクション] を選択します。
[Modify Private DNS names] を選択します。
[Enable Private DNS Name] チェックボックスをオンにします。次に、[Save Changes] を選択します。
[Modify Private DNS names] を選択します。