【问题标题】:AWS Lambda function extremely slow to retrieve S3 fileAWS Lambda 函数检索 S3 文件的速度极慢
【发布时间】: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


【解决方案1】:

我的建议是使用 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 客户端需要一些时间。

【讨论】:

  • ProfileCredentialsProvider 使用您分配给函数的角色权限。
【解决方案2】:

对于仍然遇到此问题的任何人,我只是通过增加 lambda 内存来解决它。我的 128MB 的 lambda 需要 10 秒才能从 S3 获取 2K 文本文件的内容。我将内存增加到 256 MB,问题就消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-12
    • 2022-01-24
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 2014-04-18
    • 1970-01-01
    相关资源
    最近更新 更多