EC2에서 cloudwatch 에이전트 활용하여 메트릭 및 로그 수집 (AWS 모니터링 시리즈)

ec2 클라우드 와치 에이전트 설치와 config파일 그리고 수집 보관 주기에 대한 설정까지

June Lim
onthelook
14 min readNov 23, 2023

--

ec2의 로그와 메트릭등을 더 자세하게 보고싶은데 일반 구성으로는 볼 수 없는 상황

환경

아마존리눅스 graviton 인스턴스를 기준으로 구성했습니다.

해결

클라우드 와치 에이전트를 ec2인스턴스 안에서 구성하여 해결한다.

ssh접속으로 해당 인스턴스 터미널에 일단 접속을 합니다.

패키지를 업데이트합니다.

sudo yum update -y

ARM 아키텍처용 Amazon CloudWatch 에이전트를 다운로드

wget <https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/arm64/latest/amazon-cloudwatch-agent.rpm>
sudo yum install amazon-cloudwatch-agent -y

다운로드한 에이전트를 설치하기 위한 명령어

sudo rpm -U ./amazon-cloudwatch-agent.rpm

CloudWatch 에이전트가 설치된 후, CloudWatch 에이전트 구성파일(예: /opt/aws/amazon-cloudwatch-agent/bin/config.json)을 작성하거나 수정하시고 밑의 명령어를 사용하여 에이전트를 시작

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s

config.json

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s

Amazon CloudWatch 에이전트가 구성에 따라 메트릭 및 로그를 수집하고 전송하기 시작합니다

상태 확인하려면

sudo systemctl status amazon-cloudwatch-agent

Cloudwatch Agent 관련 명령

//Agent 중지
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop

//수정한 config.json파일을 사용해 설정 파일 업데이트 후 시작
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json // config.json 은 에이전트 구성 파일

config.json 을 /opt/aws/amazon-cloudwatch-agent/bin 이 경로 안에 넣어줍니다. sudo vim으로 생성할 수 있습니다.

수정 후 config.json

{
"agent": {
"metrics_collection_interval": 60,
"logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log"
},
"metrics": {
"append_dimensions": {
"InstanceId": "${aws:InstanceId}"
},
"metrics_collected": {
"cpu": {
"measurement": [
"cpu_usage_idle",
"cpu_usage_iowait",
"cpu_usage_user",
"cpu_usage_system"
],
"resources": [
"*"
],
"totalcpu": false
},
"mem": {
"measurement": [
"mem_used_percent"
]
},
"netstat": {
"measurement": [
"tcp_established",
"tcp_syn_sent",
"tcp_close_wait"
]
}
}
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/messages",
"log_group_name": "{instance_id}/tailscale-node-1-instance",
"log_stream_name": "{instance_id}/tailscale-node-1/stdin_message",
"timezone": "Local"
},
{
"file_path": "/var/log/secure",
"log_group_name": "{instance_id}/tailscale-node--instance",
"log_stream_name": "{instance_id}/tailscale-node-1/secure",
"timezone": "Local"
},
{
"file_path": "/var/log/boot.log",
"log_group_name": "{instance_id}/tailscale-node-1-instance",
"log_stream_name": "{instance_id}/tailscale-node-1/bootLog",
"timezone": "Local"
}
]
}
}
}
}

이 CloudWatch 에이전트 구성 파일은 에이전트, 메트릭 및 로그의 세 가지 주요 섹션이 있습니다.

  1. “에이전트”: 이 섹션은 에이전트의 동작을 구성합니다. 두 가지 속성이 있습니다.
  • “metrics_collection_interval”: 60 — 에이전트가 메트릭을 수집하는 간격을 초 단위로 설정합니다. 이 경우 60초마다 메트릭을 수집하도록 설정됩니다.
  • “logfile”: “/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log” — 에이전트 로그 파일의 파일 경로를 설정합니다.

