Identifying unhealthy targets of Elastic Load Balancer
서버가 내려가거나 여러 이유로 unHealthy할 때 알림이 오도록 하는 작업을 했다.
위에 문서를 참고해서 작업했다.
지금 대상그룹에 2개 연결해 두었는데 하나에서 계속 unHealthy가 발생해서 경보가 발생하고 있는 상태다...ㅋㅋㅋㅋ 아무튼
조건은 elb의 unHealthy count가 1분에 1개 이상인 경우! (정상인 경우에는 unHealthy count가 0개일 거니까)
unHealthy가 1개 이상이면 SNS가 트리거 되도록 구성했다. SNS는 lambda와 연결해서 내 팀즈 채널로 알림이 오도록 설정했다.
람다의 코드는 다음과 같다. Node로 짰당.
import * as https from 'https'
import * as os from 'os'
export const handler = async (event) => {
return await doPostRequest()
.then(result => console.log(`팀즈 알림 성공 status: ${result}`))
.catch(err => console.error(`팀즈로 알림 발송 실패: ${JSON.stringify(event)} => ${err}`));
};
const doPostRequest = () => {
const nowDateTimeStr = nowDateTime()
const data = {
title: "health check 실패",
text: `[${nowDateTimeStr}] **BO개발 BO health check** 에 실패하였습니다.`
};
return new Promise((resolve, reject) => {
const options = {
host: process.env.TEAMS_HOST,
path: process.env.TEAMS_URL,
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
};
// request생성 및 callback 세팅
const req = https.request(options, (res) => {
resolve(JSON.stringify(res.statusCode));
});
// request 실패시
req.on('error', (e) => {
reject(e.message);
});
// request
req.write(JSON.stringify(data));
// request 종료
req.end();
});
};
const nowDateTime = () => {
const today = new Date();
const year = today.getFullYear();
const month = ('0' + today.getMonth()).slice(-2);
const day = ('0' + today.getDate()).slice(-2);
const hours = ('0' + today.getHours()).slice(-2);
const minutes = ('0' + today.getMinutes()).slice(-2);
const seconds = ('0' + today.getSeconds()).slice(-2);
return year + "-" + month + "-" + day + " " + hours + ':' + minutes + ':' + seconds
}
팀즈 호스트랑 URL 시간 세팅을위한 값 TZ은 환경변수에 설정 해두었다.
팀즈로 메시지를 보내는데 시간이 조금 걸리길래 제한시간을 10초로 수정해주었다.
마침(?ㅋㅋ) 지금 unHealthy한 상태여서 팀즈에 메시지가 잘 오는 걸 확인할 수 있었다..