【问题标题】:AWS lambda intermittently times out connecting to S3AWS lambda 连接到 S3 间歇性超时
【发布时间】: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


【解决方案1】:

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

添加正确的 NAT 网关后,Lambda 按预期工作。

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

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 2019-11-02
    • 2012-10-20
    • 2020-04-08
    • 2017-10-22
    • 2023-02-14
    • 1970-01-01
    • 2017-07-25
    相关资源
    最近更新 更多