为什么 aws lambda 调用客户端错误地返回 ClientExecutionTimeoutException?

dev*_*eed 7 amazon-web-services aws-sdk aws-lambda aws-java-sdk

我们似乎确定性地遇到了这个问题,并且不确定我们在哪里配置错误。对于运行不到约 5 分钟的 lambda,我们的调用在 lambda 完成后约 0.5 秒成功结束。然而,对于任何比这更长的时间,我们可以看到 lambda 在 lambda 日志中完成,但我们的客户端调用ClientExecutionTimeoutException在 15 分钟后抛出 a 。

在遇到其他(否则成功)lambda 的问题后,我们在 Node 上创建了一个基本的测试 lambda 和 sleep 函数,并且已经能够确定性地重现该问题:

function sleep(s) {
  return new Promise(resolve => setTimeout(resolve, s * 1000));
}
const sleepMinutes = 60 * 5;
exports.handler = async (event) => {
    console.log(`received lambda invocation, sleeping ${sleepMinutes}`);
    const response = {
        statusCode: 200,
        body: JSON.stringify(`finished running, slept for ${sleepMinutes} minutes`),
    };
    await sleep(sleepMinutes);
    console.log('finished sleeping');
    return response;
};
Run Code Online (Sandbox Code Playgroud)

我们的 lambda 调用客户端正在使用这些客户端配置:

clientConfig.setRetryPolicy(PredefinedRetryPolicies.NO_RETRY_POLICY);
clientConfig.setMaxErrorRetry(0);
clientConfig.setSocketTimeout(15 * 60 * 1000);
clientConfig.setRequestTimeout(15 * 60 * 1000);
clientConfig.setClientExecutionTimeout(15 * 60 * 1000);
Run Code Online (Sandbox Code Playgroud)

我们是否缺少约 5 分钟的超时配置?

Eze*_*iel 7

aws-sdk-java 中的Javadocs说:

 For functions with a long timeout, your client might be disconnected during synchronous invocation while it waits for a response. Configure your HTTP client, SDK, firewall, proxy, or operating system to allow for long connections with timeout or keep-alive settings.
Run Code Online (Sandbox Code Playgroud)

另一方面,之前 AWS Lambda 被限制为最多 5 分钟,后来这个限制增加到最多 15 分钟。

我会检查:

  1. 客户端sdk版本是最新的
  2. 您的网络没有关闭连接
  3. 移动到异步调用 viaAWSLambdaAsyncClient.invokeAsync()以进行长时间运行的调用。