web-dev-qa-db-ja.com

AWS LambdaからSMTPサーバーへの接続

AWS Lambda関数で、nodemailerを使用してAmazon SES SMTPサーバー(ポート465)に接続しようとすると、JavaScriptコードがタイムアウトします。ただし、スクリプトをローカルで実行した場合、スクリプトは正常に機能します。これは、SMTPサーバーへのラムダダイヤルアウトの問題か、SMTPサーバーがラムダの接続をブロックしていることが原因であると考えます-前者が問題であると思います。

Cloudfrontディストリビューションの背後にあるファイアウォールを使用していますが、これは着信SES接続または発信ラムダ関数に適用されているとは思いません。 VPCでは、インスタンスにインターネットゲートウェイが接続されていることがわかります。セキュリティグループの送信接続では、すべてのプロトコルが0.0.0.0/0にアクセスできますが、ACLは、すべての受信/送信接続を許可および拒否するという点で奇妙に見えます。

enter image description here

enter image description here

VPCでは、6つのサブネットが一覧表示されていますが、これらのサブネットがグランドスキームで正確に何をしているのかはわかりません。

enter image description here

ログでは、Task timed out after 6.01 seconds

ハングアップの場所に関する詳細情報を取得するにはどうすればよいですか?

5
iRyanBell

これは予想通りです。

VPCのLambda関数は、インターネットゲートウェイを使用してインターネット(標準サービスAPIを含む)と通信できません。これは、インターネットゲートウェイには内部デバイスに関連するパブリックIPアドレスが必要であるためです。パブリックサブネット(デフォルトルートがインターネットゲートウェイである)上にいるだけでは十分ではありません。

重要

Lambda関数にインターネットアクセスが必要な場合は、パブリックサブネットまたはインターネットアクセスのないプライベートサブネットにアタッチしないでください。代わりに、NATインスタンスまたはAmazon VPC NATゲートウェイを介してインターネットにアクセスできるプライベートサブネットにのみ接続してください。

https://docs.aws.Amazon.com/lambda/latest/dg/vpc.html

A NATデバイス-通常は NATゲートウェイ -が必要です。ただし、問題のサービスが VPCエンドポイント をサポートしている場合を除きます(現在SESがサポートしています)しない)。

NATゲートウェイをパブリックサブネットに配置し(インターネットゲートウェイを使用してインターネットにアクセスできるようにするため)、1つ以上のプライベートサブネットを作成して、デフォルトルートがNATゲートウェイ。

NATゲートウェイは、同じ目的に特化したEC2インスタンスである NATインスタンス の新しい代替手段です。これは、以前は必要な=を提供する唯一の方法でしたNATサービス。AWSによって管理され、フォールトトレラントなNATゲートウェイとは異なり、a NATインスタンスは、潜在的な単一障害点(ただし、関連コストが低くなります)。

または、他のVPCリソースを必要としない場合は、Lambda関数をVPCから移動できます。

ルールは順番に処理されるため、すべて許可およびすべて拒否のネットワークACLは正常です。最後のルールは、許可ルールが削除された場合に適用されるデフォルトの動作です。他のルールを削除した場合にNACLが機能しない理由を思い出させるのは、主に視覚的な手掛かりです。それ以外の場合、ユーザーは明示的に何かを拒否しなかったので、それを許可する必要があると想定するかもしれません。

各ネットワークACLには、ルール番号がアスタリスクであるルールも含まれています。このルールにより、パケットが他の番号付きルールのいずれにも一致しない場合、そのパケットは確実に拒否されます。このルールを変更または削除することはできません。

https://docs.aws.Amazon.com/vpc/latest/userguide/vpc-network-acls.html

10