Kinesis Data Firehose에서 데이터 전송 실패가 문제가 발생하는 이유가 무엇입니까?

최종 업데이트 날짜: 2020년 6월 16일

Amazon Kinesis Data Firehose에서 Amazon Elasticsearch Service(Amazon ES) 도메인으로 데이터를 보내려 합니다. 데이터 전송에 실패하는 이유가 무엇입니까?

간략한 설명

Kinesis Data Firehose와 Amazon ES 사이에서 전송이 실패하는 데에는 다음과 같은 이유가 있을 수 있습니다.

  • 잘못된 전송 대상
  • 수신 데이터 없음
  • Kinesis Data Firehose 로그가 비활성화됨
  • 적절한 권한 부족
  • AWS Lambda 함수 호출 문제
  • Amazon ES 도메인 상태 문제

해결 방법

잘못된 전송 대상

올바른 Kinesis Data Firehose 전송 대상을 지정했으며 올바른 ARN을 사용하고 있는지 확인합니다. Amazon CloudWatch에서 DeliveryToElasticsearch.Success 지표를 확인하여 전송에 성공했는지 확인할 수 있습니다. DeliveryToElasticsearch.Success 지표 값이 0이면 전송에 실패했음을 의미합니다. DeliveryToElasticsearch.Success 지표에 대한 자세한 내용은 데이터 전송 CloudWatch 지표에서 Amazon ES로 전송을 참조하십시오.

수신 데이터 없음

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

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

Kinesis Data Streams에 도달하는 데이터가 있는 경우, DataReadFromKinesisStream.BytesDataReadFromKinesisStream.Records 지표를 보면 데이터가 Kinesis Data Streams에서 Kinesis Data Firehose로 수신되는지 알 수 있습니다. 데이터 지표에 대한 자세한 내용은 Kinesis Data Streams를 통한 데이터 수집을 참조하십시오. 값이 0인 경우, Kinesis Data Streams와 Kinesis Data Firehose 사이에 오류가 발생한 것이 아니라 Amazon ES에 전송하는 데 오류가 발생했다는 뜻일 수 있습니다.

또한 Kinesis Data Firehose에 대한 PutRecordPutRecordBatch API 호출이 적절하게 호출되었는지 확인하는 방법도 있습니다. 수신되는 데이터 흐름을 확인할 수 없는 경우, PUT 작업을 수행 중인 생산자를 확인합니다. 생산자 애플리케이션 문제를 해결하는 데 대한 자세한 내용은 Amazon Kinesis Data Streams 생산자 문제 해결을 참조하십시오.

Kinesis Data Firehose 로그가 비활성화됨

Kinesis Data Firehouse에서 로깅이 활성화되어 있어야 합니다. 그렇지 않은 경우, 오류 로그로 인해 전송에 실패할 수 있습니다. 그런 다음 CloudWatch Logs에서 /aws/kinesisfirehose/delivery-stream-name 로그 그룹 이름을 확인합니다.

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에 퍼블릭 Amazon ES 대상에 대한 액세스를 허용했어야 합니다. 데이터 변환 기능을 사용 중인 경우, AWS Lambda에 대한 액세스도 허용해야 합니다.

적절한 권한 부족

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*"
               }
           }
        }

Amazon ES 액세스에 권한을 허용하기 위해 이 예제와 같이 정책을 업데이트할 수 있습니다.

 {
           "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"
          ]
       }

AWS Lambda 함수 호출 문제

Kinesis Data Firehose의 ExecuteProcessing.Success and Errors 지표를 확인하여 Kinesis Data Firehose가 함수를 호출했는지 확인합니다. Kinesis Data Firehose가 Lambda 함수를 호출하려 시도하지 않은 경우, 호출 시간을 확인하여 호출 시간이 제한 시간 파라미터를 넘기지 않았는지 확인합니다. Lambda 함수를 시간 내에 완료하려면 제한 시간 값이 더 커야 하거나 메모리가 더 필요할 수 있습니다. 호출 지표에 대한 자세한 내용은 호출 지표 사용을 참조하십시오.

Kinesis Data Firehose가 Lambda 함수를 호출하지 않는 이유를 파악하려면 Amazon CloudWatch Logs 그룹에서 /aws/lambda/lamdba-function-name을 확인합니다. 데이터 변환이 실패하면 실패한 레코드가 S3 버킷으로, processing-failed 폴더에 백업으로 전송됩니다. S3 버킷에 보관된 레코드에는 실패한 호출에 대한 오류 메시지도 포함됩니다. Lambda 호출 실패 문제를 해결하는 데 대한 자세한 내용은 데이터 변환 실패 처리를 참조하십시오.

Amazon ES 도메인 상태 문제

다음과 같은 지표를 검사하여 Amazon ES의 상태가 양호한지 확인합니다.

  • CPU 사용률: 이 지표가 일관되게 높은 값인 경우, 데이터 노드가 각종 요청이나 수신되는 데이터에 응답하지 못할 수 있습니다. 이 경우 클러스터를 확장/축소해야 할 수도 있습니다.
  • JVM 메모리 압력: JVM 메모리 압력이 일관되게 80%를 초과한 상태로 유지되는 경우, 클러스터가 메모리 회로 차단기 예외를 트리거할 수 있습니다. 이러한 예외 대문에 데이터가 인덱싱되지 않을 수 있습니다.
  • ClusterWriteBlockException: 이것은 인덱싱 블록의 일종으로, 도메인이 심한 JVM 메모리 압력을 받고 있거나 스토리지 공간이 더 필요한 경우 발생합니다. 데이터 노드 하나에 공간이 없다면, 새로운 데이터를 하나도 인덱싱할 수 없습니다. Amazon ES 문제를 해결하는 데 대한 자세한 내용은 Amazon Elasticsearch Service 문제 해결을 참조하십시오.

이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?