如何排查 Kinesis Data Firehose 与 Amazon S3 之间的数据传输问题?

2 分钟阅读
0

我正在尝试将数据从 Amazon Kinesis Data Firehose 发送到我的 Amazon Simple Storage Service(Amazon S3)存储桶,但失败了。如何解决此问题?

简短描述

要确认 Kinesis Data Firehose 确实在尝试将数据置入您的 Amazon S3 存储桶,请检查 DeliveryToS3.Success 指标。如果 DeliveryToS3.Success 指标值始终为零,则应检查以下方面:

  • 资源可用性
  • 传入数据记录
  • Kinesis Data Firehose 日志
  • AWS Identity and Access Management(IAM)角色权限
  • Kinesis Data Firehose 服务器端加密
  • AWS KMS 加密的 Amazon S3 存储桶
  • 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 目标的权限

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

"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 服务器端加密

Kinesis Data Firehose 支持使用 AWS Key Management Service(AWS KMS)进行 Amazon S3 服务器端加密,以对传输到 Amazon 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*"
               }
           }

AWS KMS 加密的 S3 存储桶

确认 Kinesis Data Firehose 传输流的 IAM 角色具有正确的权限。要将数据传输到使用 AWS KMS 加密的 Amazon S3 存储桶,密钥策略中必须允许 Kinesis Data Firehose IAM 角色。有关更多信息,请参阅如何解决写入 Amazon S3 存储桶时 Kinesis Data Firehose 中出现的“Access Denied(访问被拒绝)”错误?

Lambda 调用

确认数据传输流中指定的 Lambda 函数的可用性。如果 Lambda 函数缺失或已被删除,请创建一个新的 Lambda 函数以进行调用。

检查 Kinesis Data Firehose ExecuteProcessingSuccessErrors 指标,确保 Data Firehose 尝试过调用您的 Lambda 函数。如果调用不成功,则检查 Amazon CloudWatch 日志组中的 </aws/lambda/functionname> 位置,确定未能调用 Lambda 函数的原因。如果已经执行过 Lambda 转换并且调用了 Lambda 函数,请检查调用的持续时间。如果持续时间超过超时参数指定的时间,则调用将失败。有关调用指标的更多信息,请参阅使用调用指标

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

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


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