CloudWatch 로그가 내 OpenSearch Service 도메인으로 스트리밍되도록 하여 문제를 해결하려면 어떻게 해야 합니까?

5분 분량
0

Amazon CloudWatch 로그를 아마존 OpenSearch Service 도메인으로 스트리밍할 수 없습니다.

해결 방법

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

기본적으로 Amazon CloudWatch는 각 OpenSearch Service 도메인에 대해 하나의 AWS Lambda 함수만 생성합니다. 도메인에 데이터를 인덱싱하기 위해 여러 로그 그룹을 설정하면 여러 로그 그룹이 모두 동일한 Lambda 함수를 호출합니다. 첫 번째 로그 그룹이 Lambda 함수를 호출하면 도메인에 인덱스와 유형 필드가 생성됩니다.

OpenSearch Service 6.0.0 이상에서 생성된 인덱스는 하나의 매핑 유형만 포함할 수 있습니다. 5.x에서 여러 매핑 유형으로 생성된 인덱스는 OpenSearch Service 6.x에서도 계속 작동합니다. OpenSearch Service 매핑 유형 사용 중단에 대한 자세한 내용을 보려면 Elastic 웹 사이트에서 매핑 유형 제거를 참조하세요.

다른 로그 그룹이 동일한 Lambda 함수를 호출하려고 하면 호출이 실패하고 다음 오류가 발생합니다.

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

이 문제를 해결하려면 먼저 다음 구문을 사용하여 Lambda 함수를 업데이트하세요.

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

이 구문은 OpenSearch Service 도메인으로 스트리밍되는 다양한 로그 그룹에 대해 여러 인덱스를 생성합니다.

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

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

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

다음은 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의 클러스터에 쓸 수 있습니다.

정책을 Lambda 함수에 연결한 후, VPC의 OpenSearch Service 도메인으로 로그 스트리밍을 시작할 수 있습니다.

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

세분화된 액세스 제어로 CloudWatch 로그를 OpenSearch Service 도메인에 스트리밍하는 경우 다음과 비슷한 오류가 발생할 수 있습니다.

"{\"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_opensearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_opensearch_execution], requestedTenant=null]\"}],\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_opensearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_opensearch_execution], requestedTenant=null]\"},\"status\":403}}"

Lambda 함수 로그에서 이 오류 메시지를 수신했다면 역할 매핑이 완료되지 않은 것입니다.

**참고:**기본적으로 OpenSearch Service는 Lambda 함수를 자동으로 생성합니다.

7.9 이상(OpenSearch 버전 1.x 포함)을 실행하는 OpenSearch Service 도메인

오류 메시지를 해결하려면 다음 단계를 완료하세요.

1.    OpenSearch 대시보드를 엽니다. OpenSearch Service 콘솔의 도메인 요약에서 OpenSearch 대시보드로 연결하는 링크를 찾을 수 있습니다.

2.    탐색 창에서 보안을 선택합니다.

3.    역할을 선택합니다.

4.    all\ _access 역할을 선택합니다.

5.    매핑된 사용자 탭을 선택합니다.

6.    매핑된 사용자 대화 페이지에서 매핑 관리를 선택합니다.

7.    백엔드 역할에서 Lambda 함수 실행 역할 ARN을 입력합니다.

8.    을 선택합니다. 로그가 이제 OpenSearch Service 도메인으로 스트리밍됩니다.

역할 매핑에 대한 자세한 내용을 보려면 사용자에게 역할 매핑을 참조하세요.

7.8 이하 버전을 실행하는 OpenSearch Service 도메인

오류 메시지를 해결하려면 다음 단계를 완료하세요.

1.    OpenSearch 대시보드를 엽니다. OpenSearch Service 콘솔의 도메인 요약에서 OpenSearch 대시보드로 연결하는 링크를 찾을 수 있습니다.

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

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

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

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

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

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

CloudWatch 로그가 OpenSearch Service 도메인으로 전송되지 않습니다.

기본 Lambda 함수를 사용하여 CloudWatch 로그를 OpenSearch Service 도메인으로 스트리밍하는 경우 다음 오류가 발생할 수 있습니다.

"errorMessage": "{\"statusCode\":200,\"responseBody\":{\"took\":42,\"errors\":true}}","

**참고:**기본적으로 Lambda 오류는 200 OK 응답으로 반환됩니다.

이 오류 메시지를 해결하려면 다음 단계를 완료하세요.

1.    기본 Lambda 함수를 엽니다.

2.    다음 코드 줄을 찾으세요.

"var logFailedResponses = false;"

3.    var logFailedResponses 값을 true로 업데이트합니다. 이 업데이트는 Lambda 함수를 사용하는 모든 새 인덱싱 요청에 대한 추가 정보를 제공합니다. 추가 정보를 사용하여 색인 생성 문제의 원인을 식별할 수 있습니다.

cluster_block_exception 오류가 발생합니다.

사용 가능한 스토리지 공간이 부족하거나 JVM 메모리가 너무 많이 부족하면 클러스터 블록 예외가 발생합니다.

자세한 내용을 보려면 Amazon OpenSearch Service 클러스터의 높은 JVM 메모리 부족 문제를 해결하려면 어떻게 해야 합니까?를 참조하세요.

CloudWatch 구독 필터가 기본 Lambda 함수(OpenSearch Service 2.0 이상)를 통해 클러스터로 데이터를 전송하지 못합니다.

기본 Lambda 함수를 사용하여 로그를 OpenSearch Service 2.x에 전송하는 CloudWatch 구독 필터가 있는 경우 오류가 발생할 수 있습니다. 구독 필터가 로그를 수집하지 못하고 다음과 같은 오류가 발생하는 경우 비활성화된 파라미터로 인해 오류가 발생한 것입니다.

"{\"statusCode\":400,\"responseBody\":{\"error\":{\"root_cause\":[{\"type\":\"illegal_argument_exception\",\"reason\":\"Action/metadata line [1] contains an unknown parameter [_type]\"}],\"type\":\"illegal_argument_exception\",\"reason\":\"Action/metadata line [1] contains an unknown parameter [_type]\"},\"status\":400}}"

OpenSearch Service 버전 2.0 이상에서는 \ _type 파라미터가 API 엔드포인트에서 제거되었습니다. 이 오류를 해결하려면 Lambda 함수 코드에서 파라미터도 제거해야 합니다.

1.AWS Lambda 콘솔을 엽니다.

2.    구독 필터의 기본 Lambda 함수를 선택합니다.

3.    코드 소스에서 함수의 코드를 확인하세요.

4.    코드에 정의된 변환 함수를 찾으세요. 이 함수 내에서 데이터는 OpenSearch Service의 JSON 인덱싱 형식으로 변환됩니다. 이 코드의 첫 번째 줄은 다음과 같은 코드와 유사합니다.

function transform(payload) {
    if (payload.messageType === 'CONTROL_MESSAGE') {
        return null;
    }

    var bulkRequestBody = '';

    payload.logEvents.forEach(function(logEvent) {
                var timestamp = new Date(1 * logEvent.timestamp);

5.    변환 함수에서 _type 파라미터를 찾으세요. 대부분의 경우 79행에 있습니다. **\ _type ** 파라미터를 추가하는 코드 줄을 제거하거나 주석 처리합니다. 삭제 후 코드는 다음과 같은 코드와 유사합니다.

var action = {
    "index": {}
};
action.index._index = indexName;
//action.index._type = payload.logGroup;
action.index._id = logEvent.id;

bulkRequestBody += [

이제 인덱싱 요청을 성공적으로 보낼 수 있습니다.

AWS 공식
AWS 공식업데이트됨 일 년 전