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