繁体   English   中英

长时间运行的 Lambda 的 Boto3 调用会因 TooManyRequestsException 而中断

[英]Boto3 invocations of long-running Lambda runs break with TooManyRequestsException

使用“长期运行”的 Lambda 的经验

在我的公司,我们最近在触发 Lambdas 时遇到了这种行为,运行时间超过 60 秒(boto3 的连接建立和读取的默认超时)。

The beauty of the Lambda invocation with boto3 (using the 'InvocationType' 'RequestResponse') is, that the API returns the result state of the respective Lambda run, so we wanted to stick to that.

问题似乎是,客户端每分钟在与 API 的常设连接上触发许多请求。 因此,我们对boto3 客户端配置进行了试验,但在 Lambda 完成后,增加读取超时会导致在每个超时期限后出现新的(不需要的)调用,并且增加连接超时会触发新的调用。

解决方法

由于对 boto3 的 Lambda 客户端的各种调查和实验并未导致使用“RequestResponse”调用的工作设置,我们现在通过使用 Cloudwatch 日志来规避该问题。 为此,必须设置 Lambda 以写入可访问的日志组。 然后,这些日志可以查询到 state。 然后您将调用 Lambda 并像这样监视它:

import boto3

lambda_client = boto3.client('lambda')
logs_clients = boto3.client('logs')

invocation = lambda_client.invoke(
    FunctionName='your_lambda', 
    InvocationType='Event'
)

# Identifier of the invoked Lambda run
request_id = invocation['ResponseMetadata']['RequestID']

while True:
    # filter the logs for the Lambda end event
    events = logs_client.filter_log_events(
        logGroupName='your_lambda_loggroup',
        filterPattern=f'"END RequestId: {request_id}"'
    ).get('events', [])
    
    if len(events) > 0:
        # the Lambda invocation finished
        break

这种方法现在对我们有用,但它真的很难看。 为了使这种方法稍微好一点,我建议在 filter_log_events 调用中设置时间范围过滤。

一件事,尚未经过测试:上述方法仅说明 Lambda 是否终止,而不是 state (失败或成功),并且默认日志在这方面没有任何用处。 因此,我将调查,如果 Lambda 运行可以在运行时知道自己的请求 ID。 然后,可以准备 Lambda 代码来编写带有请求 id 的错误消息,然后可以再次对其进行过滤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM