카테고리 없음

[우당탕탕 AWS] AWS - Slack Notification (2)

ooin 2024. 11. 7. 22:12
반응형

 

[우당탕탕 AWS] AWS - Slack Notification

 

[우당탕탕 AWS] AWS - Slack Notification

지난번 RDS 스케일 다운 작업을 진행하면서 낮아진 스펙에서의 장애 예방 및 장애대응을 할 수 있는 알림이 더욱 더 필요하다고 생각되었습니다. RDS 스케일 다운과 관련된 내용은 아래 글에서

threezerosin.tistory.com

 

이전 글에서는 AWS CloudWatch 를 통한 인스턴스의 CPU 사용량 및 잔여 스토리지 등 인스턴스의 관하여 모니터링 하고, 특정 수치를 넘어갈 경우 Slack을 통해 위험 알림을 보내는 시스템을 구축하였습니다.


이번 글에서는 EC2에서 실행되어 서비스 중인 웹사이트의 정상 유무를 판단하고, 비정상이라고 판단되면 Slack 알림을 보내는 기능을 구현해보겠습니다.

 

 

시스템 구성도

목표

운영 중인 서비스의 비정상 감지 및 알림

 

설명 : 운영중인 서비스의 상태를 체크하는 Lambda를 구성, EventBridge 를 통해 주기적으로 호출, CloudWatch를 통한 이상 감지 및 알림 

 

추가 구성 및 역할

  1. Lambda: 서비스의 정상유무 판단
  2. EventBridge: 주기적인 Lambda 함수 호출
  3. CloudWatch: lambda 의 에러 모니터링

 


Lambda 설정

 

신규 lambda 함수 생성

 

함수 이름 입력 및 생성

 

주의 사항

함수를 생성 하는 중 혹은 생성 후에 EC2 인스턴스가 실행중인 VPC를 연결해두었습니다. 그 결과로 제가 작성한 함수가 정상적으로 작동하지 않았습니다. 

 

 

import https from 'https';
import http from 'http';

const httpsGetPromise = (url) => {
    return new Promise((resolve, reject) => {
        https.get(url, (res) => {
            let data = '';

            res.on('data', (chunk) => {
                data += chunk;
            });

            res.on('end', () => {
                if (res.statusCode === 200) {
                    resolve(data);
                } else if (res.statusCode === 500) {
                    reject(new Error(`[DB] 데이터 조회 요청 실패: ${res.statusCode}`));
                } else {
                    reject(new Error(`[Web] 페이지 요청 실패. 상태 코드: ${res.statusCode}`));
                }
            });
        }).on('error', (e) => {
            reject(new Error(`HTTPS 요청 중 오류: ${e.message}`));
        });
    });
};

export const handler = async (event) => {
    const mainPage = '메인 페이지 URL';
    const listApi = '리스트를 조회해오는 페이지 URL';

    try {
        const result = await httpsGetPromise(mainPage);
        const result2 = await httpsGetPromise(listApi);
        console.log('헬스 체크 결과:', result);
        console.log('API 응답 결과:', result2);
        return 'success';
    } catch (error) {
        console.error('헬스 체크 실패:', error.message);
        throw error; 
    }
};

 

함수 테스트 결과

 

 


EventBridge 설정

 

테스트를 위해 10분마다 이벤트 설정
대상 API 로 AWS Lambda Invoke 를 선택
방금 생성한 lambda를 선택

 


CloudEvent 설정

 

CloudEvent 경보 생성

 

지표 선택
lambda 검색
생성한 lambda의 errors 경보 선택
현재 운영중인 경보의 이미지로 기간은 1시간 (테스트를 위해서는 10분 미만 간격으로 설정)

 

 

이렇게 3개의 서비스를 생성하면 기본적인 세팅이 완료됩니다.

 


 

동일한 함수와 스케줄, 경보를 운영과 동일한 테스트 환경에 구성하여 알림이 정상적으로 오는지 확인해보겠습니다.

 

(위 내용들을 테스트 서버의 전부 적용 후) 개발 RDS를 일시적으로 정지시켜보았습니다.

 

개발 RDS 일시적인 중지 (데이터를 호출하지 못하는 상황 구현)

 

 

아래 사진과 같이 Slack에 알림이 정상적으로 온것을 확인할 수 있습니다.

경보에서도 수치가 임계치까지 도달한 모습을 확인

 

반응형