VPC内のLambdaからのSQSタイムアウト
RDSやAWSDocumentDBなどの保護されたリソースと通信するためにVPC上にある必要があるLambdaがあります。また、サードパーティAPIへの呼び出しについては、外の世界を見ることができる必要があります。これを行うために、VPCウィザードを使用して、パブリックサブネットとプライベートサブネットの両方を持つVPCを作成しました。ウィザードは、インターネットゲートウェイも作成して接続しました。
この後、Lambda、RDSインスタンス、DocumentDbクラスターをVPCに接続しました。それ以来、NodeJSaws-sdkを使用してラムダ内からSQSキューと通信することができませんでした。
以下のポイントを読んで実装したことを付け加えたいと思います。AWSLambda:VPCアクセスでLambda関数からSQSキューにアクセスできませんが、まだ接続できません。
これが私が持っているものです:
VPC:
- VPCには、パブリックサブネットとプライベートサブネット、およびIGゲートウェイがあります。ウィザードを使用して作成しました。私はここでの基盤の多くを理解していません。
- VPC Config(リンクです。まだ埋め込むことができません。)
- CIDR-ウィザードは最後のブロックを除くすべてを作成しました。私がこれを正しく行ったかどうか、またはウィザードが少なくとも1つを作成させ、IPの重複を避けるためにそれを行ったので、それが重要であるかどうかはわかりません。
- これは開発/プロトタイププロジェクトであるため、VPCに接続されているセキュリティグループは「ワイドオープン」です。すべてのインバウンドとアウトバウンドが許可されます。
- 何が役立つかわからないので、他にどのVPC構成を表示するか教えてください
サービスエンドポイント:
- 上記のリンク先の記事に従って、SQSのサービスエンドポイントを作成してみました。これが私が持っているものです:endpoint config
- ラムダのセクションで、これをどのように消費しているかについて詳しく説明します。
- エンドポイントはVPCに接続されています
ラムダ:
- ここに示すように、ラムダをVPCに接続しています。
- これにより、公開されているサードパーティのAPIや保護されているリソースと話すことができます。SGを大きく開いても、ラムダがSQSと通信できるようになることを期待していましたが、タイムアウトが発生し続けます。
- エンドポイントのLambdaで使用するURLがわかりません。ここでの例:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-sending-messages-from-vpc.html まだ地域のエンドポイントを使用しているようです。
コード
コード内からのSQS呼び出しは次のようになります。
-
const {SQS} = require('aws-sdk'); // Constructor Init const sqs = new SQS({ apiVersion: '2012-11-05', endpoint: 'https://sqs.us-west-2.amazonaws.com', // not sure if this is 'invoking' the vpc endpoint or not region: 'us-west-2' }); // Send message await sqs.sendMessage({ MessageBody: 'Test body', QueueUrl: 'https://sqs.us-west-2.amazonaws.com/<rest of URI>', MessageAttributes: {...someAttrs} }).promise();
-
助けに感謝します、私が提供できる他の情報を教えてください。
ありがとう!
**編集**
また、この問題全体を回避するために、SQSをラムダデスティネーションとして使用する道を歩み始めたことにも言及する必要があります。これはメッセージをターゲットキューに挿入しますが、私のユースケースでは拡張できない可能性があります。実際の質問とは完全に関係がないので、必要に応じてさらに詳しく説明できます。
**編集8/31/20 **
すべての回答に感謝し、それは大きな助けとなり、私は解決に至りました。この投稿を見つけた他の人には、最初に見ることだと言います。
https://www.youtube.com/watch?v=JcRKdEP94jM
これは、ラムダインターネットアクセスを提供することを特に対象としていますが、IGとNatsをサブネットにマッピングするプロセスを経ているため、これらすべてを開始する前に見つけてほしいものです。これは、vpcを誤って構成していた場所です。このビデオでは、VPC全体を再作成しましたが、ドットの接続が非常にクリーンで簡単になりました。10/10をお勧めします。
再度、感謝します!
回答
これについての私の勘は、ネットワーク構成のどこかに欠落しているルールがあるということです-パケットはSQSに向かって、または戻る途中でドロップされます(どちらもホップごとに考える必要があります)。
頭に浮かぶ3つのこと:
- ルーティング:サブネットとルーティングテーブルに、SQSエンドポイントがあるサブネットからプライベートサブネットにパケットを戻すための適切なルートがあることを確認します。
- セキュリティグループ-関係する各SGを注意深く見てください。SQSは、たとえば、SQSへのアクセスを制限するSG内にある場合があります。
- ネットワークACL-これらはステートレスであるため、両側が開いていることを確認する必要があります。また、ほとんどの場合、リクエスターに戻るにはランダムなポート番号が関係することに注意してください。
幸運を!
AWS Lambda関数は、VPCのプライベートサブネットに接続する必要があります。
Amazon SQSはインターネット上に存在するため、Lambda関数にはSQSエンドポイントにアクセスする方法が必要です。
オプション1:VPCエンドポイント
AアマゾンSQSのためのVPCエンドポイントは、インターネットへのアクセスを必要とせずに、VPCとSQSエンドポイント間の直接リンクを提供することができます。作成されると、VPCはVPCエンドポイントを介してSQSリクエストを自動的に送信します。これは素晴らしくシンプルなオプションです。
オプション2:NATゲートウェイ
インターネットアクセスを必要とするプライベートサブネットに追加のリソースがある場合は、パブリックサブネットにNATゲートウェイを配置することを検討できます。プライベートサブネットには、インターネット行きのトラフィック(0.0.0.0/0)をNATゲートウェイに転送するルートテーブルエントリが必要です。
追加料金が適用されます。
オプション3:ラムダデスティネーション
Lambda関数がLambdaDestinationを介してSQSと正常に通信している場合、これは優れたオプションのように思えます。試したことはありませんが、LambdaサービスがVPCやインターネットを経由せずに出力をSQSに直接送信する責任があるようです。これが機能している場合は、引き続き使用することを強くお勧めします。この方法を使用しても、スケーリングの問題は認識されません。ただし、これはLambdaへの非同期呼び出しに対してのみ機能し、たとえば、関数を同期的に呼び出したり、[テスト]ボタンを押したりした場合には機能しないことに注意してください。