본문 바로가기

DevOps

[AWS] CloudWatch Logs 이용하여 로그 수집

CloudWatch Logs 에이전트 설치 및 구성

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

인스턴스에 IAM 역할 할당

(CloudWatchAgentServerPolicy에 포함되어 있음)

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

ssh 연결 후

$ sudo yum update -y
$ sudo yum install -y awslogs

에이전트 구성 파일을 작성합니다. 구성파일에서는 추적할 로그를 구성합니다.

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

# 모든 로그 스트림에 적용되는 공통 구성
[general]
state_file = /var/lib/awslogs/agent-state # 상태 파일이 저장되는 저장소
logging_config_file = value
use_gzip_http_content_encoding = [true | false]

# 원격 로그 스트림에 로컬 파일을 전송하는 데 필요한 정보 정의
# 섹션은 여러 개 정의 가능, 고유한 이름 가져야 함(logstream1)
[logstream1]
log_group_name = value # 로그 그룹 이름, 자동으로 생성 됨
log_stream_name = value # 로그 스트림 이름, 자동으로 생성 됨 ({instance_id}, {hostname}, {ip_address})
datetime_format = value # 로그 이벤트를 검색하고 지표를 생성하는 데 사용
time_zone = [LOCAL|UTC] # 타임스탬프의 시간대
file = value # CloudWatch Logs에 푸시하고 싶은 로그 파일 지정, 특정 파일 또는 여러 개의 파일(/var/log/system.log*)
file_fingerprint_lines = integer | integer-integer # 몇 번째줄로 지문 산출 할 것인가
multi_line_start_pattern = regex | {datetime_format} # 로그 메시지의 시작을 식별하기 위한 패턴 지정
initial_position = [start_of_file | end_of_file] # 데이터 읽기를 시작할 지점
encoding = [ascii|utf_8|..]
buffer_duration = integer # 로그 이벤트를 일괄 처리하는 기간, 기본 5,000ms
batch_count = integer # 일괄 처리할 로그 이벤트의 최대 수
batch_size = integer # 일괄 처리할 로그 이벤트의 최대 크기를 바이트로 지정

[logstream2]
...

다음은 작성 예시입니다.

[general]
state_file = /var/lib/awslogs/agent-state 

[/var/log/messages]
log_group_name = /var/log/messages
log_stream_name = {instance_id}
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
initial_position = start_of_file

[/var/log/secure]
log_group_name = /var/log/secure
log_stream_name = {instance_id}
datetime_format = %b %d %H:%M:%S
file = /var/log/secure
buffer_duration = 5000
initial_position = start_of_file

[/var/log/cron]
log_group_name = /var/log/cron
log_stream_name = {instance_id}
datetime_format = %b %d %H:%M:%S
file = /var/log/cron
buffer_duration = 5000
initial_position = start_of_file

[/var/log/boot.log]
log_group_name = /var/log/boot.log
log_stream_name = {instance_id}
datetime_format = %b %d %H:%M:%S
file = /var/log/boot.log
buffer_duration = 5000
initial_position = start_of_file

기본적으로 /etc/awslogs/awscli.conf는 us-east-1 리전을 가리킵니다. 다른 리전으로 로그를 푸시하려면 awscli.conf 파일을 편집하고 해당 리전을 지정합니다.

awslogs 서비스를 시작합니다. (Amazon Linux 2)

$ sudo systemctl start awslogsd

# 시스템 부팅시 서비스 시작
$ sudo systemctl enable awslogsd.service

에이전트를 중지하려면

$ sudo service awslogsd stop

AWS 서비스 > CloudWatch > 로그 > 로그 그룹 > /var/log/messages 에서 확인