AWS) CloudWatch 모니터링 (feat. Slack)

렁호·2022년 11월 26일
0
post-thumbnail

개요

모든 초기 스타트업이 그러하듯 우리 회사도 MVP의 높은 우선 순위 + 인력 자원 부족을 원인으로 인프라 관리에 비교적 소홀할 수 밖에 없었다. 처음에는 문제가 드러나지 않았지만 프로젝트가 복잡해지고 거대해지면서 여러 이슈들이 발생했고 우리 팀은 인프라 관리 개선을 하기로 했다.

인프라 개선 작업 중 서버 자원의 상태를 모니터링 하고 이슈가 발생했을 때 빠르게 대처하기 위해서 AWS Cloudwatch 서비스를 도입하는 과정을 기록으로 남겨본다.

사실 몇 달 전에 진행했던 작업이지만 책도 읽기 싫고 코드도 짜기 귀찮은 주말 그때의 기억을 되살려 글을 적어봅니다..

Process

1. CloudWatch agent 설치

우선 첫 번째로 사용중인 AWS 인스턴스에 해당 서버의 자원을 트랙킹할 수 있도록 cloudwatch agent를 설치해주어야 한다.

AWS 인스턴스에서 기본적으로 여러 모니터링 지표(cpu 사용량, ..)들을 기본 제공해주긴 하지만 기억장치 사용량에 대한 부분은 기본으로 제공해주지 않는다.

설치 방법은 AWS 공식문서에도 너무 잘 설명되어 있기 때문에 간단하게 설치 가능하다.

  1. cloudwatch agent 설치
    • 운영체제 타입에 따라서 맞는 에이전트를 설치
  2. config-wizard 실행
    • 로그, 데이터 수집 주기, 수집 대상 데이터등 여러 세부 설정이 가능
    • 설정이 완료되면 config.json 파일 생성
  3. 서비스 실행

위의 과정이 끝나면 AWS 콘솔에서 cloudwatch 서비스 -> 모든 지표 -> CWAgeng 항목을 보면 새로이 에이전트를 설치한 인스턴스의 지표들이 추가 된 것을 확인 할 수 있다.

이제 이렇게 수집된 인스턴스의 데이터들을 이용해서 어떤식으로 관리할지는 각자 편한 방법대로 결정하면 된다.

우리 팀의 경우는 특정 지표들에 경보를 추가하여 기준점 이상일 때 알람을 받도록 설정하고, 대시보드를 구성하여 전체적인 지표들을 확인할 수 있도록 하기로 했다.

우선 Slack 으로 알림 받는 방법을 알아보자.

2. SNS 주제 생성

SNS란 Simple Notification Service 의 약자로 쉽게 말해서 비동기 방식으로 메시지를 받아서 전달해주는 메세시 전달 서비스이다. 다양한 형태의 메시지를 여러 AWS 서비스 또는 이메일, 문자 등으로 전달할 수 있다.

이 서비스를 이용해 cloudwatch의 경보에서 발생하는 메시지를 SNS에서 보내고 받은 메시지를 SNS에서 lambda로 전달하도록 셋팅하면 된다.

  1. AWS 콘솔 -> SNS -> 주제 (좌측메뉴) -> 주제 생성
  2. 생성
    • 유형과 이름 필수 선택

위의 과정으로 간단하게 생성 할 수 있다.

3. lambda 생성

lambda는 서버리스 서비스로서 서버 구축 없이 간단하게 서비스와 코드를 실행할 수 있도록 해주는 서비스이다.

서버리스 아키텍처에 대한 개념은 주제와 벗어나고 양이 꽤나 방대함으로 간단하게만 설명한다.

cloudwatch 에서 특정 지표에 대한 경보를 발견하고 경보에 대한 메시지를 만들고 사용자는 그 메시지를 원하는 방식으로 전달받기 위해서 람다를 사용하면 매우 간편하다. 나의 경우 슬랙 채널을 통해 알림을 받고 싶었기 때문에 그에 맞춰 글이 작성 됐음을 참고하자.

직접 람다 함수를 작성하는 방법과 다른 개발자가 작성해 놓은 함수를 이용하는 방식이 있는데 이번엔 후자의 '블루프린트'를 사용하는 방식을 사용해서 진행 해보겠다.

  1. 알람을 받을 슬랙 채널과 앱을 준비

  2. AWS 콘솔 -> lambda -> 함수 생성

  3. 함수 선택

    • 블루 프린트 함수 사용을 클릭 후 'cloudwatch-alarm-to-slack-python' 검색하여 선택
  4. SNS 트리거 설정

    • 위에서 만든 SNS 주제를 선택
  5. 코드 수정

    • 위의 코드는 각자 상황에 맞춰 수정
    • 주석을 잘 보면 이해가 되나 코드가 어렵다면 구글링의 힘을 받아보자
  6. 환경변수 설정

    • 코드 내부에서 환경 변수를 사용하고 싶다면 환경 변수를 추가
  7. 생성

  8. 테스트

이렇게 람다 함수 까지 작성하고 작성한 함수에서 테스트를 통해 슬랙으로 메시지가 잘 전송됨을 확인하면 거의 완료 한 상태이다.

4. cloudwatch 경보 생성

경보는 특정 지표에 어떤 트리거를 설정하여 정해둔 액션을 하도록 설정하는 기능이다.

이 기능을 통해 우리는 트리거가 발동 됐을 때 경보 내용을 연결된 SNS로 전달하고 SNS는 연결된 람다 서비스로 전달하여 슬랙으로 알림 받도록 할 수 있게 된다.

  1. AWS console -> cloudwatch -> 경보 -> 경보 생성

  2. 지표 선택

    • 모니터링 하길 원하는 리소스의 지표를 선택
  3. 이름 및 경보 기준 설정

    • 경보 기준을 원하는 입맛에 따라 설정
  4. 알림 추가

    • 위에서 만든 SNS를 선택
  5. 생성

마무리

이로서 cloud watch 경보 -> SNS -> lambda -> slack 으로 이어지는 모니터링 서비스를 완성 했다.

나 같은 경우에 서버별로 정상, 위험, 경고 이렇게 3개의 경보 기준을 설정하여 알림을 받는 식으로 운영 중이다.

확실히 이 모니터링 운영 방식을 추가 한 후에 에러 상황에 대해서 기민하게 대응이 가능해 졌고 또한 그간 인지하지 못하고 있던 버그들을 발견할 수 있는 좋은 기회가 되었다.

실제로 특정 api에서 메모리 누수가 발생해 서버 워커가 강제 종료되는 일이 계속 발생하고 있었음을 모니터링을 추가 함으로서 알게 되고 문제를 수정할 수 있었다.

결론은 아무리 바빠도 모니터링과 로깅은 꼭 챙기면서 폭풍 개발 하자 !!

profile
식욕, 수면욕, 성욕 만땅

0개의 댓글