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

ijxebb2r  于 2023-10-17  发布在  Jenkins
关注(0)|答案(4)|浏览(132)

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

  1. 11:20:29至11:21:53 -日志流A -要求产品编号:68 cfbd 89 - 9 f4 c-4 e8 c-9de 0-b 9 e548983692
  2. 11:21:30至11:22:56 -日志流B -要求产品编号:1b 569 ffb-67 b8 - 4 e82 - 8 e99 - 46424 f45 e2 e5
  3. 11:22:30至11:22:33 -日志流A -要求产品编号:d9 d 60271 -4626- 43 ab-bb 3a-f14 be 057 af 13
    从我的Lambda调用返回的请求ID是d9 d 60271 -4626- 43 ab-bb 3a-f14 be 057 af 13。
    调用Lambda的堆栈如下:
  • Jenkins正在运行一个Pipeline脚本。
  • 该脚本运行一个Makefile,它执行两个连续的任务。
  • 构建Docker容器
  • 在容器内运行脚本。
  • 在容器中运行的脚本是Python 3.7。它使用Boto 3调用一些AWS API,然后使用InvocationType="RequestResponse"调用lambda。

没有一个调用在退出时出现未处理的异常或任何明显的错误。拉姆达是在回我电话吗这个堆栈的任何其他元素,特别是Jenkins,是否可以“透明地”重试任务,如果是这样,我将如何确定这一点?

jslywgbw

jslywgbw1#

问题原来是由客户端的Boto 3引起的,而不是Lambda!当lambda在超过一分钟的时间内没有返回任何内容时,默认情况下Boto 3超时。为了解决这个问题,我不得不覆盖Boto的默认配置:

lambda_config = botocore.config.Config(region_name=region, read_timeout=300)
lambda_client = boto3.client('lambda', config=lambda_config)

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

dldeef67

dldeef672#

这通常是由于在多次调用lambda时返回的超时读取而发生的。将--cli-read-timeout参数添加到aws lambda调用中,或者如果使用boto,则按照上面YitzikC的回答进行操作
对于aws命令,命令如下所示
aws lambda invoke --function-name <fn name> --cli-read-timeout 900 --log-type Tail --region <region> /dev/stdout
确保读取超时等于或大于lambda函数执行超时

trnvg8h3

trnvg8h33#

aws Jmeter 板上的Lamba函数超时配置是多次重试后的时间(这里是5分钟)。您的请求在分钟后重试,可能您的lamba客户端的超时默认为60秒/请求。因此,如果请求超过60秒,lamba将再次触发,直到达到5分钟超时。你需要增加lamba客户端超时。
在Ruby代码中检查类似的问题。https://stackoverflow.com/a/56986916/3551956

gg58donl

gg58donl4#

下面的代码是为我工作。两个函数的VPC设置相同,不需要实现下面的代码,单独运行子函数会成功执行,但是从父函数运行会给予readtimeout错误,所以将connect_timeoutread_timeout的值都增加到900秒。

from botocore import config as botocoreConfig
from boto3 import client as botoClient
import json

def lambda_handler(event, context):
    
    #have added 15 min timeout
    config = botocoreConfig.Config(
       read_timeout=900,
       connect_timeout=900,
       retries={"max_attempts": 0}
   )
   lambdas = botoClient("lambda", config=config)
   payload= {
       "SomePayload": "PayloadValue"
   }

   response = lambdas.invoke(FunctionName="function_to_invoke", 
       InvocationType="RequestResponse", Payload=json.dumps(payload))

相关问题