CloudWatch Logs가 Amazon ES 도메인으로 스트리밍되도록 문제를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 8월 17일

Amazon CloudWatch Logs를 Amazon Elasticsearch Service(Amazon ES) 도메인으로 스트리밍할 수 없습니다. 이 문제를 해결하려면 어떻게 해야 합니까?

​해결 방법

여러 CloudWatch 로그 그룹을 동일한 Amazon ES 도메인으로 스트리밍할 수 없습니다.

기본적으로 CloudWatch는 각 Amazon ES 도메인마다 하나의 AWS Lambda 함수만 생성합니다. 여러 로그 그룹을 설정하여 단일 Amazon ES 도메인으로 데이터를 인덱싱하는 경우, 여러 로그 그룹이 모두 동일한 Lambda 함수를 호출합니다. 첫 번째 로그 그룹이 Lambda 함수를 호출하면 해당 호출이 Amazon ES 도메인에 인덱스 및 유형 필드를 생성합니다.

Elasticsearch 버전 6.0 이상에서는 한 개의 매핑 유형만 있을 수 있습니다. Elasticsearch 버전 5.x~6.x에도 동일한 규칙이 적용됩니다. Elasticsearch 매핑 유형에 대한 자세한 내용은 Elasticsearch 웹 사이트의 매핑 유형이란 무엇입니까?를 참조하십시오.

다른 로그 그룹이 동일한 Lambda 함수를 호출하려는 경우, 호출이 실패하고 다음 오류 메시지가 표시됩니다.

"reason": "Rejecting mapping update to [<index_name>] as the final mapping would have more than 1 type: [log-group-1, log-group-2]”

이 문제를 해결하려면 다음 구문으로 AWS Lambda 함수를 업데이트하십시오.

       var indexName = [
        'cwl-' + payload.logGroup.toLowerCase().split('/').join('-') + '-' + timestamp.getUTCFullYear(),
        ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),
        ('0' + timestamp.getUTCDate()).slice(-2) 
        ].join('.');

이 구문은 Amazon ES 도메인으로 스트리밍되는 다양한 로그 그룹에 대해 여러 인덱스를 생성합니다. 그런 다음 업데이트된 Lambda 함수를 저장하여 Amazon ES 도메인으로 스트리밍되는 여러 로그 그룹에 대해 별도의 인덱스를 생성합니다.

동일한 AWS 계정에서 VPC 기반 Amazon ES 도메인으로 스트리밍할 수 없습니다.

중요: CloudWatch 로그 그룹을 VPC 기반 Amazon ES 도메인으로 스트리밍하기 전에 AWS Identity and Access Management(IAM)역할 정책을 업데이트해야 합니다. 해당 Lambda 함수에 연결된 IAM 역할에는 AWSLambdaVPCAccessExecutionRole 정책이 연결되어 있어야 합니다.

다음은 JSON 형식의 AWSLambdaVPCAccessExecutionRole 정책입니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DeleteNetworkInterface"
            ],
            "Resource": "*"
        }
    ]
}

참고: 이 관리형 정책을 사용하면 Lambda 함수가 CloudWatch 로그 그룹을 VPC에서 Elasticsearch 클러스터에 작성할 수 있습니다.

정책을 Lambda 함수에 연결한 후 VPC에서의 Amazon ES 도메인으로 로그를 스트리밍하기 시작합니다.

세분화된 액세스 제어가 활성화되는 경우 CloudWatch 로그 그룹을 Amazon ES 도메인으로 스트리밍할 수 없습니다.

세분화된 액세스 제어로 CloudWatch Logs를 Amazon ES 도메인으로 스트리밍하는 경우, 다음과 같은 권한 오류가 발생할 수 있습니다.

"{\"statusCode\":403,\"responseBody\":{\"error\":{\"root_cause\":[{\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_elasticsearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_elasticsearch_execution], requestedTenant=null]\"}],\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_elasticsearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_elasticsearch_execution], requestedTenant=null]\"},\"status\":403}}"

참고: 기본적으로 Amazon ES는 Lambda 함수를 생성합니다.

Lambda 함수 로그에서 이 오류 메시지를 수신하면 역할 매핑이 불완전함을 의미입니다. 역할 매핑에 대한 자세한 내용은 사용자에게 역할 매핑을 참조하십시오.

오류 메시지를 해결하려면 다음 단계를 수행합니다.

1.    Kibana를 엽니다. Amazon ES 콘솔의 도메인 요약에서 Kibana에 대한 링크를 찾을 수 있습니다.

2.    왼쪽 탐색 창에서 잠금 아이콘을 선택합니다.

3.    역할 매핑을 선택합니다.

4.    all_accesssecurity_manager를 역할로 선택합니다.

참고: all_access 역할은 Elasticsearch 클러스터에 대한 액세스만 제공합니다. 자신의 사용 사례에 따라 Elasticsearch 클러스터에 세분화된 액세스 제어를 추가할 수도 있습니다.

5.    all_access에 대한 매핑을 편집합니다.

6.    백엔드 역할에 대해 Lambda 함수의 실행 역할을 추가하고 제출을 선택합니다. 이제 로그가 Amazon ES 도메인으로 스트리밍됩니다.

cluster_block_exception 오류가 발생합니다.

클러스터 블록 예외는 다음과 같은 원인으로 발생합니다.

  • 여유 스토리지 공간 부족
  • 과도한 JVM 메모리 압력

클러스터 블록 예외 문제 해결에 대한 자세한 내용은 ClusterBlockException을 참조하십시오.


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


결제 또는 기술 지원이 필요합니까?