AWS Elastic Beanstalk CPU 사용률 모니터링하기

zunzero·2022년 12월 16일
0

AWS

목록 보기
3/7

최근 회사 서버가 자주 맛탱이가 갔다.
이슈를 파악해서 해결도 했지만, 팀장님께서 CPU 사용률 모니터링 하면서 70% 이상의 사용률이 감지가 되면 슬랙이나 문자로 오도록 하는 기능을 구현해보라 하셨다.

AWS SNS

우선 AWS SNS라는, AWS에서 제공하는 푸시 알림 서비스를 활용하기로 했다.
이메일, SMS, HTTP, 람다 등을 알림 수단으로 활용할 수 있다.

AWS SNS에는 주제와 구독이라는 개념이 있다.
쉽게 이야히가하자면 주제는 "명칭"이라고 이해하면 좋을 것 같다.
그리고 구독은 엔드포인트라고도 불리는데, 알림이 발생할 수단이라고 생각하면 될 것 같다.

특정 상태변경에 대해 주제 A를 설정해두면 주제 A에 대한 구독(엔드포인트)으로 알림이 가는 것이다.

주제를 만들었으면 우선 됐다.
이에 대한 구독으로 아래와 같은 프로토콜들을 설정할 수 있는데, 서울 지역의 경우에는 AWS에서 SMS프로토콜을 지원하지 않는다.
그런데 서울 지역 서버에 대한 알림을 문자로 받고 싶을 땐 어떻게 할까?
뒤에서 자세히 설명하도록 하겠다.ㅎㅎ

Elastic Beanstalk 경보

이렇게 주제를 만들었으면, 다음으로는 경보를 만들 차례이다.
경보를 만들 때에는 AWS의 CloudWatch 서비스를 이용하는 방법도 있지만, 우리는 Elastic Beanstalk의 경보 알림 서비스를 사용할 것이다.

Elastic Beanstalk 환경에 접속하면 위와 같은 탭들을 볼 수 있는데, 모니터링 탭에서 경보를 생성하고 경보 탭에서 경보를 확인할 수 있다.

모니터링 탭에 접속하면 다음과 같이 서버의 상태를 확인할 수 있는 지표들을 볼 수 있다.
우리는 CPU 상태에 대해 경보를 울릴 것이기 때문에 CPU 사용률 탭에 있는 '종' 버튼을 눌러 경보를 생성할 것이다.

이름이나 설명, 임계값 등을 설정하고, 알림 항목을 설정해주어야 한다.
이때 알림항목은 우리가 앞서 만든 주제를 선택하면 된다.

Elastic Beanstalk 경보 -> AWS SNS -> 엔드포인트로 알림

위와 같은 로직으로 동작하는 것이다.

AWS Chatbot을 이용해 슬랙으로 알림 보내기

AWS Chatbot에 접속하면 위와 같이 Amazon Chime과 Slack 중 하나를 선택할 수 있게 한다.

우리는 슬랙을 선택해서 슬랙의 어떤 채널에 알림을 보낼 지 설정할 수 있다.

Chatbot을 활용해 슬랙 기능을 새로 구성할 때도 SNS 설정을 해두어야 한다.
이때의 SNS 설정은, Chatbot을 SNS의 구독으로, 즉 엔드포인트로 설정하겠다는 의미이다.

Elastic Beanstalk 경보 -> AWS SNS -> 엔드포인트로 알림: Chatbot에 설정된 슬랙채널

이후에 우리가 만든 SNS의 주제에 접속해보면 해당 엔드포인트로 구독이 생성되어 있는 것을 확인할 수 있다.

문자 알림 기능

앞서 언급했듯이, 서울 지역 서버에는 AWS가 SMS 프로토콜을 지원하지 않는다.
하지만 AWS를 활용해서 서울 리젼으로 SMS를 보낼 수는 있다.
AWS가 SMS 프로토콜을 지원하는 대표적인 리젼은 도쿄이다.
따라서 우리는 도쿄 리젼에서 서울 리젼으로 문자를 보내는 기능을 생각해 볼 수 있다.

이에 대한 방법으로 람다를 활용한 방식이 대표적이다.
서울 리젼에 람다함수를 만드는데, 람다함수는 AWS 도쿄리전에서 문자를 보내는 기능을 하는 것이다.
그리고 해당 람다를 SNS에 구독, 즉 엔드포인트로 설정해두는 것이다.

우선 람다를 작성해보자.
관련 람다는 AWS 공식 문서에도 나타나있고 구글링을 해보면 많이 나와있다.

const AWS = require('aws-sdk');

AWS.config.update({region: 'ap-northeast-1'});

exports.handler = (event, context, callback) => {
    
    const phoneNumbers = '+82phoneNum';
    
	const params = {
            Message: '인스턴스 CPU 사용률이 70%를 초과하였습니다.',
            PhoneNumber: phoneNumber
        };
        
    const smsRunPromise= new AWS.SNS().publish(params).promise();
        
    smsRunPromise.then(
         function(data) {
             callback(null, 'PhoneNumber is ' + phoneNumber);
         }).catch(
         function(err) {
             callback(err);
    });
};

위의 람다 함수를 등록하고, 해당 람다함수를 SNS의 구독으로 설정해두기만 하면 끝이다!
이때, AWS.config.update({region: 'ap-northeast-1'}) 이라는 문구를 주목하자.
AWS에서 SMS 프로토콜을 지원하는 것은 서울 리젼이 아닌 도쿄 리젼이기 때문에 위와 같이 설정한 것이다.
만약 해당 소스코드를 ap-northeast-2 라고 설정하면 문자가 전송되지 않을 것이다. (내가 해봤다.)

AWS SNS 페이지까지 가서 구독을 설정하기 귀찮다면 아래와 같이 트리거를 설정하면 된다. (난 이렇게 했다.)

주의

람다의 api url을 가져다가 SNS 프로토콜의 https로 연결하면 안된다.!!!
SNS 프르토콜의 AWS lambda를 설정하던가 위처럼 람다의 트리거로 SNS를 설정하자

profile
나만 읽을 수 있는 블로그

0개의 댓글