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

Amazon web services 调用另一个(长)Lambda时AWS Lambda超时,amazon-web-services,aws-lambda,aws-sdk,Amazon Web Services,Aws Lambda,Aws Sdk,ers 我正在使用连接多个lambda的Step函数。在其中一个lambda中,我调用另一个lambda。两个lambda都有15分钟的超时时间。但是,几分钟后,调用辅助lambda的主lambda超时(辅助lambda愉快地继续其工作) 这是代码,您可以看到,我尝试使用4个不同的命令提高超时 // (2) Instantiate AWSLambdaClientBuilder to build the Lambda client AWSLambdaClientBuilder

ers

我正在使用连接多个lambda的Step函数。在其中一个lambda中,我调用另一个lambda。两个lambda都有15分钟的超时时间。但是,几分钟后,调用辅助lambda的主lambda超时(辅助lambda愉快地继续其工作)

这是代码,您可以看到,我尝试使用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);

知道如何处理此超时吗?

由于没有明确指定调用类型,因此可以从第一个AWS Lambda同步调用第二个AWS Lambda函数。因此,当第二个AWS Lambda函数运行时,第一个函数也将继续运行,等待第二个函数的响应。这就是为什么如果第一个AWS Lambda函数和第二个AWS Lambda函数的运行时间之和高于第一个AWS Lambda函数配置的最大超时(在您的情况下为15分钟),第一个AWS Lambda函数将超时

从另一个AWS Lambda函数同步调用AWS Lambda函数是一种不好的做法,因为您可能会在当前遇到超时问题时运行,并在第二个AWS Lambda函数运行时花钱运行第一个AWS Lambda函数

您可以做的是异步调用第二个AWS Lambda函数,方法是为您的
InvokeRequest

InvokeRequest req=new InvokeRequest()。带有函数名(随机)
.带有效负载(jsonString)
.withInvocationType(InvocationType.Event);
当然,只有在不依赖第二个AWS Lambda函数的输出来完成第一个函数的情况下,这才有效

由于您已经在使用AWS步骤函数,可能更好的选择是使用步骤函数状态机来协调第二个AWS Lambda函数的调用,如以下教程所述:


根据您的AWS Lambda函数的运行方式,将第一个AWS Lambda函数拆分为两个部分是有意义的,第一个AWS Lambda函数当前正在调用第二个AWS Lambda函数,这两个部分在调用的Lambda函数之前和之后运行。

因为您没有明确指定调用类型,从第一个AWS Lambda同步调用第二个AWS Lambda函数。因此,当第二个AWS Lambda函数运行时,第一个函数也将继续运行,等待第二个函数的响应。这就是为什么如果第一个AWS Lambda函数和第二个AWS Lambda函数的运行时间之和高于第一个AWS Lambda函数配置的最大超时(在您的情况下为15分钟),第一个AWS Lambda函数将超时

从另一个AWS Lambda函数同步调用AWS Lambda函数是一种不好的做法,因为您可能会在当前遇到超时问题时运行,并在第二个AWS Lambda函数运行时花钱运行第一个AWS Lambda函数

您可以做的是异步调用第二个AWS Lambda函数,方法是为您的
InvokeRequest

InvokeRequest req=new InvokeRequest()。带有函数名(随机)
.带有效负载(jsonString)
.withInvocationType(InvocationType.Event);
当然,只有在不依赖第二个AWS Lambda函数的输出来完成第一个函数的情况下,这才有效

由于您已经在使用AWS步骤函数,可能更好的选择是使用步骤函数状态机来协调第二个AWS Lambda函数的调用,如以下教程所述:


根据您的AWS Lambda函数的工作方式,将第一个AWS Lambda函数拆分为两个部分可能有意义,第一个AWS Lambda函数当前正在调用第二个AWS Lambda函数,在调用Lambda函数之前和之后运行。

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

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

您可能会发现更多有用的链接:


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

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

您可能会发现更多有用的链接:


您好,谢谢您的详细回复。我知道同步运行这两个lambda的缺点。我应该
  // (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);