如何解决 Lambda Kinesis Firehose 集成问题?

2 分钟阅读
0

我已将 AWS Lambda 与 Amazon Kinesis Data Firehose 集成,以转换传入的源数据并将转换后的数据传送到目的地。然而,Lambda 函数未调用或调用失败。

简短描述

配置了 Amazon Kinesis Data Firehose 的 Lambda 函数可能会因以下原因调用失败:

  • AWS Identity and Access Management (IAM) 权限不足
  • Lambda 持续时间超过允许的最长超时时间
  • Lambda 节流
  • 数据转换错误
  • Lambda 函数错误

**注意:**如果您的 Lambda 函数调用出现网络超时或者由于达到调用次数限制而失败,Kinesis Data Firehose 会重新尝试调用三次。有关详细信息,请参阅数据转换失败处理

解决方法

为您的 Kinesis Data Firehose 启用 Amazon CloudWatch 日志记录(如果尚未启用)。当用于数据转换或数据传输的 Lambda 调用失败时,您可以查看特定的错误日志。在创建传输流时,您可以启用 Kinesis Data Firehose 错误日志记录。日志组名称的格式为 /aws/kinesisfirehose/delivery-stream-namedelivery-stream-name 是传输流的名称。

要确定 Lambda 函数调用失败的原因,请查看 Amazon CloudWatch Logs 组中是否有 /aws/lambda/lambda-function-name。失败的数据转换记录将传送到 Amazon Simple Storage Service (Amazon S3) 桶,放在处理失败文件夹中作为备份。您的 S3 桶中的记录还包含失败调用的错误消息。有关解决 Lambda 调用失败问题的详细信息,请参阅数据转换失败处理

IAM 权限不足

“AssumeRoleAccessDenied - 访问被拒绝。请确保所提供的 IAM 角色的信任策略允许 Kinesis Data Firehose 代入该角色。”

当不允许 Amazon Kinesis Data Firehose IAM 角色代入“firehose.amazonaws.com”时,会出现此错误。请确保 IAM 信任策略有权代入类似于以下内容的“firehose.amazonaws.com”:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "firehose.amazonaws.com"
      },
     "Action": "sts:AssumeRole"
    }
  ]
}

“InvokeAccessDenied - 访问被拒绝。请确保访问策略允许访问 Lambda 函数。”

当 Amazon Kinesis Data Firehose IAM 角色无权调用用于数据转换的 Lambda 函数时,会出现此错误。请确保 IAM 策略允许 Amazon Kinesis Data Firehose 调用类似于以下内容的 Lambda 函数:

**注意:**请将此示例中的资源 ARN 替换为您的变量。

{
  "Effect": "Allow",
  "Action": [
    "lambda:InvokeFunction",
    "lambda:GetFunctionConfiguration"
  ],
  "Resource": [
    "arn:aws:lambda:region:account-id:function:function-name:function-version"
  ]
}

Lambda 持续时间超过允许的最长超时时间

“Firehose 在调用 AWS Lambda 时遇到了超时错误。支持的最长函数超时时间为 5 分钟。”

当 Lambda 函数需要超过 5 分钟才能完成时,会出现此错误。要排查 Kinesis Data Firehose 的 Lambda 函数超时错误,请参阅数据转换失败处理

Lambda 节流

“InvokeLimitExceeded - 已超过 Lambda 并发执行数限制。请提高并发执行数限制。”

当超过 Lambda 并发执行数限制时,会出现此错误。请查看 CloudWatch 日志中的 Lambda 并发指标,以确定您的使用情况。要请求增加并发执行数,请参阅请求提高配额

有关详细信息,请参阅 Lambda 函数扩展如何排查 Lambda 函数节流,出现“Rate exceeded”和 429“TooManyRequestsException”错误的问题?

数据转换错误

“JsonProcessingException - 解析来自 Lambda 函数的返回记录时出错。请确保返回的记录符合 Kinesis Data Firehose 要求的状态模型。”

当 Lambda 返回的转换记录不符合要求的格式时,会出现此错误。从 Lambda 返回的所有转换记录都必须包含参数 recordIdresultdata。请检查 Lambda 函数代码和 CloudWatch 日志,确认这些记录是否包含这些参数。

**注意:**要故意删除记录,请将值设置为 Dropped

有关详细信息,请参阅数据转换和状态模型

“DuplicatedRecordId - 多条返回的记录具有相同的记录 ID。请确保 Lambda 函数为每条记录返回唯一的记录 ID。”

如果 Lambda 函数返回给 Kinesis Firehose 的多条已转换记录具有相同的记录 ID,则会出现此错误。在函数调用期间,记录 ID 会从 Kinesis Data Firehose 传递给 Lambda。请检查 Lambda 函数代码和 CloudWatch 日志,确认每个记录 ID 是否是唯一的。

Lambda 函数错误

“已成功调用了 Lambda 函数,但它返回了一个错误结果。”

当 Amazon Kinesis Data Firehose 能够成功调用 Lambda 函数,但由于错误导致 Lambda 函数执行失败时,会出现此错误。请查看数据转换 CloudWatch 指标,确认 Kinesis Data Firehose 已调用您的函数。

如果 Kinesis Data Firehose 尚未调用您的 Lambda 函数,请检查调用时间,看看它是否超出超时参数。您的 Lambda 函数可能需要更大的超时值或需要更多内存空间才能完成。有关调用指标的详细信息,请参阅调用指标

“超过了允许的最大负载”或“LAMBDA_RUNTIME 无法发布处理程序成功响应。Http 响应代码: 413。”

Amazon Kinesis Data Firehose 同步调用 Lambda 函数,每个请求和响应的调用负载限制为 6 MB。Lambda 负载限制是硬性限制,无法提高。请确保每个请求和响应的缓冲区大小不超过 6 MB。

有关详细信息,请参阅 Lambda 配额

相关信息

为什么我在使用 Kinesis Data Firehose 时会遇到数据传输失败问题?

AWS 官方
AWS 官方已更新 1 年前