안녕하세요, 저는 이번에 AWS를 통한 모니터링을 주제로 기술 세미나를 진행했습니다.

여러 프로젝트를 통해서 AWS에 서비스를 배포한 경험이 있으신 분들이 계실텐데요, 실제 서비스를 배포한다면 단순히 배포에서 끝나는 것이 아니라 이 후 모니터링을 통해 장애나 서비스 중단 등의 문제가 발생하는지 확인해보아야 합니다. 이번 주제에서는 AWS가 제공하는 서비스를 통해, 모니터링을 어떻게 할 수 있는지에 대해 알아보겠습니다.

1. AWS

  • Amazon Web Services
  • 아마존(Amazon)에서 제공하는 클라우드 서비스로, 네트워킹을 기반으로 가상 컴퓨터와 스토리지, 네트워크 인프라 등 다양한 서비스를 제공합니다.

AWS에서는 300개가 넘는 다양한 서비스를 제공하는데요, 이 중 가장 많이 쓰이는 서비스들이 무엇이 있는지에 대해도 간단히 살펴보겠습니다.

2. AWS가 제공하는 다양한 서비스

Amazon EC2 (Elastic Compute Cloud)

  • 가상 서버를 제공하며, 사용자는 필요에 따라 가상 서버를 프로비저닝하고 실행할 수 있습니다.
  • EC2는 유연하고 확장 가능한 클라우드 인프라를 제공하여 다양한 애플리케이션을 실행하고 관리할 수 있으며, Auto Scale을 통해 트래픽이 증가, 감소할 때 이에 대응하여 인스턴스의 수를 동적으로 조정할 수 있습니다.

    Amazon S3 (Simple Storage Service)

  • 객체 스토리지 서비스로, 대규모의 데이터를 안전하게 저장하고 검색할 수 있습니다.
  • 데이터는 버킷이라는 컨테이너에 저장하며, 각 객체는 고유한 키로 식별됩니다.

    Amazon RDS (Relational Database Service)

  • 관리형 관계형 데이터베이스 서비스로, MySQL, PostgreSQL, Oracle 등을 제공합니다.

배포 경험이 있으시다면, 다들 한번 쯤 들어봤을 법한 서비스들이네요 ! 다양한 서비스를 제공해주는만큼, 모니터링을 위한 서비스도 있습니다.

3. 모니터링에 필요한 AWS 서비스들

Amazon CloudWatch

  • AWS 리소스와 AWS에서 실시간으로 실행 중인 애플리케이션을 모니터링 하는 서비스
  • 지표(metric)를 감시해 알림을 보내거나 임계값을 위반한 경우 모니터링 중인 리소스를 자동으로 변경하는 경보를 생성할 수 있습니다.

    • 지표(Metric) : 모니터링할 변수 (ex. 특정 EC2 인스턴스의 CPU 사용량, 네트워크 입출력, 로그 등)
    • 경보 : 생성해둔 단일 지표를 감시합니다.
    • 로그 : Amazon EC2과 같은 시스템과 애플리케이션 및 사용자 지정 로그 파일을 모니터링, 저장 및 액세스 해주는 기능을 제공합니다.

기본적으로 EC2 인스턴스, EBS 볼륨, RDS DB 인스턴스과 같은 많이 쓰이는 서비스에서 이러한 리소스에 대한 지표를 제공해주기 때문에 기본 제공되는 지표들은 따로 설정해주지 않고도 쉽게 사용할 수 있습니다. 경보를 생성할 때, 지표에 대해 설정해둔 임계값을 초과했을 때에 대한 대처 방식 등을 설정할 수 있습니다. 예를 들어 CPU 사용량이 지표라면 경보 설정을 할 때 50%를 임계값으로 설정해놓고, 초과했을 경우 이메일, 슬랙 등을 통해 알람을 받거나, lambda 등의 다른 서비스를 사용하여 원하는 방식으로 알람을 받을 수 있습니다.

Amazon SNS(Simple Notification Service)

  • 구독 중인 Service 또는 사용자(Client)에 메시지 전달, 전송을 조정 및 관리 하는 웹서비스
  • 만들어진 주제(Topic)에 대해 구독을 생성하고 이를 통해 구독되어있는 Email 주소들에 대해 메시지를 전송할 수 있습니다.
  • 하나의 주제에 대해 다양한 대상(이메일, SMS, AWS lambda 함수 등)이 구독할 수 있습니다.

Amazon Lambda

  • AWS에서 제공하는 서버리스 컴퓨팅 플랫폼
  • 코드를 계속 실행시키기 보다는 특정한 시기에만 실행시키는 경우에 Lambda를 사용하면 유용합니다.

예를 들어 앞선 SNS 토픽을 람다가 구독한다고 했을 때, SNS 토픽을 통해 람다가 알림을 받았을 경우, 람다를 통해 이메일, 슬랙 등에 전송할 메시지를 처리할 수 있습니다.

지금까지는 AWS의 서비스들을 살펴봤습니다. 이제는 위의 서비스들을 활용하여 간단하게 AWS 모니터링 아키텍처를 구축해보겠습니다.

특정 EC2 인스턴스에서 log를 지표로 두어서 모니터링 하다가 경보 상태가 되면 SNS를 통해 이메일에 알람이 가도록 구현하겠습니다.

1. EC2에서 CloudWatch에 액세스할 권한을 부여하기

먼저 CloudWatch를 사용하기 위해 EC2에서 CloudWatch에 액세스 할 권한을 줍니다. 리소스에 대한 권한을 담당하는 IAM 서비스를 통해 권한을 부여할 수 있습니다. 지금 보고 계신 이미지와 같이 신뢰할 엔터티 유형으로 AWS 서비스를 선택하고 사용사례로 EC2를 선택하여 EC2가 작업을 수행할 수 있도록 합니다. image

