调用另一个(长)Lambda 时 AWS Lambda 超时
AWS Lambda timeout when another (long) Lambda is invoked
人
我正在使用 link 多个 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)",
这是代码,如您所见,我尝试使用 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 函数是 运行ning,但第一个函数也会保持 运行ning,等待第二个函数的响应。这就是为什么如果第一个和第二个 AWS Lambda 函数的 运行 时间之和高于第一个 AWS Lambda 函数配置的最大超时(在您的情况下为 15 分钟),您的第一个 AWS Lambda 函数将超时的原因.
从另一个 AWS Lambda 函数同步调用 AWS Lambda 函数是一种不好的做法,因为您可能会 运行 遇到超时问题,因为您现在遇到并花钱 运行 宁第一个 AWS Lambda 函数而第二个 AWS Lambda 函数是 运行ning.
您可以通过 setting the proper invocation type 为您的 InvokeRequest
:
异步调用第二个 AWS Lambda 函数
InvokeRequest req = new InvokeRequest().withFunctionName(random_arn)
.withPayload(jsonString)
.withInvocationType(InvocationType.Event);
这当然只有在您不依赖第二个 AWS Lambda 函数的输出来完成您的第一个函数时才有效。
可能更好的选择是使用 Step Functions 状态机来协调第二个 AWS Lambda 函数的调用,因为您已经在使用 AWS Step 函数,如以下教程中所述:https://aws.amazon.com/de/getting-started/tutorials/create-a-serverless-workflow-step-functions-lambda/
根据您的 AWS Lambda 函数的运行方式,将第一个 AWS Lambda 函数(当前正在调用第二个 AWS Lambda 函数)拆分为调用的 Lambda 函数前后 运行 两部分可能是有意义的。
在使用 AWS Lambda 时,您可能会对不止一种超时感兴趣。您指的是函数执行超时——人们在谈论 Lambda 时通常指的是超时。但是,您还需要配置其他超时。查看 AWS CLI 文档:
https://docs.aws.amazon.com/cli/latest/reference/index.html
这里有 --cli-read-timeout
和 --cli-connect-timeout
。如果我创建一个函数执行超时为 5 分钟的 Lambda 函数,并使用 AWS CLI 使用 RequestResponse(同步)调用类型调用它,如果发生这种情况,则执行时间超过 1 分钟(--cli-read-timeout
的默认值), AWS Lambda 将使这次执行失败并触发自动重试,直到达到最大重试次数。从你的描述来看,我相信你正面临着那种麻烦。设置所有超时并重试。
另外几个您可能会觉得有用的链接:
https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/section-client-configuration.html
人
我正在使用 link 多个 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)",
这是代码,如您所见,我尝试使用 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 函数是 运行ning,但第一个函数也会保持 运行ning,等待第二个函数的响应。这就是为什么如果第一个和第二个 AWS Lambda 函数的 运行 时间之和高于第一个 AWS Lambda 函数配置的最大超时(在您的情况下为 15 分钟),您的第一个 AWS Lambda 函数将超时的原因.
从另一个 AWS Lambda 函数同步调用 AWS Lambda 函数是一种不好的做法,因为您可能会 运行 遇到超时问题,因为您现在遇到并花钱 运行 宁第一个 AWS Lambda 函数而第二个 AWS Lambda 函数是 运行ning.
您可以通过 setting the proper invocation type 为您的 InvokeRequest
:
InvokeRequest req = new InvokeRequest().withFunctionName(random_arn)
.withPayload(jsonString)
.withInvocationType(InvocationType.Event);
这当然只有在您不依赖第二个 AWS Lambda 函数的输出来完成您的第一个函数时才有效。
可能更好的选择是使用 Step Functions 状态机来协调第二个 AWS Lambda 函数的调用,因为您已经在使用 AWS Step 函数,如以下教程中所述:https://aws.amazon.com/de/getting-started/tutorials/create-a-serverless-workflow-step-functions-lambda/
根据您的 AWS Lambda 函数的运行方式,将第一个 AWS Lambda 函数(当前正在调用第二个 AWS Lambda 函数)拆分为调用的 Lambda 函数前后 运行 两部分可能是有意义的。
在使用 AWS Lambda 时,您可能会对不止一种超时感兴趣。您指的是函数执行超时——人们在谈论 Lambda 时通常指的是超时。但是,您还需要配置其他超时。查看 AWS CLI 文档:
https://docs.aws.amazon.com/cli/latest/reference/index.html
这里有 --cli-read-timeout
和 --cli-connect-timeout
。如果我创建一个函数执行超时为 5 分钟的 Lambda 函数,并使用 AWS CLI 使用 RequestResponse(同步)调用类型调用它,如果发生这种情况,则执行时间超过 1 分钟(--cli-read-timeout
的默认值), AWS Lambda 将使这次执行失败并触发自动重试,直到达到最大重试次数。从你的描述来看,我相信你正面临着那种麻烦。设置所有超时并重试。
另外几个您可能会觉得有用的链接:
https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/section-client-configuration.html