
ECS에서 배포를 진행하던 도중, 컨테이너 인스턴스 EC2의 메모리 부족으로 인해 배포에 실패했다. EC2의 메모리는 다른 지표와 다르게 CloudWatch 기본 지표로 제공되지 않는다. 그렇기 때문에 ECS 배포 실패의 이유가 EC2의 메모리 부족임을 빠르게 파악하지 못했다. 또한 매번 EC2 내에 접근해서 메모리 상태를 확인해야 해 번거로움을 느꼈다. 따라서 CloudWatch 사용자 지정 지표를 설정할 필요성을 크게 느꼈다.
EC2의 IAM 인스턴스 프로파일에 CloudWatchAgentServerPolicy 정책을 추가한다.
# cloudWatch Agent 설치
sudo yum install amazon-cloudwatch-agent
# 설치된 마법사 파일이 있는 폴더로 이동
cd /opt/aws/amazon-cloudwatch-agent/bin/
# 마법사 파일 실행
sudo ./amazon-cloudwatch-agent-config-wizard
EC2 내에 접근 후 명령어를 입력해 CloudWatch Agent를 설치한다. 설치 후 CloudWatch Agent 마법사 파일이 있는 위치로 이동해 마법사를 실행한다. 실행 시 아래와 같은 질문이 여러 개 나타나는데, 필요에 따라 적절하게 답변해 설정하면 된다.
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
현재 사용하는 OS를 선택한다. 나는 Amazon linux 2023을 사용하고 있기 때문에 1을 선택했다.
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
EC2 환경이기 때문에 1을 선택한다.
Which user are you planning to run the agent?
1. cwagent
2. root
3. others
Agent를 실행할 사용자를 선택한다.
1을 선택하는 것을 권장한다.
Do you want to turn on StatsD daemon?
1. yes
2. no
StatsD daemon을 사용해 사용자 정의 지표를 수집할 지 선택한다.
나는 memory 지표만 필요하고, 그 외 별도의 지표는 필요하지 않아 2번을 선택했다.
Do you want to monitor metrics from CollectD?
WARNING: CollectD must be installed or the Agent will fail to start
1. yes
2. no
CollectD의 지표 모니터링 여부를 선택한다.
나는 필요하지 않아 2번을 선택했다.
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
memory 지표가 필요하기 때문에 1을 선택했다.
Do you want to monitor cpu metrics per core?
1. yes
2. no
CPU 지표를 코어 별로 모니터링할 지 선택한다.
내가 현재 사용하고 있는 인스턴스는 t2.small이다. t2.small에서는 vCPU가 1개이기 때문에 코어 별 모니터링이 의미가 없다. 따라서 2를 선택했다.
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
지표에 EC2 차원(ImageId, InstanceId, InstanceType, AutoScalingGroupName)을 추가할 것인지 선택한다.
1을 선택 시 CloudWatch 지표가 다음과 같이 분류되어 수집된다.
ImageId 별ImageId + InstanceId 별ImageId + InstanceId + InstanceType 별나의 경우, AutoScalingGroupName 별로 memory 지표를 수집할 계획이었기 때문에 1을 선택했다.
그러나 ImageId , InstanceId , InstanceType 별까지 분류해 수집할 필요가 없어 이후
amazon-cloudwatch-agent.json 파일에 직접 접근해 수정했다.
Do you want to aggregate ec2 dimensions (InstanceId)?
1. yes
2. no
EC2 차원(InstanceId)별로 집계할 것인지 선택한다.
나는 설정한 지표를 바탕으로 경보를 생성할 예정이다. 현재 인스턴스는 Auto Scaling Group으로 설정되어 언제든지 종료되거나 교체될 수 있는 상황이다.
이 상황에서, 인스턴스 ID 별로 지표를 집계한 후 이를 바탕으로 경보를 생성한다면 인스턴스가 종료되는 경우 해당 지표가 더 이상 수집되지 않아 경보가 무의미해질 수 있다. 따라서 2번을 선택하고, 위의 AutoScalingGroupName 별로만 집계하기로 결정했다.
AutoScalingGroupName 별로 수집 시 인스턴스가 교체되어도 지표가 계속 수집된다.
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
고해상도 지표 수집 빈도 시간을 선택한다. 지표를 얼마나 더 세밀하게 수집할지 선택하면 된다.
나는 세밀한 지표 수집을 원하지 않아 4를 선택했다.
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
메모리 지표 수집을 위해서는 Advanced를 골라야 한다.
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
기존의 CloudWatch 로그 에이전트 구성 파일을 가져와서 마이그레이션 할 지 선택한다.
나는 기존 구성 파일이 없어 2를 선택했다.
Do you want to monitor any log files?
1. yes
2. no
Do you want the CloudWatch agent to also retrieve X-ray traces?
1. yes
2. no
Do you want to store the config in the SSM parameter store?
1. yes
2. no
로그, X-ray, parameter store 사용 여부를 선택한다.
나는 모두 필요 없어 2를 선택했다.
이렇게 설정 시 다음과 같은 json 파일이 생성된다.
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "cwagent"
},
"metrics": {
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"cpu": {
"measurement": [
"cpu_usage_idle",
"cpu_usage_iowait",
"cpu_usage_user",
"cpu_usage_system"
],
"metrics_collection_interval": 60,
"totalcpu": false
},
"disk": {
"measurement": [
"used_percent",
"inodes_free"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"diskio": {
"measurement": [
"io_time",
"write_bytes",
"read_bytes",
"writes",
"reads"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
},
"netstat": {
"measurement": [
"tcp_established",
"tcp_time_wait"
],
"metrics_collection_interval": 60
},
"swap": {
"measurement": [
"swap_used_percent"
],
"metrics_collection_interval": 60
}
}
}
}
amazon-cloudwatch-agent.json을 수정해 커스텀할 수 있다. 나는 다음과 같이 수정했다.
append_dimensions에서 AutoScalingGroupName를 제외한 나머지 차원은 불필요해 삭제한다.metrics_collected에서 mem(memory)를 제외한 나머지 지표는 불필요해 삭제한다.{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "cwagent"
},
"metrics": {
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}"
},
"metrics_collected": {
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
}
}
}
}
수정 후 json 파일은 위와 같다.
# amazon-cloudwatch-agent.json이 있는 경로로 접근하기
cd /opt/aws/amazon-cloudwatch-agent/etc/
# vi를 사용해 amazon-cloudwatch-agent.json 편집하기
sudo vi amazon-cloudwatch-agent.json
# cloudWatch Agent 다시 시작하기
sudo systemctl restart amazon-cloudwatch-agent
# cloudWatch Agent 상태 확인하기
sudo systemctl status amazon-cloudwatch-agent
위 명령어를 사용해 amazon-cloudwatch-agent.json을 편집한 후 CloudWatch를 재시작한다.
경로 내에 amazon-cloudwatch-agent.json이 아예 생성되지 않은 경우도 존재하는데, 파일을 직접 생성하고 json 값을 붙여넣으면 된다.
상태 확인 시 active가 뜨면 적절하게 잘 수정된 것이다. inactive가 뜨면 오류가 있는 것이기 때문에 json 파일에서 문법 오류나 잘못 수정된 부분은 없는지 확인한다.
이후 AWS 콘솔을 통해 CloudWatch 지표를 확인 시 CWAgent라는 네임스페이스가 생성된 것을 확인할 수 있다.
AutoScalingGroup 차원에서 memory 지표를 확인할 수 있다!