[우당탕탕 AWS] AWS - Slack Notification
[우당탕탕 AWS] AWS - Slack Notification
지난번 RDS 스케일 다운 작업을 진행하면서 낮아진 스펙에서의 장애 예방 및 장애대응을 할 수 있는 알림이 더욱 더 필요하다고 생각되었습니다. RDS 스케일 다운과 관련된 내용은 아래 글에서
threezerosin.tistory.com
이전 글에서는 AWS CloudWatch 를 통한 인스턴스의 CPU 사용량 및 잔여 스토리지 등 인스턴스의 관하여 모니터링 하고, 특정 수치를 넘어갈 경우 Slack을 통해 위험 알림을 보내는 시스템을 구축하였습니다.
이번 글에서는 EC2에서 실행되어 서비스 중인 웹사이트의 정상 유무를 판단하고, 비정상이라고 판단되면 Slack 알림을 보내는 기능을 구현해보겠습니다.
목표
운영 중인 서비스의 비정상 감지 및 알림
설명 : 운영중인 서비스의 상태를 체크하는 Lambda를 구성, EventBridge 를 통해 주기적으로 호출, CloudWatch를 통한 이상 감지 및 알림
추가 구성 및 역할
- Lambda: 서비스의 정상유무 판단
- EventBridge: 주기적인 Lambda 함수 호출
- CloudWatch: 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 설정
CloudEvent 설정
이렇게 3개의 서비스를 생성하면 기본적인 세팅이 완료됩니다.
동일한 함수와 스케줄, 경보를 운영과 동일한 테스트 환경에 구성하여 알림이 정상적으로 오는지 확인해보겠습니다.
(위 내용들을 테스트 서버의 전부 적용 후) 개발 RDS를 일시적으로 정지시켜보았습니다.
아래 사진과 같이 Slack에 알림이 정상적으로 온것을 확인할 수 있습니다.