AWS Lambda 函数总是恰好触发两次

AWS Lambda Function always triggers exactly twice

我有一个用 Python 编写的非常简单的 lambda 函数,我将其部署为 Elastic Container Registry (ECR) 中的 Docker 映像。

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

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

handler(None, None)

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

但是点击测试时总是触发两次

我尝试了两种方法来修复它。首先,我将超时设置为 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

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

我错过了什么,我做错了什么?

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

def handler(event, context):

你也是在直接调用那个函数:

handler(None, None)

因此,您的处理函数是 运行 两次。


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

is_lambda = os.environ.get("AWS_EXECUTION_ENV") is not None
if not is_lambda:
    handler(None, None)