上次更新时间:2020 年 12 月 15 日
我已集成 AWS Lambda 与 Amazon Kinesis Data Streams 作为事件源来处理我的 Amazon Kinesis 数据流。但是,没有调用 Lambda 函数。为什么会出现这种情况,我该怎样解决呢?
简短描述Lambda 函数错误通常由以下原因导致:
Lambda 函数的执行角色中的权限不足。 无传入数据进入 Amazon Kinesis 数据流。 重新创建 Kinesis 数据流、Lambda 函数或 Lambda 执行角色而引起的不活动事件源映射。 Lambda 函数超出最大执行时间,导致 Lambda 函数中出现超时错误。 Lambda 违反其并发执行限制。有关 Lambda 违反其限制的更多信息,请参阅 AWS Lambda 限制。如果存在 Lambda 函数错误,则不会调用您的函数,函数也不会处理批次中的记录。错误可能会导致 Lambda 函数尝试重新批量处理记录,直到处理成功或者批次过期。有关 Lambda 函数和 Kinesis 错误的更多信息,请参阅将 AWS Lambda 与 Amazon Kinesis 结合使用。
解决方法 排查 Lambda 函数的问题要确定未调用 Lambda 函数的原因,请执行以下步骤:
1.检查 Amazon CloudWatch 中的调用指标,查看设置为总计的 Lambda 函数统计数据。调用指标可帮助您确认是否调用了 Lambda 函数。
2.检查 IteratorAge 指标以查看批次中的最后一条记录有多早或者处理完成的时间。当您的 Lambda 使用器无法进行调用时,数据流的 iterator age 增加。
3.检查 Lambda 函数的 CloudWatch 日志。它们使用 .../aws/lambda/function_name 格式命名。对照函数错误查找任何相应的条目。例如,如果出错的原因是 Lambda 的执行角色权限,则修改 AWS Identity and Access Management (IAM) 角色策略。
4.确认您的 IAM 执行角色拥有正确的权限来访问 CloudWatch:
{
"Version": "2012-10-17",
"Statement": ,
"Resource": "*"
}
]
}
5.(可选)如果您遇到权限错误,则更新您的 Lambda 函数策略以授予它访问 Kinesis Data Streams 的权限:
{
"Version": "2012-10-17",
"Statement": ,
"Resource": "*"
}
]
}
注意:AWSLambdaKinesisExecutionRole 策略包含这些权限。
其他问题排查方法 如果错误与 Lambda 执行函数超时有关,则增加超时值以适应更快的处理。 如果您的 Kinesis 数据流使用 AWS Key Management Service (AWS KMS) 加密,使用器和创建器必须拥有适当的访问权限。Kinesis 数据流必须能够访问用于加密和解密的 AWS KMS 密钥。Lambda 函数的执行角色还必须具有读取 KMS 密钥的访问权限才能成功地从 Kinesis 数据流读取数据。 如果错误由内部 Lambda 函数错误导致,则此错误可指示流处理问题。为了避免控制平面 API 限制,应将每个流限制到 4 到 5 个事件源映射。 如果错误由内部 Lambda 函数错误导致,则此错误可指示流处理问题。将每个流限制到 4 到 5 个事件源映射,以避免过多的事件源映射使用相同数据流。多个事件源映射使用相同的流可能会造成违反 Kinesis 和 Amazon DynamoDB 控制平面限制。 如果您收到连接超时错误,则在代码中执行的 API 调用前后添加日志记录语句。然后,您可以确定函数在哪一个确切的代码行开始失败。 如果您遇到缓慢或停顿的分片,则配置事件源映射以重试较小的批处理大小。您也可以限制重试次数或丢弃较早的记录。 如果您在 CloudWatch logs 中看到“已用内存”错误消息,请增大 Lambda 函数的内存。 如果您超过了 Lambda 函数的最大超时,则修改客户端库和客户端超时。要根据 Lambda 容器中的剩余时间修改超时会话,请使用 context.GetRemainingTimeInMillis 函数。context.GetRemainingTimeInMillis 函数返回发生超时前 Lambda 容器中剩余的时间量。 如果您收到来自 Lambda 函数代码的错误,则您的 Lambda 函数可能卡在尝试相同记录的步骤。使用 try-catch 块获取失败的数据,然后使用 Amazon SQS 队列或 Amazon SNS 主题记录它。您还可以向包含单独重试失败请求的处理逻辑的 Amazon SQS 队列中添加一个 Lambda 触发器。 设置 Amazon SQS 死信队列 (DLQ) 以手动调用 Lambda 函数。当您创建或更新您的 Lambda 函数时配置 DeadLetterConfig 属性。您可以提供 Amazon Simple Queue Service (Amazon SQS) 队列或 Amazon Simple Notification Service (Amazon SNS) 主题作为您的 DLQ 的 TargetArn 。然后,Lambda 将写入事件对象,在标准重试策略用尽后将 Lambda 函数调用到指定的终端节点。 结合使用 AWS Lambda 与 AWS X-Ray 来检测、分析和优化 Lambda 应用程序的性能问题。AWS X-Ray 从 Lambda 服务收集元数据,并生成图表来描绘影响 Lambda 应用程序性能的问题。例如,如果有一个调用的运行时间很长,则可以使用 AWS X-Ray 确认该问题。 </ul