使用Boto调用Lambda函数时,超时时间不被尊重

6

我正在使用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文档

Lambda函数是否真正被调用了?您在CloudWatch中看到调用发生了吗?听起来您的代码可能会超时尝试调用AWS API。 - Mark B
是的,我可以在日志中看到调用。对于单个“client.invoke”,有多个日志条目,因此可能会发生一些重试操作。 - falsePockets
2个回答

15
创建一个带有较长read_timeout值(以及可能的其他内容)的botocore配置对象,并在创建lambda客户端时传入它:

使用botocore config对象,在创建lambda客户端时传入一个更长的read_timeout值(和可能的其他选项):

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)

1

我在boto3的git仓库上发布了这个问题。他们将添加一个选项到client.invoke来禁用自动重试。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接