AWS Lambda函数检索S3文件的速度极慢

时间:2016-02-09 18:03:54

标签: amazon-web-services amazon-s3 aws-lambda

我有一个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秒)。

1 个答案:

答案 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客户端需要一些时间。