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.규칙 생성을 클릭합니다.
2.대상을 호출할 일정을 설정합니다.
호출 방식에는 이벤트 패턴과 일정 두 가지가 있습니다. 이벤트 패턴은 json 구조로 표현됩니다. AWS 서비스에서 발생하는 패턴과 일치하면 트리거가 동작합니다. 일정은 지정한 시간과 일치하면 트리거가 동작합니다.
- cron 또는 rate 표현식을 사용해 예약된 모든 이벤트는 UTC+09:00 시간대를 사용합니다. 최초 단위는 1분입니다.
- 아래는 각각의 필드에 대한 일정 cron식 설명입니다.
이번 예제에서는 특정 시간에 트리거되는 일정으로 설정하겠습니다.
매일 4시에 동작하도록 설정
19 + 9(UTC) - 24(하루) = 새벽 4시
3.대상 추가를 선택해 호출할 대상을 지정합니다.
Lambda 함수 외에 여러 서비스를 선택할 수 있지만 이번 예제에서는 Lambda 함수를 지정하여 구성하겠습니다.
4.규칙의 이름과 설명을 등록하고 규칙 생성을 클릭합니다.
5.규칙이 생성된 것을 볼 수 있습니다.
2. Logs
CloudWatch Logs는 운영 중인 애플리케이션 리소스를 기록하고 액세스할 수 있으며, 관련된 로그 데이터를 검색할 수도 있습니다.
1.생성된 규칙이 지정된 시간에 동작하면 CloudWatch Logs에 로그 그룹이 생성된 걸 확인할 수 있습니다.
2.Lambda 함수에서 실행된 로그 메시지를 확인할 수 있으며 필터링도 가능합니다.
3.로그 그룹에 이벤트 만료 시점을 설정해 오래된 데이터는 모두 자동으로 삭제되도록 설정할 수 있습니다.
3. Custom Metrics(맞춤형 지표) 생성하기
모니터링하고자 하는 통계치를 직접 선정하고, CloudWatch로 보내 관리하는 지표를 생성해보겠습니다.
1.Log Groups에 대한 지표를 생성하겠습니다. 해당 Log Groups에 ‘Filters’를 클릭합니다.
2.’Add Metric Filter’를 클릭합니다.
3.로그 지표에 대한 필터 패턴을 정의합니다.
Filter Pattern
* “INFO Success 200” → 세 단어를 모두 포함하는 로그 이벤트 메시지와 일치
* “INFO - Start - End” → ‘INFO’ 포함된 메시지 중에 ‘Start’, ‘End’ 제외된 필터 로그 이벤트 메시지와 일치
4.필터 및 지표 정보를 입력한 후 ‘Create Filter’를 클릭합니다.
Metric Details
* Metric Namespace → CloudWatch 지표에 대한 대상 네임 스페이스
* Metric Name → 모니터링된 로그 정보가 게시되는 CloudWatch 지표의 이름
* Metric Value → 일치하는 로그가 발견될 때마다 지표에 게시하는 숫자 값
* Default Value → 일치하는 로그가 발견되지 않은 기간 동안 지표 필터에 보고되는 값
5.두 가지 케이스의 필터를 생성했습니다.
4. Alarm 생성
단일 CloudWatch 지표를 감시하거나 CloudWatch 측정치를 기반으로 하는 수학 표현식의 결과를 감시하는 CloudWatch 경보를 생성할 수 있습니다. 지표가 지정된 임계값에 도달하면 자동으로 이메일을 보내는 Alarm을 만들어보겠습니다.
1.추가된 지표 필터에 ‘Create Alarm’ 버튼을 클릭해 경보를 추가합니다.
2.경보 세부 정보 및 수행할 작업을 정의합니다.
경보 평가
경보를 생성할 때, CloudWatch가 경보 상태를 변경하는 조건 세 가지에 대한 설정을 지정할 수 있습니다.
- 기간은 경보에 대해 개별 데이터 포인트를 생성하기 위해 지표 또는 표현식을 평가하는 기간입니다. 초로 표시됩니다. 1분을 기간으로 선택하면 1분마다 하나의 데이터 포인트가 생성됩니다.
- Evaluation Period(평가 기간)는 경보 상태를 결정할 때 평가할 가장 최근의 기간 또는 데이터 포인트의 수입니다.
- Datapoints to Alarm(경보에 대한 데이터포인트)는 평가 기간에 경보가
ALARM
상태에 도달하게 만드는 위반 데이터 포인트의 수입니다. 위반 데이터 포인트가 연속적일 필요는 없습니다. Evaluation Period(평가 기간)와 동일한 마지막 데이터 포인트의 수 이내면 됩니다.
3.경보가 발생할 Alarm 상태와 알림 받을 이메일을 등록합니다.
경보 상태
/OK/
지표 또는 표현식이 정의된 임계값 내에 있습니다./ALARM/
지표 또는 표현식이 정의된 임계값을 벗어났습니다./INSUFFICIENT_DATA/
경보가 방금 시작되었거나, 측정치를 사용할 수 없거나, 또는 측정치를 통해 경보 상태를 결정하는데 사용할 충분한 데이터가 없습니다.
4.이메일 수신함에서 ‘AWS 알림 - 구독 확인’이라는 제목의 메일을 클릭합니다. 내용에 포함된 링크를 클릭해 알림을 수신할 것을 확인합니다. (AWS는 확인된 주소로만 알림을 전송할 수 있습니다.)
5.이메일 수신함을 확인해 ‘Confirm subscription’을 클릭합니다.
6.등록한 이메일이 확인되었습니다.
7.AWS에 이메일이 정상적으로 등록되었는지 SNS Subscriptions 메뉴에서 확인합니다.
8.Lambda를 실행해 Alarm 상태를 변경해보겠습니다.
9.등록한 이메일 주소로 Alarm 메일이 도착했습니다.
5. Dashboards
CloudWatch를 통해 리소스를 손쉽게 모니터링할 수 있는 맞춤형 통계 기능입니다.
1.Metric Filter에서 추가된 Custom Namespaces를 클릭합니다.
2.생성된 Metrics를 선택한 후, Graphed metrics Tab을 클릭합니다.
3.Metrics에 표시될 그래프를 설정합니다.
1)그래프 제목 : testLambda1
2)그래프 표시 : 숫자
3)그래프 라벨 : testMetrics-400, testMetrics-200
4)통계 : 합계
5)기간 : 1 Day
4.수식을 응용하여 여러 형식의 Metrics 표현식을 추가하겠습니다.
지표 수식 함수
* 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’를 클릭합니다.
7.’Add widget’을 클릭해 Number 유형을 선택합니다.
8.Source Tab에서 복사해 둔 지표 Source를 붙여 넣고, ‘Create widget’을 클릭합니다.
9.위젯이 추가되었습니다. 추가된 위젯은 ‘Save dashboard’ 버튼을 클릭해야 최종 저장됩니다.
10.이번에는 로그 메시지 결과를 확인할 수 있는 Query result 유형을 추가해보겠습니다. 먼저 Query result 유형을 선택합니다.
11.로그 메시지에 조건을 추가해 필터링합니다.
잠시 쉬어가기!: Query 언어가 지원하는 여섯 가지 명령 유형
- fields : 지정한 필드를 검색합니다. 필드 명령 내에서 함수 및 연산을 사용할 수 있습니다. 만약 @ 기호, 마침표(.) 및 영숫자 문자 이외의 문자가 포함된 로그 필드가 쿼리에 명명되어 있으면 해당 필드 이름은 억음 기호로 둘러싸야 합니다.
- filter : 하나 이상의 조건으로 필터링합니다.
filter statusCode like /2\d\d/
→ 필드 statusCode의 값이 200~299인 로그 이벤트를 반환합니다. - stats : 로그 필드에 대한 지정된 시간 간격의 집계 통계를 계산합니다.
- sort : 검색된 로그 이벤트를 정렬합니다.
- limit : 쿼리에서 반환되는 로그 이벤트 수를 제한합니다.
- parse : 로그 필드에서 데이터를 추출하고 쿼리로 추가 처리할 수 있는 임시 필드가 하나 이상 생성됩니다.
12.추가된 위젯은 이름과 사이즈를 조절한 후, ‘Save dashboard’ 버튼을 클릭해 최종 저장합니다.
13.생성한 Alarm을 Dashboard에 추가하겠습니다.
14.Dashboard가 완성되었습니다!
Conclusion
지금까지 CloudWatch 서비스를 소개했습니다. 이 서비스를 이용하면 로그와 지표를 쉽게 시각화할 수 있고, 작업을 자동화할 수도 있는 것을 확인했습니다. CloudWatch를 이용해 애플리케이션을 최적화하고, 원활하게 실행해보는 건 어떨까요. 분명 리소스를 효과적으로 다룰 수 있을 겁니다.