API Gateway のプライベート API エンドポイントへの接続に関する問題をトラブルシューティングするにはどうすればよいですか?

最終更新日: 2020 年 10 月 28 日

「禁止されています」というエラーが発生したり、Amazon Virtual Private Cloud (Amazon VPC) の Amazon API Gateway のプライベート API エンドポイントに接続する際にさまざまな問題が発生します。これらの問題を解決するにはどうすればよいですか?

簡単な説明

Amazon VPC には、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスや AWS Lambda 関数などの AWS リソースが存在する可能性があります。これらのリソースがプライベート API エンドポイントに接続できない場合は、次の理由が考えられます。

外部クライアント (別の AWS アカウントの Amazon VPC やオンプレミスネットワークなど) からプライベート API エンドポイントに接続できない場合は、リソースポリシーや使用されている DNS 名に問題がある可能性があります。

解決方法

まだAPI 実行ログを設定していない場合は、設定します。ログ記録の設定を構成する場合は、[ログレベル] で [情報] を選択します。[リクエスト/レスポンスをすべてログ] も選択します。これらの設定を使用して生成されたログは、問題の原因をさらにトラブルシューティングするのに役立ちます。

注: プライベート API エンドポイントへのアクセスを試みた後にログが入力されていない場合は、リクエストがエンドポイントに到達しなかった可能性があります。プライベート API の呼び出し URL が正しくフォーマットされていることを確認してください。

リソースポリシー

アタッチされた API Gateway リソースポリシーが正しく設定されていない状態でプライベート API エンドポイントにアクセスしようとすると、「禁止されています」というエラーメッセージが表示されます。

User: anonymous is not authorized to perform: execute-api:Invoke on resource:...」というエラーメッセージは、インターフェイス VPC エンドポイントからプライベート API エンドポイントへのトラフィックを許可するように、リソースポリシーが正しく設定されていない場合に発生します。

これらのエラーを解決するには、アクセスのために正しく設定されたリソースポリシーの作成とアタッチをしてください。これらのリソースポリシーの例をガイドラインとして使用します。

リソースポリシーを変更したら、変更を有効にするために API を再デプロイします。

VPC エンドポイントポリシー

User: anonymous is not authorized to perform: execute-api:Invoke on resource:...」エラーメッセージは、インターフェイス VPC エンドポイントで VPC エンドポイントポリシーを使用し、ポリシーによってアクセスが制限されている場合にも発生します。

VPC エンドポイントポリシーで、リクエストを実行しているクライアントによるプライベート API へのアクセスが許可されていることを確認します。詳細については、「VPC エンドポイントポリシーの例」を参照してください。

VPC セキュリティグループ

接続がタイムアウトしました」エラーは、Amazon VPC のセキュリティグループのルールが正しく設定されていないことを示している可能性があります。

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

注: vpce-id を VPC エンドポイント ID に置き換えます。リージョンは、インターフェイス VPC エンドポイントの AWS リージョンに置き換えます。

$ telnet vpce-id.execute-api.region.vpce.amazonaws.com 443

接続がタイムアウトした場合は、VPC 構成をチェックして、以下を確認します。

  • リクエストを実行する AWS リソースのセキュリティグループが正しく設定されている。インターフェイス VPC エンドポイントの IP アドレス範囲またはセキュリティグループへの TCP ポート 443 のアウトバウンドトラフィックを許可するセキュリティグループルールが必要です。
  • インターフェイス VPC エンドポイントのセキュリティグループが正しく設定されている。リクエストを実行する AWS リソースの IP アドレス範囲またはセキュリティグループからの TCP ポート 443 のインバウンドトラフィックを許可するルールが必要です。

詳細については、「セキュリティグループの使用」を参照してください。

URL のフォーマット/プライベート DNS を呼び出す

プライベート API を呼び出すには、呼び出し URL が正しくフォーマットされている必要があります。正しいフォーマットは、インターフェイス VPC エンドポイントに対してプライベート DNS が有効になっているかどうかによって異なります。

無効なプライベート DNS の場合は、エンドポイント固有のパブリック DNS ホスト名を使用して、プライベート API にアクセスします。

注: インターフェイス VPC エンドポイントのプライベート DNS は、Amazon VPC コンソールでいつでも有効にできます。[エンドポイント] ペインで、インターフェイス VPC エンドポイントを選択します。[アクション]、[プライベート DNS 名の変更] の順に選択します。[プライベート DNS 名を有効にする] のチェックボックスをオンにして、[プライベート DNS 名の変更] を選択します。

有効なプライベート DNS の場合は、プライベート DNS 名を使用してプライベート API にアクセスします。

テストを実行し、インターフェイス VPC エンドポイントの IP アドレスに対してプライベート API エンドポイントのドメインが正しく解決されたことを確認します。プライベート API へのアクセスをリクエストしているクライアントから次のコマンドを実行します。

注: restapi-id をプライベート API の ID に置き換えます。リージョンをプライベート API の AWS リージョンに置き換えます。

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

出力は、インターフェイス VPC エンドポイントのプライベート IP アドレスである必要があります。

次に、このコマンドを実行します。

注: vpce-id を VPC エンドポイント ID に置き換えます。リージョンは、インターフェイス VPC エンドポイントの AWS リージョンに置き換えます。

$ nslookup vpce-id.execute-api.region.vpce.amazonaws.com

各コマンドの出力の IP アドレスを比較します。同じであれば、想定どおりにインターフェース VPC エンドポイントを使用してプライベート API エンドポイントにアクセスしていることになります。

外部アクセス

別の AWS アカウントの Amazon VPC からプライベート API にアクセスするには、以下の手順を実行します。

  1. 別のアカウントにインターフェイス VPC エンドポイントを作成します。
  2. プライベート API にリソースポリシーを作成してアタッチします。このポリシーでは、別のアカウントの VPC エンドポイント ID または VPC ID からの着信トラフィックを許可する必要があります。

別のアカウントの Amazon VPC の (またはそのインターフェイス VPC エンドポイントを使用する) リソースは、エンドポイント固有のパブリック DNS ホスト名を使用してプライベート API にアクセスできます。

注: 別のアカウントのプライベート API とインターフェイス VPC エンドポイントは、同じ AWS リージョンに存在する必要があります。別のリージョンからプライベート API にアクセスするには、VPC ピアリング接続が必要です。

オンプレミスネットワークから、AWS Direct Connect を使用して VPC に接続します。その後、エンドポイント固有のパブリック DNS ホスト名を使用して、プライベート API にアクセスできます。