【发布时间】:2020-02-18 09:08:11
【问题描述】:
我是 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
提前感谢您的帮助。
【问题讨论】:
-
Lambda 函数是否配置为使用 VPC,还是设置为“无 VPC”?如果设置为“VPC”,请查看配置的子网。是有一个子网还是多个子网?如果有多个子网,它们可能是公共/私有子网的混合,并且行为不一致,因为它使用不同的子网,其中一些有效,而另一些无效。
-
@JohnRotenstein 感谢您的想法。 Lambda 使用具有三个子网的 VPC,所有子网都是私有的。
-
作为一项实验,您能否将其更改为仅使用一个子网,看看是否能解决问题?
-
@JohnRotenstein:当使用单个子网时,Lambda 可以完美地处理大量文件。如果我向其中添加第二个子网,则会重新引入超时问题。
-
这表明子网配置不同。检查两个子网上的路由表以查找差异。您可以轮流浏览子网(一次一个)以确定是哪一个(或多个)导致问题,然后深入调查原因。
标签: java amazon-web-services amazon-s3 aws-lambda aws-secrets-manager