调用了一次 lambda 函数,它执行了两次

Meh*_*ran 8 amazon-web-services aws-lambda

这更像是一个问题而不是一个问题,但是,有人以前经历过吗?有谁知道如何预防?

我有一个 lambda 函数(L1),它调用第二个 lambda 函数(L2),全部用 NodeJs 编写(运行时:Node.Js 8.10,aws-sdk应该是 v2.488.0 - 但我只是从文档中粘贴它)。简而言之,L1 应该调用 L2,而当它调用时,L2 会执行两次!我通过将日志写入 CloudWatch 发现了这一点,我可以看到一个 L1 日志和两个 L2 日志。

这是 L1 和 L2 的简化版本。

L1:

const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();

module.exports = {
    handler: async (event, context, callback) => {
        const lambdaParams = {
            FunctionName: 'L2',
            Qualifier: `dev`,
            Payload: JSON.stringify({}),
        };

        console.log(`Calling: ${JSON.stringify(lambdaParams)}`);
        return await lambda.invoke(lambdaParams).promise();
    },
};
Run Code Online (Sandbox Code Playgroud)

L2:

module.exports = {
    handler: async (event, context, callback) => {
        console.log(`L2 called`);
    },
};
Run Code Online (Sandbox Code Playgroud)

在 CloudWatch 中,我可以看到一Calling ....两个L2 called

顺便说一句,这不会一直发生。这是步骤函数过程的一部分,该过程将调用 L1 10k 次。我的代码的编写方式是,如果 L2 执行两次(每次调用),它将使整个过程失败(因为 L2 仅在记录不存在时才向 DB 插入记录,如果存在则失败)。到目前为止,我设法记录了这种行为 3 次。他们都处理相同的 10k 项,每次都在不同的迭代中面临问题。

有没有人有同样的经历?或者更好的是,知道如何确保一次调用只导致一次执行?

Z.W*_*Wei 7

可能导致这种情况的一种情况是,在 L2 lambda 中,您没有返回任何内容,这将导致 L1 lambda(调用者)认为 L2 存在错误,因此触发重试机制。尝试在 L2 中返回一些内容,即使只是一个“OK”。