IaaS/퍼블릭클라우드

(AWS) CloudWatch Filter를 사용하여 향상된 로그 관리

armyost 2022. 3. 15. 06:59
728x90

로그 필터링

사용방법

1. [AWS Console]-[CloudWatch]-[로그그룹]에 접속

2. 필터링할 로그그룹 선택

3. "Actions"-"지표 필터 생성" 선택

필터 패턴에 사용할 필터 패턴을 입력합니다. 아래 필터 패턴 작성 규칙 참조

https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html

 

필터 및 패턴 구문 - Amazon CloudWatch Logs

패턴 일치를 사용하는 공백으로 구분된 지표 필터를 생성하는 경우, 용어 순서를 지정한 후 빈 표시기를 포함해야 합니다. 예를 들어, 첫 번째 단어가 ERROR인 로그 이벤트를 반환하는 지표 필터

docs.aws.amazon.com

필자는 다음과 같이 입력하였습니다.

[host, logName, user, timestamp, request, statusCode=404, size]

4. Select Log Data to Test에서 테스트할 데이터 선택 후 필터링한 결과치를 확인

5. 필터 이름을 입력하고 등록. 완료.

※ "필터"에서 "Create Alarm"을 클릭하면 해당 필터를 이용한 알람을 만들 수 있다.


Kinesis DataStream 사용량을 CloudWatch로 관리하기

 

1. [AWS Console]-[CloudWatch]-[Metrics]를 선택합니다.

2. CloudWatch Metrics by Category(범주별 CloudWatch 지표) 창에서 Kinesis Metrics(Kinesis 지표)를 선택합니다.

3. 관련 행을 클릭하여 지정된 MetricName 및 StreamName의 통계를 봅니다.

4. (선택 사항) 그래프 창에서 통계와 기간을 선택한 후 다음 설정을 사용하여 CloudWatch 경보를 생성합니다.

 


AWS 콘솔상에서 메뉴로 제공하는 구독필터는 몇가지 안되지만 다음과 같이 구독필터에 대한 다양한 Usecase를 도 있다. 

 

구독필터 사용 가이드 관련 링크 : https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/SubscriptionFilters.html

 

CloudWatch Logs 구독 필터 사용 - Amazon CloudWatch Logs

CloudWatch Logs 구독 필터 사용 Kinesis, Lambda 또는 Kinesis Data Firehose에서 구독 필터를 사용할 수 있습니다. 구독 필터를 통해 수신 서비스로 전송되는 로그는 base64로 인코딩되고 gzip 형식으로 압축됩니

docs.aws.amazon.com

 

 

CloudWatch Log를 Kinesis에 Streaming하기 (Kinesis DataStreaming 구독 필터 사용)

 

1. [AWS Console]-[Kinesis]에서 Kinesis DataStream 생성

2. Kinesis 스트림이 Active 상태에 있고 IAM 역할을 생성하고 나면 CloudWatch Logs 구독 필터를 생성할 수 있습니다. 그 즉시 구독 필터는 실시간으로 선택한 로그 그룹에서 Kinesis 스트림으로 로그 데이터를 이동시키기 시작합니다.

$ aws logs put-subscription-filter \
    --log-group-name "CloudTrail/logs" \
    --filter-name "RootAccess" \
    --filter-pattern "{$.userIdentity.type = Root}" \
    --destination-arn "arn:aws:kinesis:region:123456789012:stream/RootAccess" \
    --role-arn "arn:aws:iam::123456789012:role/CWLtoKinesisRole"

AWS Lambda에 대한 구독 필터 사용

 

1. AWS Lambda 함수를 생성합니다

2. 텍스트 편집기를 열고 helloWorld.js라는 파일을 생성합니다.

var zlib = require('zlib');
exports.handler = function(input, context) {
    var payload = Buffer.from(input.awslogs.data, 'base64');
    zlib.gunzip(payload, function(e, result) {
        if (e) { 
            context.fail(e);
        } else {
            result = JSON.parse(result.toString());
            console.log("Event Data:", JSON.stringify(result, null, 2));
            context.succeed();
        }
    });
};

 

3. helloWorld.js 파일을 압축하고 helloWorld.zip라는 이름으로 저장합니다.

4. CloudWatch Logs에 함수를 실행할 권한을 부여합니다. 다음 명령을 사용하여 자리 표시자 계정을 자체 계정으로, 자리 표시자 그룹을 처리할 로그 그룹으로 바꿉니다.

$ aws lambda add-permission \
    --function-name "helloworld" \
    --statement-id "helloworld" \
    --principal "logs.region.amazonaws.com" \
    --action "lambda:InvokeFunction" \
    --source-arn "arn:aws:logs:region:123456789123:log-group:TestLambda:" \
    --source-account "123456789012"

 

5. 다음 명령을 사용하여 구독 필터를 생성하여 자리 표시자 계정을 자체 계정으로, 자리 표시자 그룹을 처리할 로그 그룹으로 바꿉니다.

$ aws logs put-subscription-filter \
    --log-group-name myLogGroup \
    --filter-name demo \
    --filter-pattern "" \
    --destination-arn arn:aws:lambda:region:123456789123:function:helloworld

Kinesis Data Firehose에 대한 구독 필터 사용

1. [AWS Console]-[Amazon S3]에서 Amazon Simple Storage Service(Amazon S3) 버킷을 생성합니다. CloudWatch Logs를 위해 특별히 생성한 버킷을 사용하는 것이 좋습니다.

2. [AWS Console]-[Kinesis Data Firehose]에서 Kinesis Data Firehose전송 시스템을 생성. 이때 방금 생성한 S3 버킷을 선택합니다.

3. Amazon Kinesis Data Firehose 전송 스트림이 활성 상태가 되고 IAM 역할을 생성하고 나면 CloudWatch Logs 구독 필터를 생성할 수 있습니다. 그 즉시 구독 필터는 실시간으로 선택한 로그 그룹에서 Amazon Kinesis Data Firehose 전송 스트림으로 로그 데이터를 이동시키기 시작합니다.

$ aws logs put-subscription-filter \
    --log-group-name "CloudTrail" \
    --filter-name "Destination" \
    --filter-pattern "{$.userIdentity.type = Root}" \
    --destination-arn "arn:aws:firehose:region:123456789012:deliverystream/my-delivery-stream" \
    --role-arn "arn:aws:iam::123456789012:role/CWLtoKinesisFirehoseRole"