Как увеличить время ожидания для клиента AWS Lambda - PullRequest
1 голос
/ 27 марта 2019

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

Я бы хотел увеличить время ожидания для своего клиента, так как этот процесс - @Async, и я могу обработать еще несколько секунд.

Это мой метод:

   @Override
   @Async
   public void scanFile( String s3Bucket, String fileName, String path, String documentId, String createdBy ) throws IOException {

      FileScanInput input = new FileScanInput();
      input.setS3Bucket( s3Bucket );
      input.setS3Key( path );

      logger.debug( "Scan file: " + path + ", in S3 bucket:  " + s3Bucket );
      if ( fileScanService == null ) {
         fileScanService = buildFileScanService();
      }

      FileScanOutput fileScanOutput = fileScanService.scanFile( input );
//      TODO: if the scan process failed, ask what should be the next step.
//      for now, the file stays in S3.
      Assert.notNull( fileScanOutput );
      String status = fileScanOutput.getStatus();

      // in case the document owner was not found an infected file was file. Email approved emails
      if ( status.equalsIgnoreCase( VIRUS_SCAN_INFECTED ) ) {
         // delete file on S3
         this.deleteFile( s3Bucket, path );
         String toEmail = personInfoMapper.findStudentEmail( createdBy );
         try {
            sendVirusDetectedEmail( fileName, toEmail );
         }
         catch ( Exception e ) {
            logger.error( e.getMessage() );
         }

         //         we clean up the metadata table in case there was a virus since this is running async.
         metadataDao.cleanUpMetadata( documentId );

         logger.error( "The file is infected." );
         throw new VirusFoundException( "File is infected." );
      }
   }


   public final FileScanService buildFileScanService() {
      return LambdaInvokerFactory.builder().lambdaClient( AWSLambdaClientBuilder.defaultClient() ).build( FileScanService.class );
   }

И это ресурсные конфиги для моей лямбда-функции. enter image description here

Обновление Я также заметил, что моя функция Lambda на самом деле делает свою работу, что означает, что проблема в основном в этой строке FileScanOutput fileScanOutput = fileScanService.scanFile( input );

fileScanOutput не инициализируется, вместо этого возникает проблема тайм-аута.

Другие мои занятия выглядят так:

public interface FileScanService {

   @LambdaFunction( functionName = "s3-antivirus-api-scan" )
   public FileScanOutput scanFile( FileScanInput fileScanInput );
}

public class FileScanInput {

   private String s3Bucket;
   private String s3Key;

   public String getS3Bucket() {
      return s3Bucket;
   }

   public void setS3Bucket( String value ) {
      s3Bucket = value;
   }

   public String getS3Key() {
      return s3Key;
   }

   public void setS3Key( String value ) {
      s3Key = value;
   }
}



public class FileScanOutput {

   private String status;

   public FileScanOutput() {
   }

   public FileScanOutput( String status ) {
      this.status = status;
   }

   public String getStatus() {
      return status;
   }

   public void setStatus( String value ) {
      status = value;
   }
}

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

Когда вы говорите, что у вашего клиента истекло время ожидания, вы имеете в виду клиента Lambda SDK?Если это так, вам может потребоваться передать более длительное время ожидания сокета при создании клиента:

AWSLambdaClientBuilder.standard()
  .withClientConfiguration(new ClientConfiguration()
    .withSocketTimeout(SOCKET_TIMEOUT_IN_MS))
  .build();

Время ожидания сокета по умолчанию составляет 50 секунд: https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/ClientConfiguration.java#L43

Сама функция Lambda продолжит работатьнезависимо от того, закрыт ли сокет на стороне клиента, вероятно, именно поэтому вы видите функцию, выполняющую задание.

0 голосов
/ 27 марта 2019

Лямбда-функция AWS имеет максимальную продолжительность выполнения для запроса - 900 секунд (15 минут), значение по умолчанию - 30 секунд.

Вы можете увеличить это значение в настройках функций:

Откройте консоль AWS Lambda в https://console.aws.amazon.com/lambda/

Выберите свою функцию.

Изменить настройку тайм-аута.

Timeout setting

...