VPCにアタッチしたLambdaからVPCエンドポイントを利用してAPI Gatewayにアクセスする方法

0

APIGatewayのWebSocketAPIに統合したLambda関数(node.js)を、RDSインスタンスを配置しているプライベートサブネットにアタッチ、VPCからAPIGatewayにアクセスするために、VPCエンドポイントを設定しています。APIGatewayに接続したクライアントにレスポンスを返却するために、ApiGatewayManagementApiのpostToConnectionを実行すると、ForbiddenExceptionが発生し正常に実行できません。 VPCにアタッチしたLambdaから、VPCエンドポイントを利用してAPI Gatewayにアクセスする方法をご教授ください。。 ■設定内容 (1)Lambda関数にRDSを配置したVPCプライベートサブネットをアタッチ (2)上記VPCにエンドポイントを作成(サービス名:com.amazonaws.ap-northeast-1.execute-api) (3)Lambda関数からAPIGatewayを実行(以下該当ロジック抜粋) const AWS = require('aws-sdk'); exports.handler = async (event, context) => { const callbackAPI = new AWS.ApiGatewayManagementApi({ apiVersion: '2018-11-29', endpoint: event.requestContext.domainName + '/' + event.requestContext.stage, }); await callbackAPI .postToConnection({ ConnectionId: event.requestContext.connectionId, Data: JSON.stringify('コールバックするデータ') }) .promise(); }

1 Risposta
0

ご要望は、「インターネットを介さずに、プライベートサブネットに設置された Lambda から VPC エンドポイントを経由し API Gateway の Websocket API にアクセスされたい」ものと認識しております。

各所資料を確認し検証しましたところ、お客様のご期待に添うご案内とならず恐れ入りますが、Websocket API にVPCエンドポイントを利用して接続することはできません。

当方でお客様と同等となる環境を作成(VPC エンドポイントの プライベート DNS 名 が有効化されている状態で、プライベートサブネットに設置された Lambda から APIGateway に postToConnection を実行)し検証を行ったところ、お客様と同等の事象(ForbiddenException の発生)が確認できました。

これは、VPC エンドポイントの設定値「プライベート DNS 名」が有効化される事で、Lambda 関数内から実行されるすべての API Gateway へのアクセスが VPC エンドポイントにルーティングされるためです。
この際、パブリックインターネットを使わないプライベート接続が使用されるため、 API Gateway では Amazon VPC 内からのみ呼び出せるプライベート API のみがサポートされています [1] 。
しかしながら、現時点では Websocket API をプライベートAPI にすることはできないため [2] [3]、パブリックAPI となる Websocket API へのVPCエンドポイントのルーティングは許可されておりません。
そのため、ForbiddenException が発生します。

上記より、お客様のご要望「インターネットを介さずに、プライベートサブネットに設置された Lambda から Lambda 用に設定された VPC エンドポイントを経由し API Gateway の Websocket API にアクセスされたい」については、実現ができません。
ご期待に添える回答でなく恐れ入りますが、ご理解賜れますと幸いです。

既にお客様においてはご存じかとも存じますが、もしお客様がインターネットに接続する事を許容可能であれば、NAT Gateway を Lambda が設置されているプライベートサブネットに繋げることで、エラーを回避できます。
具体的には、以下の手順となりますのでよろしければご確認ください。

1.NAT Gateway を Lambda と同じ VPC のパブリックサブネットに作成する。  
    手順についての詳細は参考資料 [4] をご参照ください。  
2.Lambda が配置される VPC プライベートサブネットのルートテーブルを変更。  
    当該ルートテーブル内、送信先 0.0.0.0/0 に対し、上記 NAT Gateway がルーティングされるようにルートを追加する。  
    手順についての詳細は参考資料 [5] をご参照ください。  
3.VPCエンドポイントの プライベート DNS 名 を無効化する(これにより、Websocket API へのリクエストが VPC エンドポイントを経由しない様になります。)
    手順についての詳細は下記の通りです。  
    1.Amazon VPC コンソールで、エンドポイントページ(https://console.aws.amazon.com/vpc/home?#Endpoints )を開きます。  
    2.使用している VPC エンドポイントを選択します。  
    3.「アクション」、「プライベート DNS 名を変更」の順に選択します。  
    4.「プライベート DNS 名を有効化」で、「このエンドポイントで有効にする」 チェックボックスをオフにします。  
    5.「変更を保存」を押下してください。

ただし、プライベート DNS 名 を無効化した場合、VPCエンドポイントを経由してアクセスしていたプライベートREST APIがアクセスできなくなる可能性があることに注意が必要です。
その場合の対処法については、参考資料 [6] をご参照ください。
(参考資料 [6] 内「プライベート DNS 名を使用してプライベート API を呼び出す」 については、この場合ご使用いただけませんので、ご注意ください)。

この手順がお役に立てば幸いです。

■ 参考資料

[1] Fix 403 Forbidden errors when connecting to API Gateway APIs from a VPC | AWS re:Post
- https://repost.aws/knowledge-center/api-gateway-vpc-connections#
---- 引用文 ----
all requests from the VPC to API Gateway APIs resolve to that interface VPC endpoint.
[中略]
The API call is then routed to the public API through the VPC endpoint instead of routing it through the internet. Because VPC endpoints can route traffic only to private APIs, the result is an HTTP 403 error.
----------------

[2] Create API GW Websocket API that is only accessible from within a VPC. | AWS re:Post
- https://repost.aws/questions/QUu06K3qqCTx6ymyhcl0lR-w/create-api-gw-websocket-api-that-is-only-accessible-from-within-a-vpc
---- 引用文 ----
API Gateway Websockets APIs do not support private APIs.
-----------------

[3] Amazon API Gateway のプライベート REST API - プライベート API に関する考慮事項 
- https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-private-apis.html#apigateway-private-api-considerations
---- 引用文 ----
プライベート API に関する考慮事項
以下の考慮事項は、プライベート API の使用に影響する可能性があります。  
  REST API のみがサポートされています。  
-----------------

[4] NAT ゲートウェイの使用 - NAT ゲートウェイを作成する 
- https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/nat-gateway-working-with.html#nat-gateway-creating

[5] サブネットのルートテーブルを変更する - ルートテーブルのルートの追加と削除 
- https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/WorkWithRouteTables.html#AddRemoveRoutes

[6] プライベート API の呼び出し 
- https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-private-api-test-invoke-url.html
AWS
YA
con risposta 2 mesi fa

Accesso non effettuato. Accedi per postare una risposta.

Una buona risposta soddisfa chiaramente la domanda, fornisce un feedback costruttivo e incoraggia la crescita professionale del richiedente.

Linee guida per rispondere alle domande