2. “metrics”: 이 섹션은 메트릭 데이터 수집을 구성합니다. 세 가지 속성이 있습니다.

  • “append_dimensions”: 수집된 메트릭에 추가 차원을 추가할 수 있습니다. 이 경우 “InstanceId” 차원에 “${aws:InstanceId}” 값이 추가됩니다.
  • “metrics_collected”: 에이전트가 수집할 메트릭 목록입니다. 이 구성에서 에이전트는 CPU, 메모리 및 네트워크 통계와 관련된 메트릭을 수집합니다.
  • “cpu”: 모든 리소스에 대한 CPU 사용량 메트릭(cpu_usage_idle, cpu_usage_iowait, cpu_usage_user, cpu_usage_system)을 수집합니다.
  • “mem”: 메모리 사용량 메트릭을 수집합니다(mem_used_percent).
  • “netstat”: 네트워크 통계(tcp_established, tcp_syn_sent, tcp_close_wait)를 수집합니다.

3. 로그: 이 섹션은 로그 데이터 수집을 구성합니다.

  • “logs_collected”: 이 속성은 수집할 로그를 정의합니다. 이 경우 에이전트는 세 개의 서로 다른 파일에서 로그를 수집하여 각각의 로그 그룹 및 스트림으로 보냅니다.
  • “/var/log/messages”: “{instance_id}/tailscale-node-1-instance” 로그 그룹 및 “{instance_id}/tailscale-node-1/stdin_message” 로그 스트림으로 전송됨 .
- "/var/log/messages":

- 이 로그 파일에는 일반적으로 시스템 서비스 및 사용자 수준 응용 프로그램의 활동과 같은 시스템 작동과 관련된 중요하지 않은 이벤트를 포함하는 일반 시스템 메시지 및 정보 로그가 포함됩니다. Unix 계열 시스템의 공통 로그 파일이며 관리자가 시스템의 전반적인 상태를 모니터링하는 데 도움이 됩니다.

“/var/log/secure”: “{instance_id}/tailscale-node-1-instance” 로그 그룹 및 “{instance_id}/tailscale-node-1/secure” 로그 스트림으로 전송됩니다.

“/var/log/secure”

  • 이 로그 파일은 특히 시스템의 보안 관련 이벤트를 위한 것입니다. 여기에는 사용자 로그인, 실패한 로그인 시도, sudo 명령 사용 및 모든 보안 관련 변경과 같은 인증, 권한 부여 및 기타 보안 메커니즘과 관련된 로그가 포함됩니다.
  • 이 로그는 시스템의 보안 관련 활동을 모니터링하고 감사하는 데 유용합니다.

“/var/log/boot.log”: “{instance_id}/tailscale-node-1-instance” 로그 그룹 및 “{instance_id}/tailscale-node-1/bootLog” 로그 스트림으로 전송됨 .

“/var/log/boot.log”

  • 이 로그 파일은 시스템 부팅 프로세스에 대한 정보를 기록합니다. 여기에는 커널, 시스템 서비스 및 시작 프로세스와 관련된 기타 구성 요소의 메시지를 포함하여 부팅 시퀀스 중에 생성된 로그가 포함됩니다.
  • 이 로그 파일은 부팅 관련 문제를 진단하고 시스템 시작 중 이벤트 순서를 이해하는 데 유용합니다.

수집되는 것들에 대하여

1. 지표

  • CPU 메트릭: 인스턴스의 모든 CPU 리소스에 대한 cpu_usage_idle, cpu_usage_iowait, cpu_usage_user 및 cpu_usage_system.
  • 메모리 지표: mem_used_percent

이러한 지표는 “metrics_collection_interval” 매개변수에 지정된 대로 60초마다 수집됩니다.

2. 로그

  • 에이전트는 EC2 인스턴스의 /var/log/messages 파일에서 로그를 수집합니다.
  • 로그는 “cloudwatch-monitoring-instance”라는 로그 그룹 아래의 CloudWatch Logs 서비스에 저장됩니다.
  • 로그 스트림 이름은 인스턴스 ID 뒤에 “/messages”가 붙습니다(예: “i-1234567890abcdef0/messages”)

