【问题标题】:AWSLambdaClient invoke giving exception: com.amazonaws.SdkClientException: Unable to execute HTTP request: The target server failed to respondAWSLambdaClient 调用给出异常:com.amazonaws.SdkClientException:无法执行 HTTP 请求:目标服务器未能响应
【发布时间】:2019-01-10 05:23:59
【问题描述】:

我有一个现有的 aws lambda 函数,我正在尝试使用 AWSLambdaClient(库:aws-java-sdk-lambda) 调用它。如果 lambda 的运行时间少于 5 分钟,我会收到响应。但如果 lambda 运行时间超过 5 分钟,我会得到异常:

com.amazonaws.SdkClientException: Unable to execute HTTP request: The target server failed to respond

设置 lambda 客户端时我缺少什么配置?

完整的堆栈跟踪:

Exception in thread "main" com.amazonaws.SdkClientException: Unable to execute HTTP request: The target server failed to respond
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleRetryableException(AmazonHttpClient.java:1163)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1109)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:758)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:732)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:714)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:674)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:656)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:520)
at com.amazonaws.services.lambda.AWSLambdaClient.doInvoke(AWSLambdaClient.java:3154)
at com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:3121)
at com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:3110)
at com.amazonaws.services.lambda.AWSLambdaClient.executeInvoke(AWSLambdaClient.java:1735)
at com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:1707)
at LambdaTest.main(LambdaTest.java:48)
Caused by: org.apache.http.NoHttpResponseException: The target server failed to respond
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:141)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:165)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
at com.amazonaws.http.protocol.SdkHttpRequestExecutor.doReceiveResponse(SdkHttpRequestExecutor.java:82)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
at com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1285)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1101)
... 12 more

我已经在 aws lambda 控制台上将我的 lambda 最大超时时间增加到 15 分钟。我还进行了代码更改,并在 AWSLambdaClient 配置中将 ClientExecutionTimeoutConnectionTimeoutRequestTimeoutSocketTimeout 设置为 15 分钟(900 秒)。

ClientConfiguration configuration = new ClientConfiguration()
            .withMaxErrorRetry(0)
            // These is measured in milliseconds.
            .withClientExecutionTimeout(900 * 1000)
            .withConnectionTimeout(900 * 1000)
            .withRequestTimeout(900 * 1000)
            .withSocketTimeout(900 * 1000);
AWSLambda lambdaClient = AWSLambdaClientBuilder
            .standard()
            .withRegion(region)
            .withClientConfiguration(configuration)
            .withCredentials(new AWSStaticCredentialsProvider(creds)).build();
InvokeRequest request = new InvokeRequest()
            .withFunctionName(functionName)
            .withInvocationType(InvocationType.RequestResponse)
            .withLogType(LogType.Tail);
InvokeResult result = lambdaClient.invoke(request);
String responseLog = new String(Base64.getDecoder().decode(result.getLogResult()), StandardCharsets.UTF_8);
System.out.println(responseLog);

我正在使用 apache HttpClient: 4.5.5

我看到了一些问题https://stackoverflow.com/a/44703601/9669982我也尝试了一些配置:

configuration.setValidateAfterInactivityMillis(900 * 1000);

为了尝试更多我也使用了:

configuration.setConnectionMaxIdleMillis(900*1000);
configuration.setUseTcpKeepAlive(true);

但没有运气。

在 AWS Cloudwatch 上,我看到我的 lambda 函数运行良好,并且执行了完整的任务,并且在 cloudwatch 上没有任何类型的错误的痕迹,但我得到了上述异常。

我无法得到我缺少的东西。

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-java-sdk


    【解决方案1】:

    正如你已经知道的问题

    如果 lambda 的运行时间少于 5 分钟,我会收到响应。但 如果 lambda 运行时间超过 5 分钟,我会得到异常:

    连接管理器保持活动的连接变得陈旧。也就是说,目标服务器在其端关闭连接,而 HttpClient 无法对该事件做出反应。

    您需要为您的 HTTP 客户端添加 setHttpRequestRetryHandler,如以下链接所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      相关资源
      最近更新 更多