使用 Boto 调用 lambda 不尊重超时



我正在使用 boto3 调用一个 lambda 函数,带有:

import boto3
import json
client = boto3.client('lambda')
response = client.invoke(
            InvocationType='RequestResponse',
            FunctionName=test_lambda_arn,
            LogType='Tail',
            Payload=json.dumps(data)
)

它在 626 秒后引发botocore.vendored.requests.exceptions.ReadTimeout异常。我已将此 lambda 配置为在 100 秒后超时。当我用boto创建它时,我就是这样做的。当我进入 AWS 控制台时,它说此 lambda 的超时时间为 1 分 40 秒。

那么,为什么 invoke 命令在 626 秒后超时,而不是在 100 秒后超时呢?

是因为重试吗?如果是这样,如何禁用重试?

编辑:在CloudWatch日志中,我可以看到每个client.invoke调用的多个调用。因此,发生了一些自动重试的事情。这是client.invoke的文档。

创建一个具有较长read_timeout值(可能还有其他东西(的 botocore 配置对象,并在创建 lambda 客户端时将其传入:

import botocore
import boto3
            
cfg = botocore.config.Config(retries={'max_attempts': 0}, read_timeout=840, connect_timeout=600, region_name="us-east-1" )
           
client = boto3.client(
    'lambda', config=cfg, region_name="us-east-1",
     aws_access_key_id="*********", aws_secret_access_key="*********")
payload = {"input_array": input_arr}
result = client.invoke(
     FunctionName="**********", InvocationType='RequestResponse',
     LogType='Tail', Payload=json.dumps(payload,cls=NumpyArrayEncoder))
        
range = result['Payload'].read()
range_json = json.loads(range)

我在 boto3 git 存储库上发布了这个问题。他们将添加一个选项,以client.invoke禁用自动重试。

同时,这里有一个解决方法。

相关内容

  • 没有找到相关文章

最新更新