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

最終更新日: 2022 年 9 月 22 日

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

簡単な説明

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

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

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

注意:接続の問題は、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」エラーを解決する

1.    API Gateway execute-api VPC エンドポイントが VPC に存在することを確認します。また、エンドポイントがプライベート API と同じ AWS リージョンにあるかどうかも確認してください。詳細については、「API Gateway execute-api のインターフェイス VPC エンドポイントの作成」を参照してください。

2.    プライベート API エンドポイントを呼び出すクライアントが同じ VPC に存在するか、VPC エンドポイントを持つ VPC にアクセスできることを確認します。traceroute ツールを使用してこれをテストできます。

注意:プライベート API には、VPC 内のクライアント、または VPC にネットワーク接続しているクライアントからアクセスできます。

traceroute をインストールするには、以下のコマンドを実行します。

Amazon Linux の場合:

$ sudo yum install traceroute

Ubuntu の場合:

$ sudo apt-get install traceroute

traceroute を使用して接続をテストするには:

$ sudo traceroute -n -T -p 443 <VPC-endpoint IP-address>

引数 -T -p 443 -n は、ポート 443 で TCP ベースのトレースを実行することを意味します。

3.    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 エンドポイントを選択します。
[Actions] (アクション) を選択します。
[Modify Private DNS names] (プライベート DNS 名を変更) を選択します。
[Enable Private DNS Name] (プライベート DNS 名を有効にする) チェックボックスをオンにします。次に、[Save Changes] を選択します。
[Modify Private DNS names] (プライベート DNS 名を変更) を選択します。