为什么使用目标为 OpenSearch Service 域的 Kinesis Data Firehose 时会发生数据传输失败?

3 分钟阅读
0

我想将数据从 Amazon Kinesis Data Firehose 发送到 Amazon OpenSearch Service 域,但数据传输失败。

简短描述

以下原因可能导致 Kinesis Data Firehose 和 Amazon OpenSearch Service 之间的传输失败:

  • 无效的传输目标
  • 缺少适当权限
  • AWS Lambda 函数调用问题
  • OpenSearch Service 域运行状况问题

解决方法

启用 Kinesis Data Firehose 的日志记录。将错误日志传输给 Amazon CloudWatch 以帮助缩小问题范围。然后,在 Amazon CloudWatch Logs 中查看 /aws/kinesisfirehose/delivery-stream-name 日志组名称。

要将日志传送到 CloudWatch 日志组,Kinesis Data Firehose 角色必须具有以下权限:

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

确认授予 Kinesis Data Firehose 访问公共 OpenSearch Service 目标的权限。如果使用了数据转换功能,还必须授予对 Lambda 的访问权限。有关更多信息,请参阅通过 Amazon Kinesis Data Firehose 在私密 VPC 内将流数据采集至 Amazon Elasticsearch Service

无效的传输目标

确认指定了有效的 Kinesis Data Firehose 传输目标,并且使用了正确的 ARN。查看 CloudWatch 中的 DeliveryToElasticsearch.Success 指标,检查传输是否成功。指标的值为零表示传输不成功。有关 DeliveryToElasticsearch.Success 指标的更多信息,请参阅数据传输 CloudWatch 指标中的传输至 OpenSearch Service

缺少适当权限

根据 Kinesis Data Firehose 的配置,需要多个权限。

要将记录传输到 Amazon Simple Storage Service(Amazon S3)存储桶,需要以下权限:

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

**注意:**要使用此策略,必须存在 Amazon S3 存储桶资源。

如果 Kinesis Data Firehose 是静态加密的,则需要以下权限:

{
     "Effect": "Allow",
     "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*"
          }
     }
}

要授予 OpenSearch Service 访问权限,请更新您的权限:

{
     "Effect": "Allow",
     "Action": [
          "es:DescribeElasticsearchDomain",
          "es:DescribeElasticsearchDomains",
          "es:DescribeElasticsearchDomainConfig",
          "es:ESHttpPost",
          "es:ESHttpPut"
     ],
     "Resource": [
          "arn:aws:es:region:account-id:domain/domain-name",
          "arn:aws:es:region:account-id:domain/domain-name/*"
     ]
},
{
     "Effect": "Allow",
     "Action": [
          "es:ESHttpGet"
     ],
     "Resource": [
          "arn:aws:es:region:account-id:domain/domain-name/_all/_settings",
          "arn:aws:es:region:account-id:domain/domain-name/_cluster/stats",
          "arn:aws:es:region:account-id:domain/domain-name/index-name*/_mapping/type-name",
          "arn:aws:es:region:account-id:domain/domain-name/_nodes",
          "arn:aws:es:region:account-id:domain/domain-name/_nodes/stats",
          "arn:aws:es:region:account-id:domain/domain-name/_nodes/*/stats",
          "arn:aws:es:region:account-id:domain/domain-name/_stats",
          "arn:aws:es:region:account-id:domain/domain-name/index-name*/_stats"
     ]
}

如果使用 Kinesis Data Streams 作为来源,请更新您的权限:

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

要配置 Kinesis Data Firehose 以进行数据转换,请更新您的策略:

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

如果在集群上启用了精细访问控制(FGAC),请登录 OpenSearch 控制面板并添加角色映射。角色映射允许 Kinesis Data Firehose 角色向 OpenSearch Service 发送请求。

要登录 OpenSearch 控制面板并添加角色映射,请完成以下步骤:

  1. 打开控制面板。
  2. 选择安全选项卡。
  3. 选择角色
  4. 选择 all_access 角色。
  5. 选择已映射的用户选项卡。
  6. 选择管理映射
  7. 后端角色部分,输入 Kinesis Data Firehose 角色。
  8. 选择映射

AWS Lambda 函数调用问题

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

要确定 Kinesis Data Firehose 未调用 Lambda 函数的原因,请检查 CloudWatch Logs 组的 /aws/lambda/lambda/lambda-function-name。如果数据转换失败,则失败的记录将作为备份传送到 S3 存储桶,保存在 processing-failed 文件夹中。S3 存储桶中的记录还包含调用失败的错误消息。有关解决 Lambda 调用失败问题的详细信息,请参阅数据转换失败处理

OpenSearch Service 域运行状况问题

检查以下指标,确保 OpenSearch Service 运行良好:

  • **CPU 利用率:**如果此指标一直很高,则数据节点可能无法响应任何请求或传入数据。您可能需要扩展集群。
  • **JVM 内存压力:**如果 JVM 内存压力持续高于 80%,则集群可能触发了内存断路器异常。这些异常会导致无法索引数据。
  • **ClusterWriteBlockException:**当域处于较高的 JVM 内存压力下或需要更多存储空间时,就会出现这种索引阻止。如果数据节点没有足够的空间,就无法为新数据编制索引。有关 OpenSearch Service 故障排查的更多信息,请参阅 Amazon OpenSearch Service 故障排查

无传入数据

要确认 Kinesis Data Firehose 是否有传入数据,请监控 IncomingRecordsIncomingBytes 指标。值为零表示不存在传入 Kinesis Data Firehose 的记录。有关 IncomingRecords ** 和 IncomingBytes 指标的更多信息,请参阅数据摄取指标中的通过直接 PUT 摄取数据**。

如果传输流使用 Amazon Kinesis Data Streams 作为来源,请检查 Kinesis 数据流的 IncomingRecordsIncomingBytes 指标。这两个指标表示传入的数据。值为零表示不存在传入流式服务的记录。

检查 DataReadFromKinesisStream.BytesDataReadFromKinesisStream.Records 指标,验证数据是否从 Kinesis Data Streams 到 Kinesis Data Firehose。有关数据指标的更多信息,请参阅 数据摄取指标中的通过 Kinesis Data Streams 摄取数据。值为零表示传输至 OpenSearch Service 失败,而非 Kinesis Data Streams 和 Kinesis Data Firehose 之间的传输失败。

还可以检查 PutRecordPutRecordBatch API 是否能正确调用 Kinesis Data Firehose。如果未看到任何传入数据流指标,请检查执行 PUT 操作的创建器。有关创建器应用程序问题排查的更多信息,请参阅 Amazon Kinesis Data Streams 创建器问题排查

AWS 官方
AWS 官方已更新 5 个月前