[DevOps] CloudWatch + Grafana Cloud 모니터링 구축
들어가며
프로젝트를 릴리즈 하기 전 모니터링 기능을 추가하고 싶었습니다.
결론적으로, CloudWatch로 Metrics를 수집하고
Grafana로 Dashboard를 구성하기로 결정하였습니다.
또한 CloudWatch에서 Metrics에 대한 Alarms를 보내는 환경을 구축하기로 하였습니다.
Metric 수집? CloudWatch vs Prometheus
CloudWatch는 AWS 환경에 적합하며,
Prometheus는 클라우드 종속성이 적어서 다양한 환경에 적용 가능합니다.
하지만 Prometheus는 AWS 서비스와의 통합이 CloudWatch에 비해 직접적이지 않아,
AWS 리소스에 대한 메토릭을 모니터링하기 위해서는 추가구성이 필요합니다.
→ AWS 서비스(EC2, RDS 등)만 사용하기 때문에 AWS 환경에 특화되고,
좀 더 간단하게 적용할 수 있는 CloudWatch를 선택하였습니다.
DashBoard 작성 ? CloudWatch vs Grafana
Grafana는 고급 시각화 및 플러그인을 통한 확장성 측면에서 뛰어납니다.
→ CloudWatch로 Metrics를 수집하고 Grafana를 통해
더 다양한 시각화 및 대시보드 작성 기능을 활용하기로 하였습니다.
Alert 기능 ? CloudWatch vs Grafana
CloudWatch는 AWS 환경에서의 alarm에 강점이 있으며,
Grafana는 다양한 데이터 소스와 통합성이 뛰어납니다.
→ AWS 서비스만 사용하기 때문에 우선적으로 CloudWatch를 사용하여 AWS 내부 경보를 모니터링하고,
이후 필요하다면 Grafana를 사용하여 더 다양한 경보 및 액션 기능을 추가하기로 하였습니다.
Cloudwatch 설정
CloudWatch란?
AWS 클라우드 리소스와 AWS에서 실행되는 애플리케이션을 위한 모니터링 서비스입니다.
Metrics를 수집 및 추적하고 로그 파일을 수집 및 모니터링하고 Alarms를 설정랍니다.
EC2 인스턴스, DynamoDB 테이블, RDS DB 인스턴스 같은 AWS 리소스뿐만 아니라
애플리케이션과 서비스에서 생성된 사용자 정의 지표 및 애플리케이션에서 생성된 모든 로그 파일을 모니터링할 수 있습니다.
시스템 전반의 리소스 사용률, 애플리케이션 성능, 운영 상태를 파악할 수 있습니다.
지표(Metrics)
- AWS 클라우드 리소스 및 AWS에서 실행하는 애플리케이션을 모니터링
- CPU 사용량, 네트워크 사용량 등의 AWS 서비스에 대한 측정값
- AWS 제품 및 서비스에 대한 지표가 자동으로 제공되며, 자체 애플리케이션 및 서비스에서 생성된 사용자 정의 지표도 모니터링
대시보드(Dashboard)
- AWS 리소스 및 사용자 정의 지표의 그래프를 한눈에 볼 수 있는 대시보드 기능
로그(logs)
- 애플리케이션에 대한 로그를 수집하는 기능
- Lambda, CloudTrail, ECS, API Gateway 등의 AWS 서비스에 대한 로그를 수집
- AWS 서비스 이외에도 Log Aget를 설치하여 로그를 수집 가능
- 로그를 S3, Kinesis Data Stream, Kinesis Data Firhose, Aws Lambda로 전송 가능
경보(Alarms)
- 지표값에 대한 alarm를 생성하는 기능
- Ex) Amazon EC2 인스턴스 CPU 사용률, Amazon ELB 요청 지연 시간, Amazon DynamoDB 테이블 처리량, Amazon SQS 대기열 길이, AWS 청구서 요금에 대한 alarm
- 생성된 alarm를 이메일을 전송하거나 SQS 대기열에 게시하거나, Amazon EC2 인스턴스를 중단 또는 종료하거나 Auto Scailing 정책을 실행하도록 alarm를 설정
Cloudwatch agent 설치
memory, disk 사용량은 CloudWatch에서 Default로는 제공되지 않습니다.
memory, disk 사용량을 모니터링하기 위해서는 CloudWatch Agent를 EC2에 설치해야 함.
아래 포스팅을 참고해 설치해 주었습니다.
Cloudwatch를 사용한 메모리 모니터링 - EC2, Ubuntu
AWS Ubuntu 환경에서 메모리를 모니터링하기 위한 도구
velog.io
그럼 지표-모든 지표에서 CWAgent라는 사용자 지정 네임스페이스가 만들어진 것을 확인할 수 있습니다
경보(Alarms) 설정
(1) SNS 주제 생성
SNS는 주제, 구독이 개념으로 이루어져 있습니다.
만들어진 주제에 대해서 구독을 생성하고 이를 통해 구독되어 있는 Email 주소들에 대해서 이메일을 전송하도록 구성합니다.
먼저 간단하게 이름을 정의해 주고 주제를 만듭니다.
(2) 구독 생성
만들어진 주제에 대해 구독을 생성해서 어떤 이벤트가 발생하면 구독되어 있는 모두에게 SNS를 통해 alarm를 보낼 수 있습니다.
먼저 이메일을 선택한 후 이메일을 받을 사람에 대해 구독생성을 해주었습니다.
구독을 생성하면 아래와 같이 메일이 오고, confirm subscription을 클릭하면 구독하게 됩니다.
(3) 새로운 경보 생성
모든 경보 - 경보 생성 - 지표선택
EC2-인스턴스별 지표에서 CPUUtilization 항목에 대한 지표를 선택하였습니다.
저는 평균 5부, 70%보다 클 경우에 경보 설정이 되도록 설정하겠습니다.
평균치를 잡기 위한 기간을 정할 수 있고,
CPU Utilization에서 임계값은 70%-80%가 적당합니다.
작업 구성에서 아까 위에서 만들었던 SNS를 선택해 주시면 됩니다.
이렇게 구성하면, CPU 사용률이 70%가 넘을 경우 SNS를 통해 메일을 받을 수 있습니다.
참고로, Lambda를 통해 원하는 형식으로 바꿔 구성하여 메일이나, 슬랙으로 전달할 수 있습니다.
CloudWatch 이상 지표를 슬랙 알람으로 받기 (feat. SNS, Lambda)
AWS 서비스를 이용하면 CloudWatch를 통해 서비스의 이상 지표를 손쉽게 확인할 수 있습니다. 이를테면 다음과 같은 경우인데요. 평소보다 로드밸런서로 들어오는 요청양이 2배이상 높다거나 RDS의 C
jojoldu.tistory.com
필요에 따라 AutoScaling을 시키거나 EC2 작업을 추가할 수 있습니다.
마지막을 이름 및 설명을 적고 만들 수 있습니다.
(4) 부하테스트
알림이 잘 오는지 테스트하기 위해 서버에 들어가 CPU에 부하를 줍니다
# ubuntu에 stress 설치
sudo apt update
sudo apt install stress
# 전체 코어 개수 확인
grep -c processor /proc/cpuinfo
# 1개 코어에 대한 부하 생성
stress -c 1
시간이 좀 지난 후 cpu 사용량이 70%가 넘으면 메일이 잘 오는 것을 확인할 수 있습니다.
(5) 그 밖의 다양한 지표에 따라 경보 생성하기
이 밖에 memory, disk, rds cpu 사용량, 네트워크 Inbound/outbound 등
다양한 지표에 따라 경보를 생성할 수 있습니다.
Memory 사용률 80% 이상일 때 경보 생성
Disk 사용률 90% 이상일 때 경보 생성
Grafana Cloud설정
grafana cloud란?
Grafana란, 시계열 매트릭 데이터를 시각화하는데 가장 최적화된 대시보드를 제공해 주는 오픈소스 툴킷입니다.
grafana는 오픈소스로 기본적으로는 직접 설치하고 운영해야 합니다.
또한 메트릭 데이터나 로그 데이터에 대한 관리도 직접 해야 한다는 불편함이 있습니다.
Grafana cloud는 Grafana lab에서 제공하는 관리형 서비스로 사용자는 서버나 인프라를 직접 관리할 필요가 없습니다.
따라서 설정이 간단하고 사용자가 빠르게 시작할 수 있기에 저희는 grafana cloud를 선택하였습니다.
1. DashBoard 생성
grafana cloud에 로그인합니다.
(1) Create a dashboard
(2) AWS 선택
Create dashboard and queries from your AWS Services 선택하고,
Amazon CloudWatch 선택합니다.
2. IAM User 생성
먼저 Grafana에 접속할 IAM User가 필요합니다
(1) IAM 정책 생성
IAM - 정책 - 정책 생성
JSON으로 생성 후 아래 권한을 복붙 합니다.
아래 권한은 공식 문서의 Metrics and logs permissions 부분입니다
https://grafana.com/docs/grafana/latest/datasources/aws-cloudwatch/
Amazon CloudWatch data source | Grafana documentation
Thank you! Your message has been received!
grafana.com
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowReadingMetricsFromCloudWatch",
"Effect": "Allow",
"Action": [
"cloudwatch:DescribeAlarmsForMetric",
"cloudwatch:DescribeAlarmHistory",
"cloudwatch:DescribeAlarms",
"cloudwatch:ListMetrics",
"cloudwatch:GetMetricData",
"cloudwatch:GetInsightRuleReport"
],
"Resource": "*"
},
{
"Sid": "AllowReadingLogsFromCloudWatch",
"Effect": "Allow",
"Action": [
"logs:DescribeLogGroups",
"logs:GetLogGroupFields",
"logs:StartQuery",
"logs:StopQuery",
"logs:GetQueryResults",
"logs:GetLogEvents"
],
"Resource": "*"
},
{
"Sid": "AllowReadingTagsInstancesRegionsFromEC2",
"Effect": "Allow",
"Action": ["ec2:DescribeTags", "ec2:DescribeInstances", "ec2:DescribeRegions"],
"Resource": "*"
},
{
"Sid": "AllowReadingResourcesForTags",
"Effect": "Allow",
"Action": "tag:GetResources",
"Resource": "*"
}
]
}
정책이름은 grafana-permissions로 지정해 준 후 정책을 생성합니다.
(2) IAM 사용자 생성
IAM - 사용자 - 사용자 생성
사용자 이름은 grafana-user로 적어주었습니다
그리고 사용자 그룹을 생성하며 위에서 만든 권한 ( grafana-permission)을 추가합니다.
해당 그룹으로 IAM 사용자를 생성합니다
(3) Access Key 만들기
위에서 만든 IAM 사용자에서 액세스 키 만들기를 클릭합니다.
서드 파티 서비스를 선택합니다.
생성된 액세스 키를 기억해 둡니다.
3. DataSource 추가
Home - Connections - Data sources
Add new data source 클릭하고 Cloudwatch를 선택합니다
이름을 지정하고 위에서 생성한 액세스 키 정보를 입력해 줍니다.
Save & test를 누르면 연동이 확인됩니다.
여기서 사용자 지정 지표인 CWAgent를 namespace of Custom Metrics에 적어주어야
이후 시각화를 할 때 NameSpace에서 CWAgent를 찾을 수 있습니다.
4. Dashboard 생성
저희 프로젝트는 EC2 CPU 사용률, 네트워크 트래픽 양, RDS CPU 사용률, EC2 Memory 사용률, EC2 Disk 사용률
총 다섯 가지 metrics를 시각화하였습니다.