我将 Amazon Elastic Compute Cloud(Amazon EC2)实例或 AWS 实例调度器与 AWS Lambda 函数配合使用。但是我的 Lambda 函数超时、无法调用或抛出错误。
简短描述
AWS 实例调度器可能会由于以下原因导致您的 Lambda 函数无法正常运作:
- 您的软件开发工具包超时。要解决此问题,请完成修复软件开发工具包超时部分中的步骤。
- 您的函数超时。要解决此问题,请完成 Prevent function timeouts(防止函数超时)部分中的步骤。
- Amazon EventBridge 规则未启动。要解决此问题,请完成 Verify that your scheduled rule was invoked(验证是否已调用计划规则)部分中的步骤。
- 您的函数被限流。要解决此问题,请完成防止函数限流部分中的步骤。
- 重复的 Lambda 调用。要解决此问题,请完成使用幂等性防止错误部分中的步骤。
**注意:**AWS 实例调度器使用 EventBridge 规则以设定的间隔运行 Lambda 函数来调度 Lambda 函数。这会导致异步调用 Lambda 函数,从而影响处理函数错误的方式。如果函数因运行时出错而失败,则默认情况下,同一事件最多重试两次。然后,该事件被丢弃。如果发生限流,事件最多可以在被丢弃之前排队六小时。
解决方法
修复软件开发工具包超时
在早期版本的 AWS 实例调度器中,默认软件开发工具包超时不会被覆盖。如果在早期版本中启动或停止实例的 API 调用需要 60 秒以上的时间才能响应,则请求会超时。
要解决此问题,请获取最新版本的 AWS 实例调度器,或者修改 Boto3 Config 对象的 read_timeout 值(在 Boto3 网站上)。例如:
import boto3
from botocore.config import Config
client_config = Config(read_timeout=890)
ec2 = boto3.client('ec2', config=client_config)
防止函数超时
如果您的 Lambda 函数超时,请检查函数是否正在等待验证 EC2 实例已启动。有关更多信息,请参阅为什么我无法启动我的 EC2 实例?
实例可能需要几分钟时间才能达到 RUNNING(正在运行)状态。如果达到 RUNNING(正在运行)状态的时间超过为该函数配置的超时时间,则函数可能会超时。要解决此问题,请通过修改 AWS CloudFormation 模板中的 Timeout(超时)值 300(5 分钟)来增加函数的超时时间。在函数超时之前,您必须有足够的时间才能启动实例。例如:
"Runtime": "python3.7",
"Timeout": 300,
"TracingConfig": {
"Mode": "Active"
}
**注意:**Lambda 函数的最大可配置超时值为 15 分钟。
如果您的函数位于 Virtual Private Cloud 中,则必须允许您的函数访问互联网才能调用 Amazon EC2 API。
验证是否已调用您的计划规则
要对未被 EventBridge 调用的 Lambda 函数进行故障排查,请参阅为什么我的 EventBridge 规则未触发我的 Lambda 函数?
防止函数限流
要防止函数限制,请参阅如何排查出现“超出速率”和 429 “TooManyRequestsException”错误时的 Lambda 函数限流问题?
对于异步调用,账户上的 Lambda 限流可能会影响函数被调用的能力。所有异步调用在调用之前都会被发送到事件队列。如果另一个函数也收到了大量异步调用,那么您的事件队列可能会被积压。此积压并不意味着您的函数无法调用,而是意味着事件已被延迟。清除事件队列积压后,您可以看到多个调用。默认情况下,异步事件队列中的事件会在异步事件队列中保留最长六小时。
通过使用幂等性来防止错误
为防止重复调用导致错误,请在使用异步调用配置 Lambda 函数时将 Lambda 函数设置为幂等性。
请注意,由于事件队列的最终一致性,异步 Lambda 调用可能会发生不止一次。