AWS Lambda函数总是触发两次

jgr*_*fo1 1 python amazon-web-services aws-lambda

我有一个用 Python 编写的非常简单的 lambda 函数,我将其部署为弹性容器注册表 (ECR) 中的 Docker 映像。

它执行一个非常简单的任务,处理程序如下所示:

def handler(event, context):
...
    __send_email(msg)

handler(None, None)
Run Code Online (Sandbox Code Playgroud)

我对结果很满意,代码中没有错误,每次运行时我都会收到成功的电子邮件。

但是,当我单击“测试”时,它总是触发两次。

我尝试了两件事来解决它。首先我将超时设置为 5 分钟(大多数情况下运行大约需要 2.5 秒)。接下来,我将异步调用重试尝试次数设置为零。这些都不能解决问题。

但真正让我困惑的是我在日志中没有看到任何重复的调用。这就是我运行它时得到的全部:

START RequestId: 892f1091-92be-4360-be9e-0707c268d127 Version: $LATEST
END RequestId: 892f1091-92be-4360-be9e-0707c268d127
REPORT RequestId: 892f1091-92be-4360-be9e-0707c268d127  Duration: 1180.98 ms    Billed Duration: 2416 ms    Memory Size: 128 MB Max Memory Used: 46 MB  Init Duration: 1234.33 ms
Run Code Online (Sandbox Code Playgroud)

显然没有超过五分钟的超时时间。我读过有关幂等性的内容,但我没有看到这会成为问题,因为我所做的只是手动单击测试,而且我也没有看到任何重复运行的日志。

我错过了什么以及我做错了什么?

Mar*_*k B 7

当触发 AWS Lambda 函数时,Amazon 会调用此函数:

def handler(event, context):
Run Code Online (Sandbox Code Playgroud)

您也可以直接调用该函数:

handler(None, None)
Run Code Online (Sandbox Code Playgroud)

因此,您的处理程序函数运行了两次。


如果您希望能够在本地测试您的函数,而不会在将其部署到 AWS 时产生这种不需要的副作用,那么您需要在代码中添加检查以检测它是否在 AWS 中运行。看起来像下面这样:

is_lambda = os.environ.get("AWS_EXECUTION_ENV") is not None
if not is_lambda:
    handler(None, None)
Run Code Online (Sandbox Code Playgroud)