본 자료는 사내 스터디에서 진행했던 내용입니다.
상세 지표들에 대해서는 사내 정보이기에 수치를 가려 작성하였습니다.
1. AWS CloudWatch 소개
Amazon CloudWatch는 DevOps 엔지니어, 개발자, 사이트 안정성 엔지니어(SRE), IT 관리자 및 제품 소유자를 위해 구축된 모니터링 및 관찰 서비스입니다.
CloudWatch는 애플리케이션을 모니터링하고 시스템 전체 성능 변경에 대응하며 리소스 사용률을 최적화하는 데 필요한 데이터와 실행 가능한 인사이트를 제공합니다.
출처 : AWS 공식 홈페이지
1.1 AWS의 각종 리소스를 감시하는 서비스
- AWS 리소스의 생사, 성능, 로그의 감시/감독
- 대상 지표에 대한 그래프를 통한 가시화
- 각종 지표에 기반한 알람 서비스
![](https://velog.velcdn.com/images/dongvelop/post/c67e0e22-fb5f-4e48-a1c4-ca541034449a/image.png)
1.2 AWS CloudWatch 관련 용어 개념
네임 스페이스
-
CloudWatch 지표의 컨테이너로, CloudWatch에 게시하는 각 데이터 포인트의 네임스페이스를 지정해야 한다.
-
AWS 네임스페이스는 일반적으로 AWS/service라는 명명 규칙을 사용
- 예를 들어 Amazon EC2는 AWS/EC2 네임스페이스를 사용
- AWS 네임스페이스 목록은 첨부 링크에서 확인할 수 있음
지표
- 지표는 모니터링할 변수로, 데이터 요소는 시간에 따른 변수의 값을 나타내는 것으로 간주
- 예를 들어 특정 EC2 인스턴스의 CPU 사용량은 Amazon EC2가 제공하는 하나의 지표
![](https://velog.velcdn.com/images/dongvelop/post/b4e20406-5414-4afd-9845-a379161f5361/image.png)
- 기본적으로 많은 AWS 서비스에서 리소스(예: Amazon EC2 인스턴스, Amazon EBS 볼륨, Amazon RDS DB 인스턴스)에 대한 지표를 무료로 제공
- 또한 유료로 Amazon EC2 인스턴스와 같은 일부 리소스에 대한 세부 모니터링을 사용하거나 자체 애플리케이션 지표를 게시할 수도 있음.
- 사용 가능한 지표 보기
경보
- 경보는 지정한 기간에 단일 지표를 감시하고 시간에 따른 임계값에 대한 지표 값을 기준으로 지정된 작업을 하나 이상 수행
- 이 작업은 Amazon SNS 주제 또는 Auto Scaling 정책에 전송되는 알림으로, 대시보드에 경보를 추가할 수도 있음
- 경보는 지속적인 상태 변경에 대해서만 작업을 호출합니다.
- CloudWatch 경보는 단순히 특정 상태에 있다고 해서 작업을 호출하지 않으며,
- 상태가 변경되어 지정된 기간 수 동안 유지되어야 한다.
- Amazon CloudWatch 경보 사용 및 그래프의 지표에서 경보 생성
2. AWS CloudWatch 시작하기
처음 Overview에서는 CloudWatch-Defualt 라는 대시보드가 없을 경우, 아래와 같은 메뉴얼이 보여진다.
![](https://velog.velcdn.com/images/dongvelop/post/0816d0ca-73fb-4fad-af83-c864fb0c930d/image.png)
2.1 모든 AWS 서비스의 주요 지표 살펴보기
2.2 단일 서비스의 대시보드를 조회하고 싶은 경우
-
위 사진에서 보이는 파란 글씨의 “{서비스명} 대시보드 보기”를 클릭하거나
-
Overview > 개요 > 서비스 대시보드를 클릭
![](https://velog.velcdn.com/images/dongvelop/post/25684f27-8457-4e0d-8737-e9c628b89395/image.png)
-
단일 서비스의 기본 지표 조회 화면 (아래 사진은 EC2 서비스 클릭 시)
![](https://velog.velcdn.com/images/dongvelop/post/f729b991-2a5b-4f70-89cc-ad0bbfe3e509/image.png)
3. 기본 대시보드 만들기
3.1 기본 대시보드 생성
- CloudWatch 시작하기 > 기본 대시보드 생성
![](https://velog.velcdn.com/images/dongvelop/post/8a09f97c-8910-47fc-9ddd-7ea673547753/image.png)
3.2 대시보드 이름 입력
3.3 시각화 할 데이터 및 위젯 유형 선택
- 시각화할 지표/로그/경보 중 원하는 유형을 선택
![](https://velog.velcdn.com/images/dongvelop/post/ff71b3f3-2a55-483f-93f0-7900d5c210e8/image.png)
3.4 지표 선택 및 위젯 생성
- 원하는 지표를 선택(데이터 유형 - 지표, 위젯 유형 - 행 선택시) > 이름 변경 > 위젯 생성
![](https://velog.velcdn.com/images/dongvelop/post/f6fc84ac-65ef-42c8-8944-44d2f9491a87/image.png)
3.5 기본 대시보드 완성 화면
- 3번 & 4번을 반복 후 완성된 기본 대시보드 예시
![](https://velog.velcdn.com/images/dongvelop/post/e615d6a1-0ceb-4e56-aa9d-0dd58466d4e8/image.png)
4. 경보 생성하기
위처럼 기본 대시보드를 만들었다면, CloudWatch Overview 화면은 아래와 같다.
경보를 설정할 경우 단일 지표를 감시하고 시간에 따른 임계값에 대한 지표 값을 기준으로 알림을 받을 수도 있다.
![](https://velog.velcdn.com/images/dongvelop/post/67f727a9-5a90-4160-b2f9-560c1b3e65dc/image.png)
4.1 지표 선택
- 경보 생성 > 원하는 지표 선택
![](https://velog.velcdn.com/images/dongvelop/post/cc362a71-7dc1-4e88-8ec3-97fc65ed416c/image.png)
4.2 집계할 통계/기간 및 임계값 선택
- 집계할 통계/기간 및 임계값 유형/기준 선택 (아래는 RDS - DatabaseConnections 선택 시 화면)
임계값 유형 : 정적 임계값 설정시 → 정적 값을 기준으로 경보 생성
![](https://velog.velcdn.com/images/dongvelop/post/cde86324-68fa-4db8-bf3b-c618c2baf14b/image.png)
임계값 유형 : 이상 탐지 선택시 → 경보 생성 후 이상 탐지 모델이 생성되며, 대역을 기준으로 경보 생성
![](https://velog.velcdn.com/images/dongvelop/post/9381605f-8953-430a-9d47-cf04f234c60c/image.png)
4.3 작업 구성
4.4 경보 이름 및 설명 추가
- 설명 작성 시, 마크다운 문법을 사용한다.
![](https://velog.velcdn.com/images/dongvelop/post/3a5eeddf-f0b5-4333-bfff-174281986024/image.png)
4.5 경보 생성 완료시 화면
![](https://velog.velcdn.com/images/dongvelop/post/23443d0e-a7d7-4596-af8c-4898b345a2d1/image.png)
4.6 설정한 경보 조건 만족시, 발생한 알림
![](https://velog.velcdn.com/images/dongvelop/post/e8329296-dcfc-49a4-9097-0a0b35f8ad7b/image.png)
4.7 Slack 알람 화면
![](https://velog.velcdn.com/images/dongvelop/post/2a3f1ea2-9a88-4107-9cf0-38ba3b12cf4e/image.png)
5. AWS 서비스 별 권장 경보
AWS : CloudWatch 권장 경보 메뉴얼을 참고하였으며, 아래에서 모든 경보를 설명하지는 않습니다.
5.1 Amazon DymanoDB
- AccountProvisionedReadCapacityUtilization
- 계정의 읽기 용량이 프로비저닝된 한도에 도달하는지 여부를 감지
- 통계: Maximum
- 권장 임곗값: 80.0
- 임곗값 정당화: 임곗값을 80%로 설정하면 최대 용량에 도달하기 전에 계정 한도 상향 조정과 같은 조치를 실행하여 제한을 방지할 수 있습니다.
- AccountProvisionedWriteCapacityUtilization
- 통계: Maximum
- 권장 임곗값: 80.0
- 임곗값 정당화: 임곗값을 80%로 설정하면 최대 용량에 도달하기 전에 계정 한도 상향 조정과 같은 조치를 실행하여 제한을 방지할 수 있습니다.
- ReadThrottleEvents
- DynamoDB 테이블에 대해 제한이 발생하는 읽기 요청 수가 많은지 여부를 감지
- 통계: Sum
- 권장 임곗값: 상황에 따라 다름
5.2 Amazon EC2
- CPUUtilization
- 높은 CPU 사용률을 감지
- 통계: Average
- 권장 임곗값: 80.0
- 임곗값 정당화: 일부 시스템의 경우 지속적으로 높은 CPU 사용률이 정상이고 문제로 표시되지 않을 수 있지만, 다른 시스템에서는 문제가 발생할 수 있습니다.
- StatusCheckFailed
- 시스템 상태 확인 실패와 인스턴스 상태 확인 실패를 비롯한 인스턴스의 근본적인 문제를 감지
- 통계: Maximum
- 권장 임곗값: 1.0
- 임곗값 정당화: 상태 확인이 실패하면 이 지표의 값은 1입니다. 임곗값은 상태 확인이 실패할 때마다 경보가 ALARM 상태가 되도록 설정됩니다.
5.3 Amazon ElastiCache
- CPUUtilization
- ElastiCache 호스트의 높은 CPU 사용률을 감지하는 데 사용
- 통계: Average
- 권장 임곗값: 상황에 따라 다름
- 임곗값 정당화: 임곗값을 애플리케이션의 중요한 CPU 사용률 수준을 반영하는 백분율로 설정합니다.
- Memcached의 경우 엔진은 최대 num_threads 코어를 사용할 수 있습니다.
- Redis의 경우 엔진은 대부분 단일 스레드이지만 I/O 가속화를 위해 가능한 경우 추가 코어를 사용할 수 있습니다.
- 대부분의 경우 임곗값을 사용 가능한 CPU의 약 90%로 설정할 수 있습니다.
- Redis는 단일 스레드이기 때문에 실제 임곗값은 노드 총 용량의 일부로 계산해야 합니다.
- CurrConnections
- 경보를 통해 ElastiCache 클러스터의 성능 및 안정성에 영향을 미칠 수 있는 높은 연결 수를 식별
- 통계: Average
- 권장 임곗값: 상황에 따라 다름
- 임곗값 정당화: 이 경보의 권장 임곗값은 클러스터의 허용 가능한 연결 범위에 따라 크게 달라집니다. -
- ElastiCache 클러스터의 용량 및 예상 워크로드를 검토하고, 정기적인 사용 중 과거 연결 수를 분석하여 기준을 설정한 다음 그에 따라 임곗값을 선택합니다.
- 각 노드는 최대 65,000개의 동시 연결을 지원합니다.
5.4 Lambda
- Errors
- 함수 호출 시 오류 수가 많은 경우를 감지
- 통계: Sum
- 권장 임곗값: 상황에 따라 다름
- 임곗값 정당화: 임곗값을 0보다 큰 수로 설정합니다.
- 정확한 값은 애플리케이션의 오류 허용 오차에 따라 달라질 수 있습니다.
- 함수가 처리하는 호출의 중요도를 이해해야 합니다.
- 일부 애플리케이션의 경우 어떠한 오류도 허용되지 않을 수 있지만 다른 애플리케이션에서는 일정한 오차 범위를 허용할 수 있습니다.
- Throttles
- Lambda 함수에 대해 많은 수의 제한된 간접 호출 요청 수를 감지
- 제한으로 인해 요청이 계속 거부되는지, 지속적인 제한을 피하기 위해 Lambda 함수 성능을 개선하거나 동시성 용량을 늘려야 하는지를 파악해야 합니다.
- 통계: Sum
- 권장 임곗값: 상황에 따라 다름
- 임곗값 정당화: 임곗값을 0보다 큰 수로 설정합니다.
- 정확한 임곗값은 애플리케이션의 허용 오차에 따라 달라질 수 있습니다.
5.5 Amazon RDS
- CPUUtilization
- 매우 긴 응답 시간과 시간 초과를 방지하기 위해 지속적으로 높은 CPU 사용률을 탐지
- 통계: Average
- 권장 임곗값: 90.0
- 임곗값 근거:
- CPU 사용률이 무작위로 급증해도 데이터베이스 성능이 저하되지는 않지만 CPU가 계속 높게 유지되면 향후 데이터베이스 요청에 방해가 될 수 있습니다.
- 전체 데이터베이스 워크로드에 따라 RDS/Aurora 인스턴스의 CPU가 높으면 전체 성능이 저하될 수 있습니다.
- DatabaseConnections
- 이 경보는 최대 DB 연결 수에 도달했을 때 연결이 거부되는 것을 방지하는 데 사용
DB 인스턴스 클래스를 자주 변경하는 경우 메모리와 기본 최대 연결 수가 변경되므로 이 경보는 사용하지 않는 것이 좋습니다.
- 통계: Average
- 권장 임곗값: 상황에 따라 다름
- 임곗값 근거: 허용되는 연결 수는 DB 인스턴스 클래스의 크기 및 프로세스/연결과 관련된 데이터베이스 엔진별 파라미터에 따라 달라집니다. 데이터베이스의 최대 연결 수의 90~95% 사이 값을 계산하고 해당 결과를 임곗값으로 사용해야 합니다.
- FreeableMemory
- 메모리 부족으로 인한 연결 거부를 방지하는 데 사용
- 통계: Average
- 권장 임곗값: 상황에 따라 다름
- 임곗값 근거: 워크로드 및 인스턴스 클래스에 따라 임곗값을 다르게 설정하는 것이 적절할 수 있습니다. 가용 메모리가 장기간 동안 전체 메모리의 25% 미만으로 떨어지지 않는 것이 좋습니다.
- Aurora의 경우 임곗값을 5%에 가깝게 설정할 수 있습니다.
- 지표가 0에 가까울수록 DB 인스턴스가 최대한 스케일 업되었음을 의미하기 때문입니다.
- ReadLatency
- 긴 읽기 지연 시간을 탐지하는 데 사용
- 통계: p90
- 권장 임곗값: 상황에 따라 다름
- 임곗값 정당화: 이 경보의 권장 임곗값은 사용 사례에 따라 크게 달라집니다.
- 읽기 지연 시간이 20밀리초보다 길면 조사가 필요할 수 있습니다.
- 애플리케이션의 읽기 작업 지연 시간이 길어질 수 있는 경우 더 높은 임곗값을 설정할 수도 있습니다.
5.6 Amazon S3
- 4xxErrors
- 일반적인 4xx 오류 발생률에 대한 기준을 만드는 데 사용
- 통계: Average
- 권장 임곗값: 0.05
- 임곗값 정당화: 권장 임곗값은 전체 요청의 5% 이상에서 4XX 오류가 발생하는지 감지하는 것입니다.
- 임곗값을 너무 낮게 설정하면 경보가 너무 민감해질 수 있습니다. 허용 가능한 수준의 4XX 오류를 고려하여 요청 로드에 맞게 임곗값을 조정할 수 있습니다.
- 5xxErrors
- 5xx 오류로 인해 애플리케이션에 문제가 발생하는지 감지
- 통계: Average
- 권장 임곗값: 0.05
- 임곗값 정당화: 전체 요청의 5% 이상에서 5XXError가 발생하는지 감지하도록 임곗값을 설정하는 것이 좋습니다.
5.7 Amazon SNS
- NumberOfNotificationsFailed
- 실패한 SNS 메시지 수가 너무 많을 때 이를 감지
- 통계: Sum
- 권장 임곗값: 상황에 따라 다름
- 임곗값 정당화: SQS, Lambda 또는 Firehose 구독만 있는 주제의 경우 실패한 알림 수는 0이어야 합니다.
- SMSSuccessRate
- SMS 메시지 전송 실패를 탐지
- 통계: Average
- 권장 임곗값: 상황에 따라 다름
- 임곗값 정당화: SMS 메시지 전송 실패에 대한 허용 한도에 맞춰 경보 임곗값을 설정합니다.
5.8 Amazon SQS
- ApproximateAgeOfOldestMessage
- 대기열에 있는 가장 오래된 메시지의 수명을 감시
- 메시지가 처리되기 전에 삭제되는 것을 방지하려면 잠재적 독약 메시지를 차단하도록 DLQ(Dead Letter Queue)를 구성하는 것이 좋습니다.
- 통계: Maximum
- 권장 임곗값: 상황에 따라 다름
- 임곗값 정당화: 과거 데이터를 사용하여 평균 메시지 처리 시간을 계산한 다음, 임곗값을 대기열의 소비자가 예상한 최대 SQS 메시지 처리 시간보다 50% 더 높게 설정할 수 있습니다.
- ApproximateNumberOfMessagesVisible
- 활성 대기열의 메시지 수가 너무 많아 소비자가 메시지를 처리하는 속도가 느리거나 메시지를 처리할 소비자가 충분하지 않은지 여부를 감지
- 통계: Average
- 권장 임곗값: 상황에 따라 다름
- 임곗값 정당화: 표시되는 메시지 수가 예상보다 많으면 소비자가 메시지를 예상 속도로 처리하지 못하고 있음을 나타냅니다. 이 임곗값을 설정할 때 과거 데이터를 고려해야 합니다.
5.9 번외) 우아한 형제들이 활용한 CloudWatch Aurora 메트릭 알람 구성
![](https://velog.velcdn.com/images/dongvelop/post/47a33fc4-64ed-43f6-be98-19ce4526ad45/image.png)
![](https://velog.velcdn.com/images/dongvelop/post/bb5032b8-5cf4-4a4c-9b25-587b190d5f75/image.png)
6. 로그
당장 저장하거나 감시해야 할 로그들이 없다고 판단되어 생략.
다만 로그 그룹의 경우, 기본적으로 보존이 만기없음으로 설정되어 있는데, 이는 곧 어마어마한 비용이 나올 수도 있다.
따라서, 보존 기간을 적절하게 설정해야 한다.
특정 로그를 반드시 저장해야 하는 일이 있다면 S3로 수동으로 옮겨서 저장하는 것도 방법이다.→ 이를 자동화하려면 람다를 이용할 수 있다.
8. 참고자료