다음 단계는 권한 추가 입니다. EC2가 어떤 권한을 가질지 선택하면 되는데요, Cloudwatch에 액세스 해야하므로 cloudwatchfullaccess 라는 권한 정책을 선택합니다. image

생성이 된다면 다음과 같이 cloudwatch가 생성된 것을 볼 수 있습니다. image

2. CloudWatch 로그 그룹 생성하기

다음으로는 로그 그룹을 생성해줍니다. 로그 그룹은 로그 보존 기간, 모니터링 및 액세스 제어 등의 설정을 공유하는 그룹입니다. 쉽게 말하면 로그 폴더라고 생각하면 좋을 것 같고, 로그 폴더 안에 있는 각각의 파일을 로그스트림 이라고 생각하시면 될 것 같습니다. 다음 이미지와 같이 cloudwatch 서비스에서 로그 그룹 이름 등을 설정한 후 생성해줍니다. image

다음으로는 생성한 로그 그룹을 EC2에 연동해줘야하는데요, 앞선 첫번째 단계에서 EC2가 클라우드워치에 액세스할 권한을 생성해주었으니, EC2 인스턴스에 접속하여 생성해둔 권한을 연결해줍니다. 이미지를 통해서 보게되면, 이제 TeachMe 라는 이름을 가진 EC2 인스턴스는 cloudwatch에 액세스할 수 있게 되었습니다. image

3. CloudWatch에서 로그 확인하기

방금 1,2단계를 통해 무엇을 했는지 이해가 가셨나요? 안가셨으면 이번 단계를 통해서 어떻게 된것인지 확인을 해보겠습니다. EC2에서 서비스가 실행되고 있다고 했을 때, 이제 클라우드 워치의 로그그룹에 들어가게 되면 EC2 인스턴스의 로그를 실시간으로 확인할 수 있습니다. image

다시한번 정리하면 EC2에서 클라우드워치에 액세스하기 위한 권한을 생성해주었으니, EC2의 로그들을 클라우드 워치에서 확인할 수 있게 된 것입니다.

4. 지표 필터 생성하기

이제 로그에 특정한 키워드가 찍히면 이메일로 알람을 보내도록 설정하겠습니다. 먼저 생성해둔 로그 그룹을 체크한 후 지표 필터를 생성합니다. 여기에서 지표는 로그가 되고 필터는 특정한 키워드가 됩니다. image

ERROR가 찍힐 때 알람이 가도록 하기 위해 패턴을 그림과 같이 %ERROR%로 설정해둡니다. 아래와 같은 로그이벤트가 있는데, 이 중 ERROR 키워드가 포함된 로그이벤트를 필터링해줍니다. 이를 통해서 지표 필터를 생성해주었습니다. image

5. 지표 필터에 대한 경보 생성하기

앞선 단계에서 생성한 지표 필터에 대해 경보를 생성합니다. 쉽게 말하면, 앞 단계에서 로그에 에러 라는 키워드가 생겨서 필터링이 되도록 했다면, 경보를 생성하는 단계에서는 로그에 에러가 찍혔을 때 어떤 작업을 할 것인지, 에러가 몇 개 떴을 때 해당 작업을 수행할 것인지를 정해주는 단계입니다. 먼저 생성한 지표 필터를 선택한 후 해당 지표 필터에 대해 경보를 생성합니다. image

통계, 기간, 조건 등을 선택하면 되는데요, 저는 아까 생성한 Errors 라는 지표에 대한 경보를 생성을 하고 있고, 임계값으로는 1분 동안 로그에 Error 라는 키워드가 2번 이상 나타났을 경우 경보 상태가 되도록 설정했습니다. 여기에서 경보상태란, 정해둔 임계값을 넘은 경우라고 생각하면 좋을 것 같습니다. image

다음으로는 작업 구성을 합니다. 경보 상태일 때 작업을 트리거 하도록 설정하고, 새 주제를 생성한 다음 알람 받을 이메일을 입력해주었습니다. 사전에 슬랙과 연동이 되어있는 SNS 주제를 생성해두었다면, 기존 SNS 주제를 선택하여 슬랙, 디스코드 등에도 알람을 보낼 수 있습니다. image

이러한 단계를 통해 경보 생성까지 완료 되었습니다. 이제 다음 단계를 통해 실제로 이메일에 알람이 오는지 테스트 하겠습니다.

6. 테스트

성공적으로 이메일에 알람이 오는지 확인하기 위해 연결된 로그 스트림에서 로그 이벤트 생성을 클릭하여 ERROR 가 포함된 이벤트를 생성합니다. image

예상대로라면 앞서 생성해둔 지표 필터에 ERROR 라는 키워드가 필터링 되어서 경보상태가 될 것이고, 이 때 이메일로 알람이 갈 것입니다. 이메일에 접속하면 다음과 같이 로그에 에러가 출력되었다는 알람이 도착한 것을 볼 수 있습니다. image

이를 통해 모니터링을 간단하게 구현해보았습니다. 이 밖에도 슬랙에 알람이 갈 수 있도록 SNS 설정을 하거나, Lambda를 통해서 전송할 메시지를 꾸밀 수도 있는 등 다양하게 활용할 수 있습니다 !

이번 프로젝트에서는 Lambda까지 사용했었는데요, 기회가 된다면 Lambda까지 적용한 모니터링에 대해서도 포스팅 하겠습니다! 감사합니다 :)