CloudWatch에 대하여
AWS 리소스를 효과적으로 모니터링하기
곽정섭
2019-05-30
Overview
Amazon Web Services(AWS)는 많은 고객들이 이용하고 있습니다. AWS를 이용하여 프로젝트를 운영하고 있다면 각종 서비스의 리소스를 모니터링 하는 게 귀찮게 느껴질 수 있습니다. 이번 글에서는 AWS 리소스를 효과적으로 모니터링할 수 있는 Cloudwatch 서비스를 소개하겠습니다.
Cloudwatch는 통합 뷰를 확보하는데 필요한 데이터를 제공합니다. 뿐만 아니라 이벤트 및 리소스를 이용해 경보를 생성할 수도 있습니다.
1. Events
2. Logs
3. Custom Metrics(맞춤형 지표) 생성하기
4. Alarm 생성
5. Dashboards
쉬어가기: Query 언어가 지원하는 여섯 가지 명령 유형
1. Events
CloudWatch Events는 정기적인 일정에서 트리거(trigger)되는 규칙을 생성할 수 있습니다.
1.규칙 생성을 클릭합니다.
![01](http://labs.brandi.co.kr///assets/2019/20190530/01.png)
2.대상을 호출할 일정을 설정합니다.
![02](http://labs.brandi.co.kr///assets/2019/20190530/02.png)
호출 방식에는 이벤트 패턴과 일정 두 가지가 있습니다. 이벤트 패턴은 json 구조로 표현됩니다. AWS 서비스에서 발생하는 패턴과 일치하면 트리거가 동작합니다. 일정은 지정한 시간과 일치하면 트리거가 동작합니다.
- cron 또는 rate 표현식을 사용해 예약된 모든 이벤트는 UTC+09:00 시간대를 사용합니다. 최초 단위는 1분입니다.
- 아래는 각각의 필드에 대한 일정 cron식 설명입니다.
![03](http://labs.brandi.co.kr///assets/2019/20190530/03.png)
이번 예제에서는 특정 시간에 트리거되는 일정으로 설정하겠습니다.
매일 4시에 동작하도록 설정
19 + 9(UTC) - 24(하루) = 새벽 4시
3.대상 추가를 선택해 호출할 대상을 지정합니다.
![04](http://labs.brandi.co.kr///assets/2019/20190530/04.png)
Lambda 함수 외에 여러 서비스를 선택할 수 있지만 이번 예제에서는 Lambda 함수를 지정하여 구성하겠습니다.
4.규칙의 이름과 설명을 등록하고 규칙 생성을 클릭합니다.
![05](http://labs.brandi.co.kr///assets/2019/20190530/05.png)
5.규칙이 생성된 것을 볼 수 있습니다.
![06](http://labs.brandi.co.kr///assets/2019/20190530/06.png)
2. Logs
CloudWatch Logs는 운영 중인 애플리케이션 리소스를 기록하고 액세스할 수 있으며, 관련된 로그 데이터를 검색할 수도 있습니다.
1.생성된 규칙이 지정된 시간에 동작하면 CloudWatch Logs에 로그 그룹이 생성된 걸 확인할 수 있습니다.
![07](http://labs.brandi.co.kr///assets/2019/20190530/07.png)
2.Lambda 함수에서 실행된 로그 메시지를 확인할 수 있으며 필터링도 가능합니다.
![08](http://labs.brandi.co.kr///assets/2019/20190530/08.png)
3.로그 그룹에 이벤트 만료 시점을 설정해 오래된 데이터는 모두 자동으로 삭제되도록 설정할 수 있습니다.
![09](http://labs.brandi.co.kr///assets/2019/20190530/09.png)
3. Custom Metrics(맞춤형 지표) 생성하기
모니터링하고자 하는 통계치를 직접 선정하고, CloudWatch로 보내 관리하는 지표를 생성해보겠습니다.
1.Log Groups에 대한 지표를 생성하겠습니다. 해당 Log Groups에 ‘Filters’를 클릭합니다.
![10](http://labs.brandi.co.kr///assets/2019/20190530/10.png)
2.’Add Metric Filter’를 클릭합니다.
![11](http://labs.brandi.co.kr///assets/2019/20190530/11.png)
3.로그 지표에 대한 필터 패턴을 정의합니다.
![12](http://labs.brandi.co.kr///assets/2019/20190530/12.png)
Filter Pattern
* “INFO Success 200” → 세 단어를 모두 포함하는 로그 이벤트 메시지와 일치
* “INFO - Start - End” → ‘INFO’ 포함된 메시지 중에 ‘Start’, ‘End’ 제외된 필터 로그 이벤트 메시지와 일치
4.필터 및 지표 정보를 입력한 후 ‘Create Filter’를 클릭합니다.
![13](http://labs.brandi.co.kr///assets/2019/20190530/13.png)
Metric Details
* Metric Namespace → CloudWatch 지표에 대한 대상 네임 스페이스
* Metric Name → 모니터링된 로그 정보가 게시되는 CloudWatch 지표의 이름
* Metric Value → 일치하는 로그가 발견될 때마다 지표에 게시하는 숫자 값
* Default Value → 일치하는 로그가 발견되지 않은 기간 동안 지표 필터에 보고되는 값
5.두 가지 케이스의 필터를 생성했습니다.
![14](http://labs.brandi.co.kr///assets/2019/20190530/14.png)
4. Alarm 생성
단일 CloudWatch 지표를 감시하거나 CloudWatch 측정치를 기반으로 하는 수학 표현식의 결과를 감시하는 CloudWatch 경보를 생성할 수 있습니다. 지표가 지정된 임계값에 도달하면 자동으로 이메일을 보내는 Alarm을 만들어보겠습니다.
1.추가된 지표 필터에 ‘Create Alarm’ 버튼을 클릭해 경보를 추가합니다.
![15](http://labs.brandi.co.kr///assets/2019/20190530/15.png)
2.경보 세부 정보 및 수행할 작업을 정의합니다.
![16](http://labs.brandi.co.kr///assets/2019/20190530/16.png)
경보 평가
경보를 생성할 때, CloudWatch가 경보 상태를 변경하는 조건 세 가지에 대한 설정을 지정할 수 있습니다.
- 기간은 경보에 대해 개별 데이터 포인트를 생성하기 위해 지표 또는 표현식을 평가하는 기간입니다. 초로 표시됩니다. 1분을 기간으로 선택하면 1분마다 하나의 데이터 포인트가 생성됩니다.
- Evaluation Period(평가 기간)는 경보 상태를 결정할 때 평가할 가장 최근의 기간 또는 데이터 포인트의 수입니다.
- Datapoints to Alarm(경보에 대한 데이터포인트)는 평가 기간에 경보가
ALARM
상태에 도달하게 만드는 위반 데이터 포인트의 수입니다. 위반 데이터 포인트가 연속적일 필요는 없습니다. Evaluation Period(평가 기간)와 동일한 마지막 데이터 포인트의 수 이내면 됩니다.
3.경보가 발생할 Alarm 상태와 알림 받을 이메일을 등록합니다.
![17](http://labs.brandi.co.kr///assets/2019/20190530/17.png)
경보 상태
/OK/
지표 또는 표현식이 정의된 임계값 내에 있습니다./ALARM/
지표 또는 표현식이 정의된 임계값을 벗어났습니다./INSUFFICIENT_DATA/
경보가 방금 시작되었거나, 측정치를 사용할 수 없거나, 또는 측정치를 통해 경보 상태를 결정하는데 사용할 충분한 데이터가 없습니다.
4.이메일 수신함에서 ‘AWS 알림 - 구독 확인’이라는 제목의 메일을 클릭합니다. 내용에 포함된 링크를 클릭해 알림을 수신할 것을 확인합니다. (AWS는 확인된 주소로만 알림을 전송할 수 있습니다.)
![18](http://labs.brandi.co.kr///assets/2019/20190530/18.png)
5.이메일 수신함을 확인해 ‘Confirm subscription’을 클릭합니다.
![19](http://labs.brandi.co.kr///assets/2019/20190530/19.png)
6.등록한 이메일이 확인되었습니다.
![20](http://labs.brandi.co.kr///assets/2019/20190530/20.png)
7.AWS에 이메일이 정상적으로 등록되었는지 SNS Subscriptions 메뉴에서 확인합니다.
![21](http://labs.brandi.co.kr///assets/2019/20190530/21.png)
8.Lambda를 실행해 Alarm 상태를 변경해보겠습니다.
![22](http://labs.brandi.co.kr///assets/2019/20190530/22.png)
9.등록한 이메일 주소로 Alarm 메일이 도착했습니다.
![23](http://labs.brandi.co.kr///assets/2019/20190530/23.png)
5. Dashboards
CloudWatch를 통해 리소스를 손쉽게 모니터링할 수 있는 맞춤형 통계 기능입니다.
1.Metric Filter에서 추가된 Custom Namespaces를 클릭합니다.
![24](http://labs.brandi.co.kr///assets/2019/20190530/24.png)
2.생성된 Metrics를 선택한 후, Graphed metrics Tab을 클릭합니다.
![25](http://labs.brandi.co.kr///assets/2019/20190530/25.png)
3.Metrics에 표시될 그래프를 설정합니다.
![26](http://labs.brandi.co.kr///assets/2019/20190530/26.png)
1)그래프 제목 : testLambda1
2)그래프 표시 : 숫자
3)그래프 라벨 : testMetrics-400, testMetrics-200
4)통계 : 합계
5)기간 : 1 Day
4.수식을 응용하여 여러 형식의 Metrics 표현식을 추가하겠습니다.
![27](http://labs.brandi.co.kr///assets/2019/20190530/27.png)
지표 수식 함수
* METRICS() : 요청에 모든 지표를 반환
* SUM(METRICS()) : 모든 지표의 합계
* AVG(METRICS()) : 모든 지표의 평균
* MIN(METRICS()) : 모든 지표의 최소값
* MAX(METRICS()) : 모든 지표의 최대값
* ABS(METRICS()) : 각 요소의 절대값
* RATE(METRICS()) : 각 요소의 초당 변경 비율
5.완성된 지표 Source를 복사합니다.
{
"metrics": [
[ { "expression": "SUM(METRICS())", "label": "합계", "id": "e1", "stat": "Sum", "period": 86400 } ],
[ { "expression": "AVG(METRICS())", "label": "평균", "id": "e2", "stat": "Sum", "period": 86400 } ],
[ { "expression": "MIN(METRICS())", "label": "최소값", "id": "e3", "stat": "Sum", "period": 86400 } ],
[ { "expression": "MAX(METRICS())", "label": "최대값", "id": "e4", "stat": "Sum", "period": 86400 } ],
[ { "expression": "SUM(METRICS())/SUM(m1)", "label": "SUM(METRICS())/SUM(m1)", "id": "e5", "stat": "Sum", "period": 86400 } ],
[ { "expression": "SUM(100/[m1, m2])", "label": "SUM(100/[m1, m2])", "id": "e6", "stat": "Sum", "period": 86400 } ],
[ "testMetrics", "testMetrics1", { "id": "m1", "stat": "Sum", "period": 86400, "label": "testMetrics-400" } ],
[ ".", "testMetrics2", { "id": "m2", "stat": "Sum", "period": 86400, "label": "testMetrics-200" } ]
],
"view": "singleValue",
"stacked": false,
"region": "ap-northeast-1",
"title": "testLambda1",
"period": 300
}
6.Dashboard name을 입력한 후 ‘Create dashboard’를 클릭합니다.
![28](http://labs.brandi.co.kr///assets/2019/20190530/28.png)
7.’Add widget’을 클릭해 Number 유형을 선택합니다.
![29](http://labs.brandi.co.kr///assets/2019/20190530/29.png)
8.Source Tab에서 복사해 둔 지표 Source를 붙여 넣고, ‘Create widget’을 클릭합니다.
![30](http://labs.brandi.co.kr///assets/2019/20190530/30.png)
9.위젯이 추가되었습니다. 추가된 위젯은 ‘Save dashboard’ 버튼을 클릭해야 최종 저장됩니다.
![31](http://labs.brandi.co.kr///assets/2019/20190530/31.png)
10.이번에는 로그 메시지 결과를 확인할 수 있는 Query result 유형을 추가해보겠습니다. 먼저 Query result 유형을 선택합니다.
![32](http://labs.brandi.co.kr///assets/2019/20190530/32.png)
11.로그 메시지에 조건을 추가해 필터링합니다.
![33](http://labs.brandi.co.kr///assets/2019/20190530/33.png)
잠시 쉬어가기!: Query 언어가 지원하는 여섯 가지 명령 유형
- fields : 지정한 필드를 검색합니다. 필드 명령 내에서 함수 및 연산을 사용할 수 있습니다. 만약 @ 기호, 마침표(.) 및 영숫자 문자 이외의 문자가 포함된 로그 필드가 쿼리에 명명되어 있으면 해당 필드 이름은 억음 기호로 둘러싸야 합니다.
- filter : 하나 이상의 조건으로 필터링합니다.
filter statusCode like /2\d\d/
→ 필드 statusCode의 값이 200~299인 로그 이벤트를 반환합니다. - stats : 로그 필드에 대한 지정된 시간 간격의 집계 통계를 계산합니다.
- sort : 검색된 로그 이벤트를 정렬합니다.
- limit : 쿼리에서 반환되는 로그 이벤트 수를 제한합니다.
- parse : 로그 필드에서 데이터를 추출하고 쿼리로 추가 처리할 수 있는 임시 필드가 하나 이상 생성됩니다.
12.추가된 위젯은 이름과 사이즈를 조절한 후, ‘Save dashboard’ 버튼을 클릭해 최종 저장합니다.
![34](http://labs.brandi.co.kr///assets/2019/20190530/34.png)
13.생성한 Alarm을 Dashboard에 추가하겠습니다.
![35](http://labs.brandi.co.kr///assets/2019/20190530/35.png)
14.Dashboard가 완성되었습니다!
![36](http://labs.brandi.co.kr///assets/2019/20190530/36.png)
Conclusion
지금까지 CloudWatch 서비스를 소개했습니다. 이 서비스를 이용하면 로그와 지표를 쉽게 시각화할 수 있고, 작업을 자동화할 수도 있는 것을 확인했습니다. CloudWatch를 이용해 애플리케이션을 최적화하고, 원활하게 실행해보는 건 어떨까요. 분명 리소스를 효과적으로 다룰 수 있을 겁니다.