AWS lambda 间歇性超时连接到 S3

AWS lambda intermittently times out connecting to S3

我是 AWS 的新手。

我有一个用 Java 编写的 Lambda,它处理来自 SQS 队列的 S3 事件。事件由在 S3 存储桶的指定目录中创建文件触发。

Lambda 对从队列接收到的单个 S3 事件的处理(即创建一个文件)按预期工作。

如果我同时创建一批 5 到 10 个文件,Lambda 的多个实例(通常数量在 3 到 5 个之间)将被启动以处理结果事件。有些会毫无问题地工作,但其中至少有一个(有时不止一个)会失败。该行为(有点令人沮丧)不一致。

在执行失败的 Lambda 期间,第一个错误发生在它尝试连接到 AWS Secrets Manager 时:

com.amazonaws.http.conn.ssl.SdkTLSSocketFactory - connecting to secretsmanager.ap-southeast-2.amazonaws.com/<ip>:<port>
c.a.http.conn.ClientConnectionManagerFactory - java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
... stack trace...
Caused by: org.apache.http.conn.ConnectTimeoutException: Connect to secretsmanager.ap-southeast-2.amazonaws.com:<port> [secretsmanager.ap-southeast-2.amazonaws.com/<ip>, secretsmanager.ap-southeast-2.amazonaws.com/<ip>, secretsmanager.ap-southeast-2.amazonaws.com/<ip>] failed: connect timed out
... stack trace...
Caused by: java.net.SocketTimeoutException: connect timed out

Lambda 又重试了几次连接,但总是失败。 Lambda 代码捕获异常并尝试进行一些清理,但随后也无法连接到 S3 存储桶:

com.amazonaws.http.conn.ssl.SdkTLSSocketFactory - Connecting socket to <s3 bucket>.s3.ap-southeast-2.amazonaws.com/<ip>:<port> with timeout 10000
c.a.http.conn.ClientConnectionManagerFactory - java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
... stack trace...
Caused by: org.apache.http.conn.ConnectTimeoutException: Connect to <s3 bucket>.s3.ap-southeast-2.amazonaws.com:<port> [<s3 bucket>.s3.ap-southeast-2.amazonaws.com/<ip>] failed: connect timed out
... stack trace...
Caused by: java.net.SocketTimeoutException: connect timed out

由于这种行为不一致,我不确定确定问题所在的方法 - 我无法弄清楚为什么某些 Lambda 实例会在其他 运行 同时完全失败时间工作没有任何问题。

我在我的 Java 项目中使用来自 com.amazonaws 的以下库:

aws-lambda-java-core: 1.2.0
aws-java-sdk-s3: 1.11.714
aws-java-sdk-events: 1.11.714
aws-java-sdk-secretsmanager: 1.11.718
aws-java-sdk-sqs: 1.11.719

在此先感谢您的帮助。

问题是网络问题 - Lambda 的 VPC 使用的私有子网之一有一个配置错误的路由 table,该路由被分配给了一个不存在的 NAT 网关。

添加正确的 NAT 网关后,Lambda 将按预期运行。

非常感谢 John Rotenstein 帮助诊断此问题。