如何排查 Kinesis Data Firehose 与 Amazon S3 之间的数据传输问题?
上次更新时间:2020 年 6 月 18 日
我正在尝试将数据从 Amazon Kinesis Data Firehos 发送到我的 Amazon Simple Storage Service (Amazon S3) 存储桶,但失败了。如何解决此问题?
简短描述
要确认 Kinesis Data Firehose 确实在尝试将数据置入您的 Amazon S3 存储桶,请检查 DeliveryToS3.Success 指标。如果 DeliveryToS3.Success 指标值始终为零,则应检查以下方面:
资源可用性 传入数据记录 Kinesis Data Firehose 日志 AWS Identity and Access Management (IAM) 角色权限 服务器端加密 AWS Lambda 调用解决方法
资源可用性
确认您的 Kinesis Data Firehose 数据传输流中指定的 S3 存储桶的可用性。如果您在使用数据转换功能,请确保指定的 Lambda 函数存在。
传入数据记录
检查 IncomingRecords 和 IncomingBytes 指标,以确认有数据传入 Kinesis Data Firehose。如果 IncomingRecords 或 IncomingBytes指标值为零,则表示没有记录传入到 Kinesis Data Firehose。如果数据传输流使用 Amazon Kinesis 数据流作为来源,则检查 IncomingBytes 和 IncomingRecords 指标以确定数据流来源。此外,验证 DataReadFromKinesisStream.Bytes 和 DataReadFromKinesisStream.Records 指标是否由数据传输流发出。有关这些指标的更多信息,请参阅数据传输 CloudWatch 指标。
如果没有数据传输到 Kinesis Data Firehose,则该问题的原因可能在于上游。对于直接 PUT 操作,确认已经正确调用用来将记录置入 Kinesis Data Firehose 的 PutRecord 和 PutRecordBatch API。
Kinesis Data Firehose 日志
检查您是否已为 Kinesis Data Firehose 启用日志记录。如果未启用日志记录,请检查传输失败的错误日志。错误日志中会提供传输失败的具体原因,方便您排查存在问题的区域。日志组名称的格式为:/aws/kinesisfirehose/delivery-stream-name。
随后,使用适合您角色的如下权限:
"Action": ,
"Resource":
IAM 角色权限
确保在 Kinesis Data Firehose 传输流中指定的 IAM 角色具有正确的权限。根据传输流上启用的参数,可能需要多项权限。有关更多信息,请参阅授予 Kinesis Data Firehose 访问 Amazon S3 目标的权限。
对于 S3 访问,请按如下方式更新您的 IAM 策略:
"Action": ,
"Resource":
要允许您的 Lambda 函数执行数据转换,请按如下方式更新您的策略:
"Action": ,
"Resource":
对于列为源的 Kinesis 数据流,请按如下方式更新您的策略:
"Action": ,
"Resource": "arn:aws:kinesis:region:account-id:stream/stream-name"
服务器端加密
Kinesis Data Firehose 支持使用 AWS Key Management Service (AWS KMS) 进行 S3 服务器端加密,以加密传输到 S3 的数据。要允许服务器端加密,请更新您的 IAM 角色策略,将其设置为以下内容:
"Action": ,
"Resource": ,
"Condition": {
"StringEquals": {
"kms:ViaService": "s3.region.amazonaws.com"
},
"StringLike": {
"kms:EncryptionContext:aws:s3:arn": "arn:aws:s3:::bucket-name/prefix*"
}
}
Lambda 调用
确认数据传输流中指定的 Lambda 函数的可用性。如果 Lambda 函数缺失或已被删除,请创建一个新的 Lambda 函数以进行调用。
检查 Kinesis Data Firehose ExecuteProcessingSuccess 和 Errors 指标,确保 Data Firehose 尝试过调用您的 Lambda 函数。如果调用不成功,则检查 Amazon CloudWatch 日志组中的 </aws/lambda/functionname> 位置,确定未能调用 Lambda 函数的原因。如果已经执行过 Lambda 转换和 Lambda 函数调用,请检查其持续时间是否超出了超时参数指定的持续时间。有关调用指标的更多信息,请参阅使用调用指标。
如果数据转换失败,则未成功处理的记录会传输到 processing-failed 文件夹中的 S3 存储桶。S3 中的记录格式还包含错误消息。有关解决数据转换失败的更多信息,请参阅数据转换失败处理。
注意:您的 S3 存储桶策略还可能会遇到显式拒绝,如 aws: SourceIp 或 aws: SourceVpce。要验证您的 S3 存储桶策略是否被显式拒绝,请在 CloudWatch Logs 中查找 S3.AccessDenied 错误代码。