ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CloudWatch를 사용해서 Discord에서 EC2 상태 알림 받기
    운영 중인 서비스/Coconut. 2024. 2. 16. 20:43

     

     

    aws에서 제공하는 프리티어 EC2를 사용해서 개발 환경을 운영하고 있습니다.

    도커 컨테이너 위에 Spring 서버가 떠 있는데, 종종 서버가 종료되는 상황이 발생해서 알림을 받아보려고 합니다.

     

    지금 이슈가 발생하고 있는 경우는 크게 2가지 입니다.

    1. cpu 사용율이 올라가면서 도커 컨테이너 중단됨

    2. cpu 사용율이 올라가면서 'Instance status checks' 가 fail 됨

     

    각 케이스에 맞는 알림을 discord에서 받아볼 수 있도록 설정을 해보겠습니다.

     

     

     


     

     

    1. 알림을 보내는 Lamda 함수 작성

    Lamda 서비스를 이번에 처음 사용해봤는데, 간단하게 이벤트 핸들러에 전달되는 콜백 함수 정도로 생각하면 좋을 것 같습니다.

    실행될 메소드와 실행환경을 다른 서비스에 등록하면 원하는 이벤트에 맞게 실행시켜주는 매커니즘으로 이해했습니다.

     

    우선 이슈가 발생되었을 때 트리거 될 함수를 aws 의 lamda 서비스를 사용해서 작성해보겠습니다.

    적절한 함수 이름을 적어주었고, 저는 node 환경이 편하기 때문에 런타임은 node를 설정하였습니다.

     

    처음에 아래와 같은 함수를 디폴트로 제공해주는데, 여기서 부터 원하는 로직을 적어주면 됩니다.

     

    gpt에게 부탁해서 메세지를 보낼 수 있는 함수를 작성하였습니다.

    제공하는 주소에 post 요청을 보내고 'end' 혹은 'error' 이벤트에 적절한 응답을 lamda에 리턴해주는 코드입니다.

    알맞은 메세지와 디스코드에서 웹훅 url을 찾아서 적용해주면 됩니다.

    import https from 'https';
    
    export async function handler(event) {
        const webhookUrl = new URL('여기에_당신의_디스코드_웹훅_URL'); // discord web hook url
        const postData = JSON.stringify({
            'content': 'cpu 사용량이 증가하고 있습니다.' // 메시지 내용
        });
    
        const options = {
            hostname: webhookUrl.hostname,
            port: 443,
            path: webhookUrl.pathname + webhookUrl.search,
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Content-Length': Buffer.byteLength(postData),
            },
        };
    
        return new Promise((resolve, reject) => {
            const req = https.request(options, (res) => {
                let data = '';
    
                res.on('data', (chunk) => {
                    data += chunk;
                });
    
                res.on('end', () => {
                    resolve({
                        statusCode: 200,
                        body: 'Message sent to Discord!',
                    });
                });
            });
    
            req.on('error', (e) => {
                reject({
                    statusCode: 500,
                    body: `Problem with request: ${e.message}`,
                });
            });
    
            // Write data to request body
            req.write(postData);
            req.end();
        });
    }

     

    discord의 채널 설정에 들어가면 Integrations 항목에서 Webhook을 생성할 수 있습니다.

     

    원하는 메세지와 url을 추가해 준 뒤에 Deploy를 통해 저장을 해줍니다.

     

    그리고 Test 버튼을 통해서 메세지가 잘 가는지 확인을 해봅니다.

    적절한 이벤트 이름을 추가하고 저장해줍니다.

     

    다시 한번 테스트 버튼을 누르면 화면에서 Lamda에 적용한 함수가 잘 실행되었다는 결과를 볼 수 있습니다.

     

    이어서 discord에도 메세지가 온 것을 확인할 수 있습니다.

    이제 Lamda 함수 자체는 잘 작동하는 것을 확인했으니, 이제 적절한 이벤트에 연결을 해주기만 하면 될 것 같습니다.

     

     

     

    2.  Amazon SNS의 토픽 생성 

    토픽이라는 단어를 사용하는 것 보니 메세징 매커니즘을 사용하는 듯 합니다.

     

    create topic 버튼을 눌러서 적절한 옵션과 이름으로 topic을 생성해 줍니다.

    lamda를 사용하려면 Standard 를 선택해주어야합니다.

     

    토픽을 생성했다면 이제 해당 토픽에 들어오는 메세지를 consume 할 대상을 등록해주어야할 것 같습니다.

     

    Lamda Protocol을 선택해주고 위에서 만들었던 Lamda 함수의 arn을 복사해서 가져옵니다.

    Create subscription하면 완성입니다.

     

     

    설정할 Lamda 함수의 arn을 찾을 수 있습니다.

     

     

    3.  EC2에서 알람 생성

    작성하면서 생각해보니 메세징 매커니즘이라고 한다면 이제 producer 쪽을 설정해줘야할 것 같습니다.

    토픽에 이벤트가 전달될 수 있도록 EC2에 설정을 추가해보겠습니다.

     

    알림을 설정하기에 앞서서 Monitoring 탭에가서 현재 CPU 사용율이 어느정도 인지 살펴보겠습니다.

    EC2 생성만 해두고 아무것도 하지 않은 상태기 때문에 0.4%의 사용율을 보이고 있습니다.

     

     

    이제 EC2의 status and alarm 탭을 찾아가서 알림을 설정해보겠습니다.

    우측의 액션 버튼을 사용해서 알람을 생성합니다.

     

    새로운 알람을 생성하는 옵션을 선택하고, 어떤 케이스에 알람을 발생시킬 것인지 선택을 해줍니다.

    저는 CPU 사용량에 대한 알람을 받고 싶기 때문에 CPU utilization을 선택해주었습니다.

    또 우선은 알림이 잘 작동하는지를 확인하기 위해서 5%로 설정을 해놓고 확인을 해보겠습니다.

     

    생성을 완료하면 status and alarm 탭에서 생성된 알람을 확인할 수 있습니다.

     

    생성하고 활성화 되기까지 데이터 수집이 필요하기 때문에 일정 시간이 지나야합니다.

     

    또 이런 알람들은 Cloud Watch 라는 또 다른 서비스에서 관리할 수 있습니다.

    액션으로 Notification 타입으로 제가 만든 dev_alarm 토픽에 연결되어 있는 것을 확인할 수 있습니다.

     

     

    4. 알람 발송 확인

    EC2 사용량을 올려서 5%가 초과되었을 때 알림이 오는지 확인해보겠습니다.

    일부러 낮게 기준점을 생성했으니 간단하게 서버만 실행시켜도 알람이 생성될 것 같습니다.

     

    여기서 하나 이상점을 발견했습니다.

    EC2 기준으로는 이미 20%를 넘었기 때문에 알람이 발송되었어야했는데 메세지가 오지 않습니다.

     

    Cloud watch 에서 살표보니 동일 시간 때에 동일한 지표를 사용하는데 EC2 monitoring의 지표와 서로 다른 값을 보여주는 것을 확인할 수 있습니다. EC2의 지표는 20%가 넘는 반면에 Cloud Watch에서는 미미한 변화를 보이고 있습니다.

     

     

    둘의 정보 수집 빈도가 달라서 그런 것으로 보입니다. EC2에서 detailed monitoring을 선택하면 1분단위로 정보를 갱신할 수 있는데 추가 비용이 발생하는 것 같습니다. 그래서 Cloud Watch를 기준으로 조금 더 낮은 기준점으로 알람이 발송되도록 설정할 필요가 있을 것 같습니다.

     

    서버 가동으로 5%가 달성이 어렵다면 Apache benchmark를 사용해서 추가적으로 요청을 밀어넣어 cpu 사용량을 끌어올려보겠습니다.

    ab -n 10000 -c 100 http://server.com

     

     

    요청이 들어가니 cpu 사용량이 증가합니다.

     

     

    비슷한 시간 때에 Cloud Watch에도 그래프 변동을 확인할 수 있습니다. ( 중간에 90%는 잘못된 지표이니 무시해주세요)

     

     

    discord에도 메세지가 전달되는 것을 확인할 수 있습니다.

     

    Cloud Watch가 EC2로 부터 정보를 받는 갭이 크다보니 프리티어 스펙으로는 정교한 알람을 받는 것은 어려울 것 같고, 5분 이상 위험상태가 지속되어야 받을 수 있다고 보는 것이 적절할 것 같습니다.

     

     

    5. 추가 알람 설정

    위에서는 CPU 사용양을 기준으로 알람을 받도록 설정하였습니다. 이 뿐만아니라 다양한 지표를 기준으로 알람을 설정할 수 있습니다.

    저는 instance status 를 기준으로 알람을 하나 더 추가해서 사용하도록 하겠습니다.

     

     

     

     

    감사합니다.

     

     

     

Designed by Tistory.