尽管没有错误,Amazon Lambda 每分钟都会使用多个请求 ID 重新调用

Yit*_*ikC 4 python jenkins boto3 aws-lambda

我在 Python 3.7 中有一个 Lambda 函数,它通过 Boto3 显式同步调用。它配置了 5 分钟的超时。当第一次调用进行一分钟时,第二次调用将使用另一个请求 ID 启动。一分钟后,再次重试该请求,这次很快就完成了。因为它检测到系统状态已更改。调用序列示例

  1. 11:20:29 至 11:21:53 - 日志流 A - 要求。编号:68cfbd89-9f4c-4e8c-9de0-b9e548983692
  2. 11:21:30 至 11:22:56 - 日志流 B - 要求。ID:1b569ffb-67b8-4e82-8e99-46424f45e2e5
  3. 11:22:30 至 11:22:33 - 日志流 A - 要求。编号:d9d60271-4626-43ab-bb3a-f14be057af13

从我的 Lambda 调用返回的请求 ID 是 d9d60271-4626-43ab-bb3a-f14be057af13。

调用Lambda的堆栈如下:

  • Jenkins 运行管道脚本。
  • 该脚本运行一个 Makefile,该文件执行 2 个连续任务。
    • 构建一个docker容器
    • 在容器内运行脚本。
  • 在容器内运行的脚本采用 Python 3.7。它使用 Boto3 调用一些 AWS API,然后使用InvocationType="RequestResponse".

所有调用都不会因未处理的异常或任何明显的错误而退出。Lambda 是否正在重试我的呼叫?该堆栈的任何其他元素(尤其是 Jenkins)是否可以“透明地”重试该任务,如果是这样,我将如何确定这一点?

Yit*_*ikC 8

结果问题出在客户端的 Boto3,而不是 Lambda!当 lambda 超过一分钟没有返回任何内容时,Boto3 默认会超时。为了解决这个问题,我必须覆盖 Boto 的默认配置:

lambda_config = botocore.config.Config(region_name=region, read_timeout=300)
lambda_client = boto3.client('lambda', config=lambda_config)
Run Code Online (Sandbox Code Playgroud)

我证明这是一个客户端问题的方法是将参数reserved_concurrent_executions 设置为1,从而防止我的Lambda 并发执行,并注意到我从Boto 收到了异常。


dhe*_*thi 6

这通常是由于 cli 时间读出而发生,该读出在 lambda 的多次调用中返回。将 --cli-read-timeout 参数添加到 aws lambda 调用,或者如果使用 boto,则按照上面 YitzikC 的回答进行操作

对于 aws cli,命令如下所示

aws lambda invoke --function-name <fn name> --cli-read-timeout 900 --log-type Tail --region <region> /dev/stdout

确保 cli 读取超时等于或大于 lambda fun 执行超时