개인 프로젝트에서 부하 테스트를 진행하면서, CPU 사용률은 바로 시각화할 수 있었지만 메모리 사용률을 CloudWatch에 시각화하려고 하니 꽤나 복잡했다. 나중에 잊어버릴 것 같아서 이 글로 과정을 정리해보려 한다.
참고 강의: 수많은 EC2 인스턴스의 CPU/메모리 시각화해서 확인하기 : CloudWatch Resource Health
📚 전체 단계 요약 (목차)
- IAM 역할 생성
- EC2 인스턴스에 IAM 역할 할당
- CloudWatch Agent 설치
- 파라미터 스토어에 Agent 설정 등록
- CloudWatch Agent 시작 명령 실행
- 리소스 상태 확인
- CloudWatch Dashboard 생성
💡 CloudWatch Resource Health란?
CloudWatch Resource Health는 Amazon EC2 인스턴스의 상태를 종합적으로 보여주는 서비스다.
- 별도 설정 없이 모든 EC2의 메트릭, 태그를 종합해 시각화
- CPU 사용률, 상태, 메모리 등을 색상으로 표현
- Group By, Filter By 기능으로 인스턴스를 묶어 확인 가능
- 임계값마다 색상을 달리 설정 가능
설정하면 위 그림과 같이 인스턴스별 Resource Health 를 한눈에 볼 수 있다.
메모리를 제외한 다른 지표(CPU, Status) 등은 별도의 설정 없이 수집할 수 있지만 메모리의 경우 CWAgent 를 활용해서 직접 수집해야한다. Linux 기준 CWAgent namespace 로 "mem_used_percent" 매트릭의 수집이 필요하다.
메모리를 수집하도록 설정할때 AWS Systems Manager Run Command 를 사용할 예정이다.
Systems Manager 로 Run command 를 통해서 CloudWatch Agent 를 설치한다.
CloudWatch 가 설정되어있는 Instance 들이 지속적으로 CloudWatch 로 메모리 사용량을 주거나 혹은 매트릭으로 수집하게 된다.
이걸 기반으로 대시보드를 만들어주는 아키텍쳐이다.
📌 1단계: IAM 역할 생성
CloudWatch Agent가 EC2 내부 데이터를 외부로 전송하려면 권한이 필요하다.
이유: EC2 인스턴스가 SSM과 CloudWatch Agent를 사용하려면 명시적으로 권한을 위임해야 한다.
필요한 권한 정책
- AmazonEC2RoleforSSM
- AmazonSSMFullAccess
- CloudWatchAgentServerPolicy
이 세 가지를 포함한 IAM 역할을 생성한다.
📌 2단계: IAM 역할을 EC2 인스턴스에 할당
EC2 대시보드에서 작업 → 보안 → IAM 역할 수정을 클릭하여 1단계에서 만든 역할을 인스턴스에 할당한다.
이 역할이 있어야 이후 SSM 명령 실행과 CloudWatch Agent 설정이 EC2에서 실행될 수 있다.
※ 이 설정 후에는 반드시 인스턴스 중지 → 시작 순서로 재부팅해야 적용된다.
📌 3단계: CloudWatch Agent 설치
AWS Systems Manager의 Run Command 기능을 사용한다.
Systems Manager 접속
좌측 메뉴 → 노드 도구 → 명령실행 → 명령 실행 버튼 클릭
AWS-ConfigureAWSPackage 선택 → 명령 실행
명령 파라미터 입력 : Name 필드에 AmazonCloudWatchAgent 입력
※ 주의 ! 이때 철자 맞춰서 작성해야 함
수동으로 인스턴스 선택 → 본인이 모니터링할 인스턴스를 선택 (2번에서 IAM 역할을 부여한 인스턴스) → 실행
🚨 그런데 이때 만약 `등록된 관리형 인스턴스 없음` 라는 글이 보인다면
- 1. 권한 설정을 잘못했다 → (1번부터 다시 놓친게 있는지 확인해본다)
- 2. 권한 설정을 했는데 EC2 재부팅이 안되었다.
- IAM 권한 설정 후 재부팅을 해줘야 권한이 완전하게 설정된다.
나의 경우 2번에 해당되었는데, IAM 권한 설정 후
EC2 재부팅 버튼을 눌러 재부팅 하지 말고 !
인스턴스 중지 → 인스턴스 시작 버튼을 눌러 재부팅 해주니까 해결되었다 (한참 헤멨다)
📌 4단계: 파라미터 스토어에 Agent 설정 등록
CloudWatch Agent는 어떤 메트릭을 얼마 주기로 수집할지를 파라미터 스토어의 JSON 파일로 지정해야 한다.
SSM → 애플리케이션 도구 → 파라미터 스토어
파라미터 생성
Agent가 수집할 메트릭을 알 수 있도록 설정 정보를 등록하는 단계다.
값 필드에 아래 json 데이터를 넣어준다.
{
"agent": {
"metrics_collection_interval": 10,
"logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log"
},
"metrics": {
"namespace": "CWAgent",
"metrics_collected": {
"cpu": {
"resources": ["*"],
"measurement": [
{
"name": "cpu_usage_idle",
"rename": "CPU_USAGE_IDLE",
"unit": "Percent"
},
{
"name": "cpu_usage_nice",
"unit": "Percent"
},
"cpu_usage_guest"
],
"totalcpu": false,
"metrics_collection_interval": 10,
"append_dimensions": {
"customized_dimension_key_1": "customized_dimension_value_1",
"customized_dimension_key_2": "customized_dimension_value_2"
}
},
"disk": {
"resources": ["/", "/tmp"],
"measurement": [
{
"name": "free",
"rename": "DISK_FREE",
"unit": "Gigabytes"
},
"total",
"used"
],
"ignore_file_system_types": ["sysfs", "devtmpfs"],
"metrics_collection_interval": 60,
"append_dimensions": {
"customized_dimension_key_3": "customized_dimension_value_3",
"customized_dimension_key_4": "customized_dimension_value_4"
}
},
"diskio": {
"resources": ["*"],
"measurement": ["reads", "writes", "read_time", "write_time", "io_time"],
"metrics_collection_interval": 60
},
"swap": {
"measurement": ["swap_used", "swap_free", "swap_used_percent"]
},
"mem": {
"measurement": ["mem_used", "mem_cached", "mem_total", "mem_used_percent"],
"metrics_collection_interval": 60
},
"net": {
"resources": ["eth0"],
"measurement": ["bytes_sent", "bytes_recv", "drop_in", "drop_out"]
},
"netstat": {
"measurement": ["tcp_established", "tcp_syn_sent", "tcp_close"],
"metrics_collection_interval": 60
},
"processes": {
"measurement": ["running", "sleeping", "dead"]
}
},
"append_dimensions": {
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}",
"AutoScalingGroupName": "${aws:AutoScalingGroupName}"
},
"aggregation_dimensions": [["ImageId"], ["InstanceId", "InstanceType"], ["d1"], []],
"force_flush_interval": 30
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
"log_group_name": "MyEc2InstanceAgentLog.log",
"log_stream_name": "MyEc2InstanceAgentLog.log",
"timezone": "LOCAL"
}
]
}
},
"log_stream_name": "my_log_stream_name",
"force_flush_interval": 15
}
}
위 파일에서 가장 중요한 내용은 메모리(mem) 관련 내용이다
["mem_used", "mem_cached", "mem_total", "mem_used_percent"] 를 60초마다 수집하도록 설정되어있다.
📌 5단계: CloudWatch Agent 시작 명령 실행
두번째 명령어 : AmazonCloudWatch-ManageAgent → 명령 실행
Optional Configuration Location 필드에 위 단계에서 만든 파라미터 이름을 입력
대상 인스턴스 선택 후 실행
이 단계가 Agent 실행의 실제 트리거가 된다.
📌 6단계: 리소스 상태 확인
CloudWatch → 인사이트 → EC2 리소스 상태
EC2 리소스 상태 탭에서
- CPU 사용률
- 메모리 사용률
- 네트워크 트래픽
을 인스턴스별로 한눈에 확인 가능하다.
실시간 상황 파악이 가능해 병목 탐지 시 매우 유용함.
📌 7단계: CloudWatch Dashboard 생성
이번에는 실시간 모니터링뿐 아니라 지표를 그래프로 시각화하고 싶었다. 특히 병목을 시각적으로 분석하기 위해서였다.
CloudWatch → 대시보드 → 대시보드 생성
내가 시각화하고자 했던 항목
- Application CPU 사용량
- Application 메모리 사용량
- DB CPU 사용량
- DB 메모리 사용량
CPU 사용량 위젯 추가
우측 상단 + 버튼 클릭 → AWS 네임 스페이스 → EC2 → 인스턴스별 지표 → 옵션 CPUUtilization 선택 → 위젯 생성
메모리 사용량 위젯 추가
우측 상단 + 버튼 클릭 → 사용자 지정 네임 스페이스 → CWAgent → ImageId, InstanceId, InstanceType → mem_used_percent 선택 → 위젯 생성
이렇게 설정하면CloudWatch Dashboard에서 원하는 리소스들을 그래프로 모니터링할 수 있게 된다.
✅ 마치며
CloudWatch는 기본적으로 CPU만 쉽게 모니터링할 수 있지만, 메모리 사용률 시각화는 위 단계를 차례로 진행해야 한다. 특히
- IAM 역할 부여
- 파라미터 스토어 설정
- SSM 명령 실행
이 세 가지를 기억하면 대부분의 CloudWatch 시각화 과정을 원활하게 해결할 수 있다.
구성한 CloudWatch Dashboard 덕분에 부하 테스트 중 병목 원인을 훨씬 빠르게 식별할 수 있었다.
'AWS' 카테고리의 다른 글
[AWS] S3 + CloudFront + Route53으로 정적 파일 HTTPS 배포하기 (0) | 2025.04.21 |
---|---|
[AWS] EC2 서버 메모리 부족 이슈 (0) | 2025.02.05 |
[EC2] 컴퓨터 변경 후 AWS EC2 인스턴스 SSH 접속 설정 (0) | 2023.01.01 |
[ SpringBoot & JPA 프로젝트 ] HTTP => HTTPS / AWS 로드밸런서, 타겟그룹, ACM (1) | 2022.10.03 |
[ SpringBoot & JPA 프로젝트 ] AWS S3 이미지 서버 (0) | 2022.09.28 |