為什麼使用 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 資料串流作為來源,請更新您的權限:

{
     "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 and Errors 指標,確認 Kinesis Data Firehose 是否調用函數。如果 Kinesis Data Firehose 未調用 Lambda 函數,請檢查調用時間是否超出逾時參數。您的 Lambda 函數可能需要更大的逾時值,或需要更多記憶體才能及時完成。如需調用指標的詳細資訊,請參閱調用指標

若要找出 Kinesis Data Firehose 未調用 Lambda 函數的原因,請檢查 CloudWatch 日誌群組中的 /aws/lambda/lambda-function-name。如果資料轉換失敗,則失敗的記錄將作為 processing-failed 資料夾中的備份傳送至 S3 儲存貯體。S3 儲存貯體中的記錄也包含調用失敗的錯誤訊息。如需解決 Lambda 調用失敗的詳細資訊,請參閱資料轉換失敗處理

OpenSearch Service 網域運作狀態問題

檢查下列指標,以確保 OpenSearch Service 運作狀態良好:

  • **CPU 使用率:**如果此指標始終很高,則資料節點可能無法回應任何要求或傳入資料。您可能需要擴展叢集。
  • **JVM 記憶體壓力:**如果 JVM 記憶體壓力始終高於 80%,則叢集可能正在啟動記憶體斷路器例外狀況。這些例外狀況會阻止資料建立索引。
  • **ClusterWriteBlockException:**當您的網域面臨較高的 JVM 記憶體壓力或需要更多儲存空間時,就會發生這種阻止建立索引的情況。如果資料節點沒有足夠的空間,則無法對新資料建立索引。如需對 OpenSearch Service 問題進行疑難排解的詳細資訊,請參閱疑難排解 Amazon OpenSearch Service

沒有傳入資料

若要確認 Kinesis Data Firehose 是否有傳入資料,請監控 IncomingRecordsIncomingBytes 指標。值為零表示沒有記錄到達 Kinesis Data Firehose。如需 IncomingRecordsIncomingBytes 指標的詳細資訊,請參閱資料擷取指標中的透過 Direct 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 之間的失敗。

您還可以檢查是否正確調用了針對 Kinesis Data Firehose 的 PutRecordPutRecordBatch API 呼叫是否正確。如果您沒有看到任何傳入資料流量指標,請檢查執行 PUT 操作的生產者。如需解決生產者應用程式問題的詳細資訊,請參閱疑難排解 Amazon Kinesis Data Streams 生產者

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