AWS Lambda间歇性地超时连接到S3

时间:2020-02-17 21:27:44

标签: java amazon-web-services amazon-s3 aws-lambda aws-secrets-manager

我是AWS的n00b。

我有一个用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

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

一旦添加了正确的NAT网关,Lambda就会按预期工作。

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

相关问题