Тайм-аут AWS Lambda, когда вызывается другая (длинная) лямбда - PullRequest
0 голосов
/ 22 декабря 2018

ers

Я использую пошаговые функции, которые связывают несколько лямбд.В одной из этих лямбд я призываю другую лямбду.Обе лямбды имеют 15-минутный перерыв.Однако через несколько минут первичная лямбда, которая вызывает вторичную лямбда-тайм-аут (вторичная лямбда успешно продолжает свою работу).

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);

Есть идеи, как справиться с этим таймаутом?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Существует несколько тайм-аутов, которые могут вас заинтересовать при работе с AWS Lambda.То, на что вы ссылаетесь, это время ожидания выполнения функции - время ожидания, которое обычно имеют в виду люди, говоря о лямбде.Однако есть и другие таймауты, которые вы хотите настроить.Посмотрите документы AWS CLI:

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

Здесь у вас есть --cli-read-timeout и --cli-connect-timeout.Если бы я создал функцию Lambda с, скажем, 5-минутным тайм-аутом выполнения функции, и вызвал бы ее, используя AWS CLI, используя тип вызова RequestResponse (синхронный), если это произойдет, это займет более 1 минуты для выполнения (значение по умолчанию для --cli-read-timeout),AWS Lambda не выполнит это выполнение и запустит автоматическую повторную попытку, вплоть до максимального числа повторных попыток.Судя по тому, что вы описываете, я полагаю, что вы столкнулись с такими проблемами.Установите все таймауты и попробуйте снова.

Еще несколько ссылок, которые могут оказаться полезными:

AWS Lambda с использованием Java - настройка конфигурации соединения / сокетов тайм-аутов

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-

0 голосов
/ 22 декабря 2018

Поскольку вы явно не указываете тип вызова, вы вызываете свою вторую функцию AWS Lambda из своей первой AWS Lambda синхронно.Таким образом, пока работает ваша вторая лямбда-функция AWS, первая также будет работать, ожидая ответа второй функции.Вот почему ваша первая лямбда-функция AWS истечет, если сумма времени работы первой и второй лямбда-функции AWS превысит настроенное максимальное время ожидания первой лямбда-функции AWS (в вашем случае 15 минут).

Синхронный вызов лямбда-функции AWS из другой лямбда-функции AWS - плохая практика, так как вы можете столкнуться с проблемами тайм-аута, которые возникают у вас прямо сейчас, и тратить деньги на запуск первой лямбда-функции AWS, когда работает вторая лямбда-функция AWS.

Что вы можете сделать, это вызвать вторую лямбда-функцию AWS асинхронно, установив правильный тип вызова для вашего InvokeRequest:

InvokeRequest req = new InvokeRequest().withFunctionName(random_arn)
                                       .withPayload(jsonString)
                                       .withInvocationType(InvocationType.Event); 

Это, конечно, работаетесли вы не зависите от выхода второй лямбда-функции AWS для завершения своей первой функции.

Вероятно, лучшим вариантом, поскольку вы уже используете функции шага AWS, является использование конечного автомата пошаговых функцийчтобы организовать вызов второй функции AWS Lambdan, как описано в следующем учебном пособии: https://aws.amazon.com/de/getting-started/tutorials/create-a-serverless-workflow-step-functions-lambda/

В зависимости от того, как работает ваша лямбда-функция AWS, может иметь смысл разделить первую лямбда-функцию AWS, которая в настоящее время вызывает вторую лямбда-функцию AWS, на две работающие частидо и после вызванной лямбда-функции.

...