OpenSearch Service 도메인을 대상으로 하는 Kinesis Data Firehose에서 데이터 전송 실패가 발생하는 이유는 무엇인가요?

5분 분량
0

Amazon Kinesis Data Firehose에서 Amazon OpenSearch Service 도메인으로 데이터를 전송하고 싶지만 데이터 전송 실패가 발생합니다.

간략한 설명


다음과 같은 이유로 Kinesis Data Firehose와 Amazon OpenSearch Service 간에 전송이 실패할 수 있습니다.

  • 유효하지 않은 배송 목적지
  • 적절한 권한 부족
  • AWS Lambda 함수 간접 호출 문제
  • OpenSearch 서비스 도메인 상태 문제

해결 방법

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 지표를 보고 전송이 성공했는지 확인합니다. 지표 값 0은 게재가 실패했음을 확인하는 것입니다. DeliveryToElasticsearch.Success 지표에 대한 자세한 내용은 데이터 전송 CloudWatch 지표OpenSearch Service로 전달을 참조하세요.

적절한 권한 부족

Kinesis Data Firehose의 구성에 따라 몇 가지 권한이 필요합니다.

Amazon Simple Storage Service(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 Dashboards에 로그인하고 역할 매핑을 추가합니다. 롤 매핑을 통해 Kinesis Data Firehose 역할이 OpenSearch Service에 요청을 보낼 수 있습니다.

OpenSearch Dashboards에 로그인하고 역할 매핑을 추가하려면 다음 단계를 완료하세요.

  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-function-name을 확인합니다. 데이터 변환에 실패하면 실패한 레코드가 processing-failed 폴더의 백업으로 S3 버킷에 전달됩니다. S3 버킷의 레코드에는 간접 호출 실패에 대한 오류 메시지도 포함됩니다. Lambda 호출 실패 해결에 대한 자세한 내용은 데이터 변환 실패 처리를 참조하세요.

OpenSearch 서비스 도메인 상태 문제

다음 지표를 확인하여 OpenSearch Service가 양호한 상태인지 확인합니다.

  • CPU 사용률: 이 지표가 지속적으로 높으면 데이터 노드가 요청 또는 수신 데이터에 응답하지 못할 수 있습니다. 클러스터를 확장해야 할 수 있습니다.
  • JVM 메모리 압력: JVM 메모리 압력이 지속적으로 80%를 초과하는 경우 클러스터가 메모리 회로 차단기 예외를 시작할 수 있습니다. 이러한 예외로 인해 데이터가 인덱싱되지 않을 수 있습니다.
  • ClusterWriteBlockException: 이 인덱싱 블록은 도메인이 JVM 메모리 압력이 높거나 더 많은 스토리지 공간이 필요할 때 발생합니다. 데이터 노드에 충분한 공간이 없으면 새 데이터를 인덱싱할 수 없습니다. OpenSearch Service 문제 해결에 대한 자세한 내용은 Amazon OpenSearch Service 문제 해결을 참조하세요.

수신 데이터 없음

Kinesis Data Firehose에 대한 수신 데이터가 있는지 확인하려면 IncomingRecordsIncomingBytes 지표를 모니터링합니다. 값이 0이면 Kinesis Data Firehose에 도달하는 레코드가 없음을 의미합니다. IncomingRecordsIncomingBytes 지표에 대한 자세한 내용은 데이터 수집 지표직접 PUT를 통한 데이터 수집을 참조하세요.

전송 스트림이 Amazon Kinesis Data Streams를 소스로 사용하는 경우 Kinesis 데이터 스트림의 IncomingRecordsIncomingBytes 지표를 확인합니다. 이 두 지표는 수신 데이터를 나타냅니다. 값이 0이면 스트리밍 서비스에 도달하는 레코드가 없음을 확인할 수 있습니다.

DataReadFromKinesisStream.BytesDataReadFromKinesisStream.Records 지표를 확인하여 데이터가 Kinesis Data Streams에서 Kinesis Data Firehose로 전송되는지 확인합니다. 데이터 지표에 대한 자세한 내용은 데이터 수집 지표Kinesis Data Streams를 통한 데이터 수집을 참조하세요. 값이 0이면 Kinesis Data Streams와 Kinesis Data Firehose 간의 실패가 아니라 OpenSearch Service로의 전송 실패를 나타낼 수 있습니다.

Kinesis Data Firehose에 대한 PutRecordPutRecordBatch API 호출이 제대로 호출되었는지 확인할 수도 있습니다. 수신 데이터 흐름 지표가 표시되지 않으면 PUT 작업을 수행하는 생산자를 확인합니다. 생산자 애플리케이션 문제 해결에 대한 자세한 내용은 Amazon Kinesis Data Streams 생산자 문제 해결을 참조하세요.

AWS 공식
AWS 공식업데이트됨 5달 전