如何排查 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 函数存在。

传入数据记录

检查 IncomingRecordsIncomingBytes 指标,以确认有数据传入 Kinesis Data Firehose。如果 IncomingRecordsIncomingBytes 指标值为零,则表示没有记录传入到 Kinesis Data Firehose。如果数据传输流使用 Amazon Kinesis 数据流作为来源,则检查 IncomingBytesIncomingRecords 指标以确定数据流来源。此外,验证 DataReadFromKinesisStream.BytesDataReadFromKinesisStream.Records 指标是否由数据传输流发出。有关这些指标的更多信息,请参阅数据传输 CloudWatch 指标

如果没有数据传输到 Kinesis Data Firehose,则该问题的原因可能在于上游。对于直接 PUT 操作,确认已经正确调用用来将记录置入 Kinesis Data Firehose 的 PutRecordPutRecordBatch API。

Kinesis Data Firehose 日志

检查您是否已为 Kinesis Data Firehose 启用日志记录。如果未启用日志记录,请检查传输失败的错误日志。错误日志中会提供传输失败的具体原因,方便您排查存在问题的区域。日志组名称的格式为:/aws/kinesisfirehose/delivery-stream-name

随后,使用适合您角色的如下权限:

"Action": [
               "logs:PutLogEvents"
           ],
           "Resource": [
               "arn:aws:logs:region:account-id:log-group:log-group-name:log-stream:log-stream-name"
           ]

IAM 角色权限

确保在 Kinesis Data Firehose 传输流中指定的 IAM 角色具有正确的权限。根据传输流上启用的参数,可能需要多项权限。有关更多信息,请参阅授予 Kinesis Data Firehose 访问 Amazon S3 目标的权限

对于 S3 访问,请按如下方式更新您的 IAM 策略:

"Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject"
            ],     
            "Resource": [       
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"                         
            ]

要允许您的 Lambda 函数执行数据转换,请按如下方式更新您的策略:

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

对于列为源的 Kinesis 数据流,请按如下方式更新您的策略:

"Action": [
                "kinesis:DescribeStream",
                "kinesis:GetShardIterator",
                "kinesis:GetRecords",
                "kinesis:ListShards"
            ],
            "Resource": "arn:aws:kinesis:region:account-id:stream/stream-name"

服务器端加密

Kinesis Data Firehose 支持使用 AWS Key Management Service (AWS KMS) 进行 S3 服务器端加密,以加密传输到 S3 的数据。要允许服务器端加密,请更新您的 IAM 角色策略,将其设置为以下内容:

"Action": [
               "kms:Decrypt",
               "kms:GenerateDataKey"
           ],
           "Resource": [
               "arn:aws:kms:region:account-id:key/key-id"          
           ],
           "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 ExecuteProcessingSuccessErrors 指标,确保 Data Firehose 尝试过调用您的 Lambda 函数。如果调用不成功,则检查 Amazon CloudWatch 日志组中的 </aws/lambda/functionname> 位置,确定未能调用 Lambda 函数的原因。如果已经执行过 Lambda 转换和 Lambda 函数调用,请检查其持续时间是否超出了超时参数指定的持续时间。有关调用指标的更多信息,请参阅使用调用指标

如果数据转换失败,则未成功处理的记录会传输到 processing-failed 文件夹中的 S3 存储桶。S3 中的记录格式还包含错误消息。有关解决数据转换失败的更多信息,请参阅数据转换失败处理

注意:您的 S3 存储桶策略还可能会遇到显式拒绝,如 aws: SourceIpaws: SourceVpce。要验证您的 S3 存储桶策略是否被显式拒绝,请在 CloudWatch Logs 中查找 S3.AccessDenied 错误代码。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?