/var/log/messages 파일의 로그에는 일반적으로 커널 메시지, 시스템 데몬 메시지 및 기타 시스템 로그 항목과 같은 시스템 관련 정보가 포함됩니다. 로그의 구체적인 내용은 시스템 구성과 인스턴스에서 발생하는 이벤트에 따라 다를 수 있습니다.

수집된 로그를 보려면 AWS Management Console에서 Amazon CloudWatch 콘솔로 이동하십시오. 왼쪽 사이드바에서 “로그”로 이동한 다음 “cloudwatch-monitoring-instance” 로그 그룹을 선택합니다. 그런 다음 해당 로그 그룹 내에서 로그 스트림과 해당 콘텐츠를 탐색할 수 있습니다.

config.json에서 더 수집해볼만 한 것

https://kim-dragon.tistory.com/109

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html

위 링크 참고했습니다.

netstat: 네트워크 연결 통계를 수집합니다.

"netstat": {
"measurement": [
"tcp_established",
"tcp_syn_sent",
"tcp_close_wait"
]
}

disk: 공간 사용량, I/O 작업 등과 같은 디스크 관련 메트릭을 수집합니다

"disk": {
"measurement": [
"used_percent",
"inodes_free"
],
"resources": [
"*"
],
"ignore_file_system_types": [
"sysfs",
"devtmpfs"
]
}

amazon linux 로그 보관 주기

linux 운영체제에 할당되어있는 저장공간이 무한하지 않기 때문에 생성되는 Log를 지속적으로 지워줘야 합니다.

이것을 담당하는 것이 logroate입니다. Amazonlinux2의 경우 /etc/logrotate.conf 에 설정이 아래와 같이 설정이 되어있으며

이를 해석하면 일주일별로 로그 파일을 관리하며, 최근 4주치의 로그까지만 저장됩니다.

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}

/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}

이 logrotate 설정 파일은 시스템의 로그 파일 회전을 관리하기 위해 설정되어 있습니다. 구성은 대부분의 사용 사례에 적합해 보이지만, 필요에 따라 수정할 수 있습니다.

  1. weekly: 로테이션 간격을 주간으로 설정합니다. 로그 파일은 매주 한 번 로테이션합니다.
  2. rotate 4: 로그 파일 백업을 4주분 보관합니다. 더 오래된 백업은 제거됩니다.
  3. create: 이 지시문은 이전 로그 파일을 회전한 후 새로운 빈 로그 파일을 생성합니다.
  4. dateext: 로테이션 된 로그 파일에 날짜 접미사를 추가합니다(예: logfile-20230423).
  5. #compress: 이 지시문은 주석 처리되어 있습니다. 활성화를하면 로테이션 된 로그 파일을 압축하여 공간을 절약할 수 있습니다.
  6. include /etc/logrotate.d: /etc/logrotate.d 디렉토리에 있는 logrotate 구성 파일을 포함합니다. 이는 일반적으로 로그 파일을 관리해야 하는 설치된 패키지에서 제공됩니다.
  7. /var/log/wtmp 및 /var/log/btmp 블록: 이 두 블록은 각각 wtmp 및 btmp 로그 파일의 로테이션을 구성합니다. 두 로그 파일 모두 월별로 로테이션 되며, wtmp의 경우 회전 전 최소 크기가 1MB로 설정되어 있습니다. create 지시문은 새 로그 파일의 권한과 소유자를 지정하고, rotate 지시문은 보관할 백업 수를 설정합니다(이 경우에는 1개만 보관).

참고: https://kim-dragon.tistory.com/109

시간대 변경

timezone에서 Local로 수정 후 한국시간으로 로그에 잘 찍혀 나오는걸 확인할 수 있습니다.

--

--