Cloudwatch Agent로 EC2 모니터링
Cloudwatch에서는 Agent의 설치를 통해 컴퓨팅 서비스에 대한 상세한 모니터링을 지원한다.
EC2 인스턴스와 같은 AWS 자체 컴퓨팅 서비스부터, on-premise 환경의 서버에도 Agent를 설치해 Cloudwatch에서 모니터링이 가능하다.
간단하게 Ubuntu 인스턴스에 Cloudwatch Agent를 설치 후, SSH 접근 로그와 같은 내용들의 모니터링을 진행해본다.
IAM role 연결
Cloudwatch Agent는 인스턴스로부터 데이터를 받아와 Cloudwatch에 metric을 write하므로, 이에 대한 권한이 필요하다.
인스턴스에 Cloudwatch Agent를 사용하기 위해 IAM role을 연결해주어야한다.
IAM > 역할 > 역할 만들기
EC2에 붙일 Role임으로 EC2를 선택
'CloudWatchAgentServerPolicy' 권한을 선택
이 권한을 추가함으로써 Agent가 Cloudwatch 서비스에 접근할 수 있는 권한을 갖는다.
Agent 설치
설치하고자 하는 EC2의 OS에 맞게 agent파일을 다운로드
OS별 다운로드 링크는 아래에서 확인할 수 있다.
Ubuntu환경에서 설치를 진행하므로 다음과 같이 다운로드 및 설치를 진행한다.
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
Agent Configuration
Agent가 설치되면 configuration 파일을 작성하고 동작을 시켜야한다.
configuration 파일은 json 포맷으로 되어있으며, 어떤 로그와 지표를 수집할지의 내용부터 cloudwatch에서의 보관 주기 등등을 설정할 수 있다. 이 설정파일은 직접 작성할 수 있으나 내용이 많아 번거롭다.
따라서 agent 설치와 동시에 config-wizard라는 설정마법사도 같이 제공이 된다.
config-wizard의 실행은 아래와 같다.
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
config-wizard를 실행하면 configuration 파일 설정을 위한 Question이 계속해서 나온다.
각 문항별 내용은 아래와 같으며, 질문의 답은 cli로 바로 입력해주면 된다.
## Agent가 실행될 OS
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:
Trying to fetch the default region based on ec2 metadata...
## Agent 실행 환경이 EC2인가 온프레미스인가
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
## Agent의 실행 user
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
## StatsD daemon의 사용여부
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2
## CollectD daemon의 사용여부
Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
1. yes
2. no
default choice: [1]:
## CPU, 메모리와 같은 자원을 모니터링 여부
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
## CPU의 코어단위 모니터링 여부
Do you want to monitor cpu metrics per core?
1. yes
2. no
default choice: [1]:
## ec2 차원 정보들을 지표에 추가여부
Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:
## 인스턴스ID 정보를 cloudwatch에서 집계여부
Do you want to aggregate ec2 dimensions (InstanceId)?
1. yes
2. no
default choice: [1]:
## 지표 수집의 time interval
Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
## 수집할 지표의 기본값 설정, Basic은 메모리와 disk 용량만 포함
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
Current config as follows:
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"metrics": {
"aggregation_dimensions": [
[
"InstanceId"
]
],
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"collectd": {
"metrics_aggregation_interval": 60
},
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
}
}
}
}
## 이 설정대로 사용?
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:
## 기존의 CloudWatch Log Agent 설정파일을 import 할것인가?
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
## 로그파일 모니터링 여부
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
## 모니터링할 파일명
Log file path:
/var/log/auth.log
## 로그 그룹이름 설정, 웹 콘솔로 미리 로그그룹을 만들어두었을 경우 그 이름을 입력해서 사용가능, 다른이름을 넣으면 새로 생성됨
Log group name:
default choice: [auth.log]
demo_server_authlog
## 로그 스트림 이름 설정, 디폴트 값으로 모니터링 할 인스턴스의 id가 들어감
Log stream name:
default choice: [{instance_id}]
## 로그 그룹의 보존일, -1 == 영구보존
Log Group Retention in days
1. -1
2. 1
3. 3
4. 5
5. 7
6. 14
7. 30
8. 60
9. 90
10. 120
11. 150
12. 180
13. 365
14. 400
15. 545
16. 731
17. 1827
18. 2192
19. 2557
20. 2922
21. 3288
22. 3653
default choice: [1]:
## 설정할 로그파일이 더 있으면 1
Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/auth.log",
"log_group_name": "demo_server_authlog",
"log_stream_name": "{instance_id}",
"retention_in_days": -1
}
]
}
}
},
"metrics": {
"aggregation_dimensions": [
[
"InstanceId"
]
],
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"collectd": {
"metrics_aggregation_interval": 60
},
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
}
}
}
}
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.
## SSM관련 서비스 사용할 것인가?, SSM 사용하려면 IAM role에 ssm 권한을 추가해줘야함
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
2
Program exits now.
wizard로 생성한 configuration 파일은 /opt/aws/amazon-cloudwatch-agent/bin/config.json에 존재한다.
Agent 실행
Agent 실행은 다음과 같다.
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
바로 Agent를 실행하는 경우 다음과 같은 에러를 만난다.
...
Configuration validation first phase succeeded
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Configuration validation second phase failed
======== Error Log ========
2023-07-16T13:35:45Z E! [telegraf] Error running agent: Error loading config file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml: error parsing socket_listener, open /usr/share/collectd/types.db: no such file or directory
config 설정 시 CollectD와 관련된 설정을 해준 경우에 발생하는 문제로, 문제가 된 파일(/usr/share/collectd/types.db)을 직접 생성해줌으로 해결할 수 있다.
root@ip-172-31-37-20:/home/ubuntu# mkdir /usr/share/collectd
root@ip-172-31-37-20:/home/ubuntu# touch /usr/share/collectd/types.db
root@ip-172-31-37-20:/home/ubuntu# 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
****** processing amazon-cloudwatch-agent ******
I! Trying to detect region from ec2 D! [EC2] Found active network interface Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp
Start configuration validation...
2023/07/16 13:36:43 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp ...
2023/07/16 13:36:43 I! Valid Json input schema.
I! Detecting run_as_user...
I! Trying to detect region from ec2
D! [EC2] Found active network interface
No csm configuration found.
Configuration validation first phase succeeded
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Configuration validation second phase succeeded
Configuration validation succeeded
amazon-cloudwatch-agent has already been stopped
Created symlink /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service → /etc/systemd/system/amazon-cloudwatch-agent.service.
Agent의 상태확인 command는 아래와 같다.
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
Agent를 통해서 쌓인 데이터는 cloudwatch의 로그그룹에서 확인할 수 있다.
config 파일 생성 시 설정한 로그그룹의 이름아래, 로그 스트림이 생성되었음을 볼 수 있다.
다음으로 Cloudwatch Agent로 수집된 지표들을 확인하는 방법이다.
위에서 agent config 세팅 중간에 metric과 관련된 설정이 있었다. 기본값을 Basic을 선택하고 넘어갔었는데, 다른 선택지들에 대한 수집항목은 다음과 같다.
기본값 단계 | 포함되는 지표 |
Basic | 메모리 사용량 (%), 디스크 사용량 (%) |
Standard | 메모리 사용량 (%), 디스크 사용량 (%), CPU 관련, 디스크 IO, 스왑 사용량 |
Advanced | 메모리 사용량 (%), 디스크 사용량 (%), CPU 관련, 디스크 IO, 스왑 사용량, TCP 관련 |
일반적인 상황에서는 Basic 정도면 충분할 듯하다. 메모리 사용량과 디스크 사용량은 모니터링 필수 항목이므로...
Cloudwatch 콘솔 > 지표 > 모든 지표에서 CWAgent에 설정한 Agent들로부터 받아요는 지표데이터들을 볼 수 있다.