Я пытаюсь сканировать файл с помощью 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 );
}
И это ресурсные конфиги для моей лямбда-функции.
Обновление
Я также заметил, что моя функция 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;
}
}