使用 NodeJS AWS SDK v3 与 v2 的高 AWS Lambda 执行持续时间

High AWS Lambda Execution Duration with NodeJS AWS SDK v3 vs. v2

我目前正在调查我在我正在处理的 NodeJS Lambda 中发现的一个有趣的问题。要点是,对于我的用例,NodeJS AWS SDK v3 似乎比 SDK v2 慢很多。

我可以改进什么才能使使用 AWS SDK v3 的 Lambda 与使用 AWS SDK v2 的 Lambda 一样“快”。

为了演示这一点,我创建了两个非常相似的 Lambda。两者都有 128MB 内存并使用 NodeJS 14.x 运行时。一个使用 SDK 的 v2,另一个使用 v3。两者都只有最少的代码,但执行时间却大不相同。

由于 SDK 的 v2 在运行时可用,我只需要部署我的 index.js。对于 v3,我还必须部署 node_modules,因为 v3 在开箱即用的运行时中不可用。

此外,两者都从同一个 S3 存储桶中获取相同的对象。对象本身是一个简单的文本文件,大小为 43 字节。

时长

v2: ~50-80ms     (Duration:   69.80 ms  Billed Duration:   70 ms Memory Size: 128 MB Max Memory Used: 90 MB)
v3: ~5500-7000ms (Duration: 6096.98 ms  Billed Duration: 6097 ms Memory Size: 128 MB Max Memory Used: 97 MB)

那些时间来自“热门”的 Lambda。

使用 v2 SDK 的代码:

const AWS = require("aws-sdk");
const s3 = new AWS.S3();

exports.handler = async (event, context, callback) => {
    const params = {Bucket: "<bucket>", Key: "test.txt"};
    const data = await s3.getObject(params).promise();

    return callback(null, data.ContentLength);
};

使用 v3 SDK 的代码:

const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");
const client = new S3Client();

exports.handler = async (event, context, callback) => {
    const command = new GetObjectCommand({Bucket: "<bucket>", Key: "test.txt"});
    const data = await client.send(command);

    return callback(null, data.ContentLength);
};

由于 v3 版本慢得多,我启用了 X-Ray 并检查了所有时间丢失的地方(见下图)。显然,“开销”是问题所在。

documentation 必须对“开销”说以下内容:

Represents the work done by the Lambda runtime to prepare to handle the next event.

我不知道运行时在这里要做什么。特别是,因为该方法实际上并没有做任何事情。

感谢Samrose Ahmed I got an answer to my question in an Github issue

我错误地将 callback() 用于 AWS SDK v3。解决方案是简单地 return 一个值或承诺。

const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");
const client = new S3Client();

exports.handler = async (event, context) => {
    const command = new GetObjectCommand({Bucket: "<bucket>", Key: "test.txt"});
    const data = await client.send(command);

    return data.ContentLength;
};