【发布时间】:2021-11-25 21:55:13
【问题描述】:
我有一个 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 秒)。
【问题讨论】:
-
投反对票的人或许可以解释原因。
-
在实例化 AmazonS3Client 时尝试指定 InstanceProfileCredentialsProvider。默认构造函数需要尝试通过(按此顺序)环境变量、系统属性、凭据文件和实例配置文件进行授权。因此,您首选的授权方法是最后一种。我认为不会花那么长时间,但是试一试并告诉我。
-
对不起,我弄错了。我曾认为 Lambda 容器附带了 InstanceProfiles(我不知道为什么它不会)。似乎它附带了在环境变量 (stackoverflow.com/questions/32275169/aws-lambda-custom-triggers) 中指定的凭据。在实例化 AmazonS3Client 时尝试指定 (new EnvironmentVariableCredentialsProvider())。尽管它是使用默认构造函数时检查的凭据列表中的第一项,但尝试一下也无妨。让我们知道。
-
那么我将不得不回应 eistrati,不幸的是建议您向 AWS 发送电子邮件或在 AWS 论坛上发帖。如果您想继续进行故障排除,请将这段代码放到 EC2 实例上,看看会发生什么,但这实际上并不能帮助您解决 Lambda 上的问题。
-
@MaximeLaval 祝你好运。我在 aws Lambda 上部署的 django 应用程序和 s3 上的静态文件也面临同样的问题。很慢
标签: amazon-web-services amazon-s3 aws-lambda