AWS Tech

CloudWatch logs 구독 설정 및 연결 확인 테스트 (CloudWatch logs를 근 실시간으로 S3 저장-2편 )

Dongwoo Lee 2024. 5. 3. 16:56

전편에서는 1. CloudWatch logs에서 Log group , Log stream 생성  2. Cloudwatch logs 와 S3간의 전송 통로인 Kinesis Firehose Stream 을 구성해 보았습니다.  

 

 

이번편에서 다음에 해야할 일은 log를  Kinesis Firehose Stream 으로 전송하기 위하여 Log group에 구독 필터(= Subscription filters 를 생성하는 작업 입니다. 

 

전에 생성하였던 applicationlog 라는 Log group에서 Subscription filters 탭을 선택하고 Create 버튼을 클릭합니다.

우리는 Kinesis Firehose Stream 을 구독하여 Log를 S3로 보낼 것이기 때문에 Create Amazon Data Firehose subscription filter를 선택합니다.

 

전편에서 생성하였던 Kinesis Firehose Stream 명을 선택합니다. 

전편에서 생성 시 설정 했듯이 해당 Stream은 S3로 log를 .json 파일명 형태로 보내는 주요 특징을 가집니다.

 

 

이제 Cloudwatch logs가 Kinesis Firehose Stream에 log를 보내기 위한 권한을 설정해보겠습니다.

IAM 콘솔에서 Role -> Create Role을 선택합니다.

Trusted entity type -> Custom trust policy 를 선택합니다.

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

를 입력 합니다. 즉 CloudWatch logs 가 사용할 Role 이라는 것을 명시해 줍니다.

 

cloudwatchToKinesisFirehosePolicy 이름으로 Policy를 미리 생성해 둡니다. CloudWatch logs가 우리가 생성한 Kinesis Firehose stream 에만 log를 전송할 수 있도록 권한을 설정합니다. 

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "firehose:PutRecord",
                "firehose:PutRecordBatch"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:firehose:ap-northeast-2:<Account ID>:deliverystream/PUT-S3-IJGYk"
        }
    ]
}

 

Role 명은 cloudwatchToKinesisFirehose 로 해서 Role을 생성하겠습니다. 

 

Role 을 생성한 후 해당 Role을 맵핑 시킵니다.

json 로그 포맷을 다루기 때문에 Log Format을 json으로 선택합니다. 

저는 로그 중 level 이 WARN, ERROR, INFO 인 로그만 S3로 보낼 것이기 때문에 아래 처럼 Subscription filter pattern (=구독 필터 패턴)을 정의하였습니다. 모든 로그를 보낼려면 해당 부분을 설정할 필요는 없습니다.

 

이제 테스트를 위해 로그를 생생해보겠습니다. 전편에 생성하였던 Log stream에서 Create log event 를 클릭 후 두번에 걸쳐 아래 로그를 넣어 봅니다.

 

아래 로그를 보면 "level" : "INFO", "level" : "WARN" 부분이 있습니다. Subscription filter pattern 설정에서 INFO, WARN 은 S3로 보낼 수 있도록 필터링 설정을 하였습니다. 만약 로그에 "level" : "DEBUG" 가 포함되어 있다면 해당 로그는 S3로 전송되지 않을 것 입니다.

 

{
    "timestamp": "2024-04-18T14:01:10.846Z",
    "level": "INFO",
    "thread": "main",
    "logger": "http://m.batch.jobs.insertData",
    "message": "==> Parameters: 20240418(String), TEST(String), April(String), Success(String), 1(String), 10000(String), 05(String), 1(String), 30.0(Double)",
    "context": "default"
}

 

{
    "timestamp": "2024-04-18T14:01:10.846Z",
    "level": "WARN",
    "thread": "main",
    "logger": "http://m.batch.jobs.insertData",
    "message": "==> Parameters: 20240418(String), TEST(String), April(String), Success(String), 1(String), 10000(String), 05(String), 1(String), 30.0(Double)",
    "context": "default"
}

 

log를 생성한후 전편에 설정한(Kinesis Firehose Stream 구성 시 Buffer Interval 설정 한 부분 ) 5분후에 S3에 Json 파일이 생성된 것을 확인할 수 있습니다.

전편에서 Kinesis Firehorse Stream 구성 시 S3 Bucket prefix time zone 을 Seoul 시간으로 하였기 때문에 S3 Prefix가

넵 2024/04/25/17 (=년도/월/일/시간/) 형식으로 생성된 것을 확인 할 수 있습니다. 지속적으로 log가 해당 Log stream 에 쌓이면 5분마다 한번 씩 S3에 파일이 생성됩니다.

 

S3에 저장된 파일을 다운로드 하여 어떤 형태로 log가 저장되어있는 살펴 봅시다.

전편에서 Kinesis Firehorse Stream 설정에서 Turn on message extraction  체크하지 않았기 때문에 log group, log stream 등 Message 외 부가적인 정보들이 아래로에 표시되어 있는 것을 확인 할 수 있습니다. 만약 Turn on message extraction  를 활성화 했다면 아래 로그 중 Message 부분만 log로 저장되게 됩니다.  또한 New line delimiter (새줄구분자추가) 를 활성화였기 때문에 두개의 로그가 다음줄로 구분되어 표시되어있는 것을 볼 수 있습니다. 앞서 언급 하였지만 해당 로그를 Athena 와 연결하여 검색이 필요한 경우 해당 설정을 해야합니다.

 

마지막으로 해당 로그는 근 실시간으로 계속 쌓이는 로그이기 때문에 보관 주기를 고려하여 S3 버킷의 life cylce policy를 설정하여 특정 기간이 지난 log 들은 주기적으로 삭제하는 것을 권고드립니다. 이상으로 Kinesis Firehose Stream을 사용한 Cloudwatch logs를 S3에 저장하는 방법을 마치겠습니다.