调用另一个(长)Lambda 时 AWS Lambda 超时

hel*_*rld 3 amazon-web-services aws-sdk aws-lambda

我正在使用将多个 Lambda 链接在一起的 Step Functions。在其中一个 lambda 中,我调用另一个 lambda。两个 lambda 都有 15 分钟超时。然而,几分钟后,调用辅助 lambda 的主 lambda 超时(辅助 lambda 愉快地继续其工作)。

Error

com.amazonaws.SdkClientException
Cause

{"errorMessage": "Unable to execute HTTP request: Read timed out",
  "errorType": "com.amazonaws.SdkClientException",
  "stackTrace": [
    cause": {
      "errorMessage": "Read timed out",
   "errorType": "java.net.SocketTimeoutException",
   "stackTrace": [
  "java.net.SocketInputStream.socketRead0(Native Method)",
  "java.net.SocketInputStream.socketRead(SocketInputStream.java:116)",
  "java.net.SocketInputStream.read(SocketInputStream.java:171)",
  "java.net.SocketInputStream.read(SocketInputStream.java:141)",
  "sun.security.ssl.InputRecord.readFully(InputRecord.java:465)",
  "sun.security.ssl.InputRecord.read(InputRecord.java:503)",
  "sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)",
  "sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:940)",
  "sun.security.ssl.AppInputStream.read(AppInputStream.java:105)",
Run Code Online (Sandbox Code Playgroud)

这是代码,正如您所看到的,我尝试使用 4 个不同的命令来提高超时时间。

  // (2) Instantiate AWSLambdaClientBuilder to build the Lambda client
        AWSLambdaClientBuilder builder = 
 AWSLambdaClientBuilder.standard().withRegion(region);
        // (3) Build the client, which will ultimately invoke 
   the function
        AWSLambda client = builder.build();
        
        // (4) Create an InvokeRequest with required parameters
        InvokeRequest req = new 
   InvokeRequest().withFunctionName(random_arn).withPayload(jsonString); 
        
        // (5) Invoke the function and capture response
        int timeout = (15*60*1000);
        req.setSdkClientExecutionTimeout(timeout);
        req.setSdkRequestTimeout(timeout);
        req.withSdkClientExecutionTimeout(timeout);
        req.withSdkRequestTimeout(timeout);
        
        InvokeResult result = client.invoke(req);
Run Code Online (Sandbox Code Playgroud)

知道如何解决这个超时问题吗?

小智 5

在使用 AWS Lambda 时,您可能会对多种超时感兴趣。您所指的是函数执行超时——人们在谈论 Lambda 时通常指的超时。但是,您还需要配置其他超时。查看 AWS CLI 文档:

https://docs.aws.amazon.com/cli/latest/reference/index.html

这里你有--cli-read-timeout--cli-connect-timeout。如果我创建一个具有 5 分钟函数执行超时的 Lambda 函数,并使用 RequestResponse(同步)调用类型使用 AWS CLI 调用它,如果发生这种情况,执行时间超过 1 分钟(默认值)--cli-read-timeout,AWS Lambda 将执行失败并触发自动重试,最多重试次数。从你的描述来看,我相信你也面临着这样的麻烦。设置所有超时并重试。

您可能会发现其他一些有用的链接:

使用 Java 的 AWS Lambda - 设置配置连接/套接字超时

https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/section-client-configuration.html

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/ClientConfiguration.html#setSocketTimeout-int-