我有一个Lambda函数,每次执行时都需要从S3读取文件 该文件非常小,大约200字节,S3桶位于美国标准区域,Lambda函数位于us-east-1区域(因此相同的区域)。读取文件需要10到15秒,为什么这么慢?
感谢。
编辑:一些代码
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函数的内存为256MB,当我分配1024MB时,需要3-4秒,这仍然太慢(从我的计算机本地测试时需要大约1-2秒)。
答案 0 :(得分:2)
我建议使用ProfileCredentialsProvider
并在Lambda函数执行之间缓存S3客户端实例:
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客户端需要一些时间。