为什么 Kinesis Data Streams 触发器无法调用我的 Lambda 函数?

上次更新日期:2020 年 8 月 21 日

我已集成 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 函数的原因,请执行以下步骤:

1.    检查 Amazon CloudWatch 中的调用指标,查看设置为总计的 Lambda 函数统计数据。调用指标可帮助您确认是否调用了 Lambda 函数。

2.    检查 IteratorAge 指标以查看批次中的最后一条记录有多早或者处理完成的时间。当您的 Lambda 使用器无法进行调用时,数据流的 iterator age 增加。

3.    检查 Lambda 函数的 CloudWatch logs,其名称采用 .../aws/lambda/function_name 格式。对照函数错误查找任何相应的条目。 例如,如果出错的原因是 Lambda 函数的执行角色权限,则修改策略以授予 AWS Identity and Access Management (IAM) 角色正确的访问权限。

4.    确认您的 IAM 执行角色拥有正确的权限来访问 CloudWatch:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}

5.    (可选)如果您遇到权限错误,则更新您的 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 执行函数超时有关,则增加超时值以适应更快的处理。
  • 如果您的 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 确认该问题。

这篇文章对您有帮助吗?


您是否需要账单或技术支持?