Подтвердить что ты не робот

Функция AWS Lambda чрезвычайно медленна для извлечения файла S3

У меня есть функция Lambda, которая должна читать файл с S3 каждый раз, когда он выполняется.
Файл очень маленький, около 200 байт, ведро S3 находится в стандартном регионе США, функция лямбда находится в области us-east-1 (поэтому в том же регионе). Для чтения файла требуется от 10 до 15 секунд, почему это так медленно?

Спасибо.

EDIT: некоторый код

long start = System.nanoTime();
AmazonS3Client s3Client = new AmazonS3Client();
S3Object propertyFile = null;
try {
    propertyFile = s3Client.getObject(S3_BUCKET_NAME, S3_PROPERTY_FILE);
} catch (Exception e) {...}
try (InputStream in = propertyFile.getObjectContent()) {
    PROPERTIES.load(in);
} catch (Exception e) {...}
LOGGER.debug("S3 access " + (System.nanoTime() - start));

ИЗМЕНИТЬ №2: После предложения Брукса я сделал

AmazonS3Client s3Client = new AmazonS3Client(new InstanceProfileCredentialsProvider());

И я получаю эту ошибку:

Unable to load credentials from Amazon EC2 metadata service

ИЗМЕНИТЬ № 3:
Память, выделенная для функции Lambda, была 256 МБ, когда я выделяю 1024 МБ, она занимает 3-4 секунды, которая все еще слишком медленная (требуется 1-2 секунды, когда я тестирую локально с моего компьютера).

4b9b3361

Ответ 1

Я бы предложил использовать ProfileCredentialsProvider и кэшировать экземпляр клиента S3 между выполнением функции Lambda:

public class MyLambda { // No matter you implement standard AWS SDK interfaces or not

    private final AmazonS3Client s3Client = new AmazonS3Client(new ProfileCredentialsProvider());

    public String sayHello(Request request, Context context) {
        S3Object s3Obj = s3Client.getObject(request.getBucket(), request.getKey());
        return S3Utils.getContent(s3Object); // Some util which retrieves object content
    }
}

Дело в том, что для настройки клиента S3, который управляет пулом соединений и другими ресурсами, требуется некоторое время.