В настоящее время я работаю над лямбда-функцией AWS, написанной на Java. Ему нужно выбрать объекты из S3, и поэтому я настроил роль IAM и собираю клиента S3 в обработчике Lambda:
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
public class Example implements RequestHandler<Void, Void> {
@Override
public Void handleRequest(Void nothing, Context ctx) {
long start = System.currentTimeMillis();
AmazonS3 amazonS3 = AmazonS3ClientBuilder.defaultClient();
ctx.getLogger().log("Creating S3 client took " + (System.currentTimeMillis() - start) + "ms");
...
return null;
}
}
Тем не менее, использование AmazonS3ClientBuilder
очень медленно, оператор log выводит следующие моменты времени при выделении функции 192 МБ:
Creating S3 client took 13541ms
Creating S3 client took 16482ms
Creating S3 client took 13617ms
Creating S3 client took 16380ms
Даже при увеличении памяти до 3008 МБ для получения максимальной вычислительной мощности (поскольку AWS распределяет мощность процессора пропорционально памяти для Lambdas), клиенту все равно требуется от 1 до 2 секунд:
Creating S3 client took 1413ms
Creating S3 client took 1170ms
Creating S3 client took 1528ms
Creating S3 client took 1394ms
Эти временные интервалы были записаны в сценариях холодного запуска, и я кэширую экземпляр AmazonS3
для последующих запросов, но кажется довольно экстремальным, что простое создание клиента S3 может занять более 16 секунд на не теплой лямбде.
Неправильно ли я использую AmazonS3ClientBuilder
, возможно, не переопределяя некоторые значения по умолчанию, что приводит к снижению производительности? Как ускорить инициализацию клиента?