我已将 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-name。delivery-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 返回的所有转换记录都必须包含参数 recordId、result 和 data。请检查 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 时会遇到数据传输失败问题?