インターフェイス VPC エンドポイントを使用して、別のアカウントにある API Gateway プライベート REST API にアクセスするにはどうしたらよいですか?
インターフェイス仮想プライベートクラウド (VPC) エンドポイントを使用して、別の AWS アカウントにある Amazon API Gateway プライベート REST API にアクセスしたいと考えています。
簡単な説明
インターフェイス VPC エンドポイントを使用して、別の AWS アカウントにある API Gateway プライベート REST API にアクセスするには、次の手順を実行します:
- 1 つ目のアカウント (アカウント A) の Amazon Virtual Private Cloud (Amazon VPC) にインターフェイスエンドポイントを作成します。
- 2つ目のアカウント (アカウント B) に API Gateway プライベート REST API を作成します。
- インターフェイスエンドポイントによる API の呼び出しを許可するプライベート REST API の リソースポリシー を設定します。
- プライベート REST API のメソッドを設定します。
- プライベート REST API をデプロイします。
- アカウント A からプライベート REST API を呼び出し、セットアップをテストします。
注: API Gateway のプライベート REST API と VPC エンドポイントは、同じ AWS リージョンに配置する必要があります。
解決策
あるアカウント (アカウント A) の Amazon VPC にインターフェイスエンドポイントを作成する
新しいインターフェイス VPC エンドポイントを作成する
アカウント A で「VPC 内の API Gateway 用のインターフェイス VPC エンドポイントを作成する」の手順を実行します。
重要:[ポリシー]** で [フルアクセス] を選択します**。VPC エンドポイントポリシーを使用して、API ID でエンドポイントへのアクセスを制限することをおすすめします。API Gateway リソースポリシーを使用して、プリンシパルでエンドポイントへのアクセスを制限することもおすすめします。詳細については、「最小特権アクセス許可を適用する」を参照してください。
インターフェイスエンドポイントを作成する際、次のアクションを実行します。
- 異なるアベイラビリティーゾーンにある複数のサブネットを選択することをおすすめします。複数のアベイラビリティーゾーンにわたるサブネットを設定すると、潜在的なアベイラビリティゾーンの障害に対し、インターフェイスエンドポイントの耐性を向上できます。
- プライベート DNS を有効にし、パブリック DNS またはプライベート DNS を使用してプライベート REST API に接続します。
注: インターフェイス VPC エンドポイントでプライベート DNS を有効にすると、VPC から API Gateway パブリック API にアクセスできなくなります。詳細については、「VPC から API Gateway API に接続する際、HTTP 403 Forbidden エラーが発生する理由を知りたいです」を参照してください。 - セキュリティグループには、VPC 内の IP アドレス範囲から、TCP ポートでの 443 インバウンド HTTPS トラフィックを許可するルールが必要です。ルールは、VPC 内の別のセキュリティグループのものでもかまいません。
注: これらの要件のいずれかを満たすセキュリティグループがない場合は、VPC 用の新しいセキュリティグループを作成します。セキュリティグループを指定しない場合、デフォルトのセキュリティグループがエンドポイントのネットワークインターフェイスに関連付けられます。
インターフェイスエンドポイントの VPC エンドポイント ID を取得
インターフェイスエンドポイントを作成すると、VPC エンドポイント ID が表示されます。新しいインターフェイスエンドポイントの VPC エンドポイント ID をコピーします (例: vpce-1a2b3c456d7e89012)。
注: プライベート REST API を作成および設定する際、この VPC エンドポイント ID を使用します。
インターフェイスエンドポイントのパブリック DNS 名を取得する
Amazon VPC コンソールに [エンドポイント] ページが表示されます。[エンドポイント] ページの [詳細]タブで、[DNS 名] 列に表示されるインターフェイスエンドポイントのパブリック DNS 名をコピーします。(例: vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com)
2 番目のアカウント (アカウント B) に API Gateway のプライベート REST API を作成する
- アカウント B で API Gateway コンソールを開きます。
- [API の作成] を選択します。
- [API タイプを選択] で、[REST API プライベート] の [ビルド] を選択します。
- [API の詳細] に次の情報を入力します。
[API 名] に名前を入力します。
(オプション) [Description] には説明を入力します。
[エンドポイントタイプ] を [プライベート] に設定します。
[VPC エンドポイント ID] に該当するインターフェイスエンドポイント ID を入力します。次に、[追加] を選択します。
注: インターフェイスエンドポイントをプライベート REST API に関連付けると、API Gateway は新しい Amazon Route 53 のエイリアスレコードを生成します。Route53 のエイリアスを使用すると、プライベート API にアクセスできます。 - [API の作成] を選択します。
詳細については、「プライベート API を作成する」を参照してください。
プライベート REST API 用のリソースポリシーを設定し、インターフェイスエンドポイントがAPI を呼び出せるようにする
- API Gateway コンソールのナビゲーションペインで、該当する API の [リソースポリシー] を選択します。
- [リソースポリシー] ページで、次のリソースポリシー例をテキストボックスに入力します。
**注:**vpce-1a2b3c456d7e89012 は、実際のインターフェイスエンドポイント ID に置き換えます。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "execute-api:/*/*/*", "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpce-1a2b3c456d7e89012" } } }, { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "execute-api:/*/*/*" } ] }
詳細については、「プライベート API 用のリソースポリシーを設定する」を参照してください。
プライベート REST API 用のメソッドを設定する
- API Gateway コンソールのナビゲーションペインで、API の [リソース] を選択します。
- [リソース] ペインで [アクション] を選択し、[メソッドの作成] を選択します。
- / resource ノードのドロップダウンリストで ANY を選択し、チェックマークアイコンを選択します。
- / - ANY - Setup ペインの **[統合タイプ]**で **[モック]**を選択します。
注: モック統合は、到達した任意のリクエストに応答します。 - [保存] を選択します。
詳細については、「API Gateway における REST API 用のメソッド」を参照してください。
プライベート REST API をデプロイする
- API Gateway コンソールの [リソース] ペインで [アクション]を選択し、[API をデプロイ] を選択します。
- [API をデプロイ] ダイアログボックスに次の情報を入力します。
デプロイステージで、[New Stage] を選択します。
[ステージ名] に名前を入力します。(例: dev、test) - [デプロイ] を選択します。
- [ステージエディタ] ペインで次のメッセージを探します: **プライベート DNS が有効な場合は次の URL を使用する:**プライベート REST API の呼び出し URL をコピーします。
注: プライベート REST API の呼び出し URL を使用して設定をテストします。
詳細については、「プライベート API をデプロイする」を参照してください。
アカウント A からプライベート REST API を呼び出し、設定をテストする
- アカウント A で、インターフェイスエンドポイントと同じ VPC 内で Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを起動します。
**重要:**インターフェイスエンドポイントに関連付けたセキュリティグループを選択します。 - Amazon EC2 インスタンスに接続します。
注: EC2 インスタンスでは、AWS アカウントに料金が発生する場合があります。テスト用インスタンスを作成する場合は、追加の請求を防ぐために、テストの完了後はインスタンスを破棄してください。 - EC2 インスタンスのコマンドラインで次の curl コマンドのいずれかを実行し、アカウント B のプライベート REST API を呼び出します。
注: 詳細については、「エンドポイント固有のパブリック DNS ホスト名を使用してプライベート API を呼び出す」を参照してください。
プライベート DNS 名
次のコマンドを実行します。
注: https://a1bc234d5e.execute-api.region.amazonaws.com/stage-name をプライベート API の呼び出し URL に置き換えます。このコマンドは、インターフェイスエンドポイントでプライベート DNS を有効にした場合にのみ機能します。詳細については、「プライベート DNS 名を使用してプライベート API を呼び出す」を参照してください。curl -i https://a1bc234d5e.execute-api.region.amazonaws.com/stage-name
Route53 エイリアス
次のコマンドを実行します。
注: 実際のものでそれぞれ、a1bc234d5e API の IDvpce-1a2b3c456d7e89012 をインターフェイスエンドポイント ID、region を API のリージョンに置き換えます。stage-name を実際のプライベート API をデプロイしたステージの名前に置き換えます。詳細については、「Route53 のエイリアスを使用してプライベート API を呼び出す」を参照してください。curl -i https://a1bc234d5e-vpce-1a2b3c456d7e89012.execute-api.region.amazonaws.com/stage-name
ホストヘッダー付きのパブリック DNS 名
次のコマンドを実行します。
注: 実際のものでそれぞれ、vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com をインターフェイスエンドポイントのパブリック DNS 名に、stage-name をプライベート API をデプロイしたステージの名前に置き換えます。a1bc234d5e.execute-api.region.amazonaws.com をプライベート API の呼び出し URL に置き換えます。curl -i https://vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com/stage-name -H "Host: a1bc234d5e.execute-api.region.amazonaws.com"
x-apigw-api-id ヘッダーを含むパブリック DNS 名
次のコマンドを実行します。
注: 実際のものでそれぞれ、vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com をインターフェイスエンドポイントのパブリック DNS 名に、stage-name をプライベート API をデプロイしたステージの名前に置き換えます。a1bc234d5e を実際の API の ID に置き換えます。curl -i https://vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com/stage-name -H "x-apigw-api-id:a1bc234d5e" - コマンド出力を確認します。接続が成功すると、API Gateway は 200 OK 応答を返します。
関連情報
API Gateway のプライベート API エンドポイントへの接続時に発生する問題をトラブルシューティングする方法を教えてください

