Cum se mărește timeout-ul pentru clientul AWS Lambda (Programare, Java, Asincronă, Amazon S3, Aws Lambda)

Awad a intrebat.
a intrebat.

Încerc să scanez un fișier folosind AWS Lambda și primesc timeout, deoarece funcția de scanare durează mai mult decât era de așteptat.

Aș dori să măresc timeout-ul pentru clientul meu, deoarece acest proces este @Async și pot suporta câteva secunde în plus.

Aceasta este metoda mea:

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

Și aceasta este configurația resurselor pentru funcția mea Lambda.

ActualizareAm observat, de asemenea, că funcția mea Lambda își face de fapt treaba, ceea ce înseamnă că problema este practic în această linieFileScanOutput fileScanOutput = fileScanService.scanFile( input );

fileScanOutput nu se inițializează, în schimb am o problemă de timeout.

Celelalte clase ale mele arată astfel:

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

Comentarii

  • Cât durează până când clientul declanșează timeout-ul? Se pare că există mai multe cronometre și poate că intervalul vă va da o idee despre care este vorba. –  > Por Michael – sqlbot.
2 răspunsuri
pbeardshear

Când spuneți că clientul dvs. este cronometrat, vă referiți la clientul Lambda SDK? Dacă da, este posibil să fie nevoie să treceți un timeout mai lung al socketului atunci când vă creați clientul:

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

Timpul de așteptare implicit al socketului este de 50 de secunde: https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/ClientConfiguration.java#L43

Funcția Lambda în sine va continua să ruleze indiferent dacă socket-ul este închis pe partea clientului, acesta fiind probabil motivul pentru care vedeți că funcția își finalizează sarcina.

hoangdv

Funcția AWS Lambda are o durată maximă de execuție pe cerere este de 900 de secunde (15 minute), valoarea implicită fiind de 30 de secunde.

Puteți crește această valoare în setările funcției:

Deschideți consola AWS Lambda la adresa https://console.aws.amazon.com/lambda/

Alegeți funcția dvs.

Modificați setarea Timeout (Timpul de așteptare).

Comentarii

  • Eu am setat valoarea implicită la 5 minute și tot primesc timeout. FWIW, funcția mea lambda își face treaba, cu excepția faptului că răspunsul către apelantul meu primește timeout. –  > Por Awad.
  • Poate că funcția dvs. nu `finalizează` procesul funcției lambda (ex: returnează ceva). if ( status.equalsIgnoreCase( VIRUS_SCAN_INFECTED ) ) dacă condiția este false , cred că funcția dvs. va aștepta până la timedout … – –  > Por hoangdv.
  • Această funcție funcționează pentru pentru scanarea fișierelor mici utilizează cazuri de utilizare, dar dacă un fișier mai mare este folosit ca intrare. Atunci durează mai mult timp și se termină pe codul meu de client. Vă rugăm să verificați actualizarea mea și să vă împărtășiți gândurile. –  > Por Awad.
  • Ați putea găsi o altă soluție, de exemplu: utilizați un alt serviciu pentru a gestiona fișiere mari (EC2…) sau modificați funcția lambda. medium.freecodecamp.org/… –  > Por hoangdv.