错误时无服务器Lambda重新运行功能

时间:2018-12-28 14:16:43

标签: node.js amazon-web-services aws-lambda serverless

我的lamba函数以应有的方式工作,但是有时会出错。但是通过手动重新运行它可以正常工作。所以我想在发生错误时自动重试。

现在,我是Serverless的新手,所以我想问一下如何在失败/错误时调用重试。我尝试搜索,但未成功。如果有人可以指导我,我会很高兴。

谢谢:)

2 个答案:

答案 0 :(得分:0)

我认为也许您应该查看lambda的最大执行时间。 默认情况下为3秒,也许有时您的功能较长,然后失败。

This document解释了lambda重试。

答案 1 :(得分:0)

在继续之前,您需要确保您了解在哪里生成错误。

如果您的lambda函数本身在运行时建立了某种套接字连接,并且lambda函数在执行过程中出现“套接字挂起”异常,则它可能会返回调用应用程序的5xx状态代码。您可以使用任何一种常见的重试技术让lambda函数重试。

如果正在调用的应用程序遇到Socket Hang Up异常,则问题实际上出在应用程序与AWS Lambda之间的通信中,并且在Lambda函数内部 添加重试将毫无用处。您需要将重试添加到调用的应用程序中。

这是一个可能看起来像的例子:

function getUsers() {
    let retries = 0;
    let maxAttempts = 3;

    function attempt() {
        return lambda.invoke({
            ClientContext: "MyApp", 
            FunctionName: "GetUsers",
            Payload: JSON.stringify({ Active: true })
        }).promise().catch(error => {
            // We don't want to retry on EVERY error, because the error might
            // be an application error or an AWS credentials error. So here we
            // check specifically for the types of errors to retry. AWS will
            // helpfully set the "retryable" property if it's a network issue
            // that they caught.
            //
            // A socket connection might not be an AWS-generated error, so you
            // need to check it directly... this is just an example you can
            // extend:
            if (error.retryable || error.code === 'ECONNRESET') {
                retries++;
                if (retries < maxAttempts) {
                    return attempt();
                }
            }
            throw error;
        });
    }

    return attempt();
}