안녕하세요. 올리브영 QA Enginner 멜짱입니다.
올리브영은 인시던트를 어떻게 관리하고 있는가? 2탄 🙈
이전에 작성되었던 올리브영은 인시던트를 어떻게 관리하고 있는가? 은 모두 잘 보셨을까요?
이번에는 인시던트 발생 시 슬랙 채널 생성 후 자동 알림이 발송되는 On-call 시스템을 어떻게 구축하였는지 설명해 드리려고 합니다.
기존에는 슬랙으로만 인시던트 관리를 진행하고 있었기 때문에 슬랙 알림이 꺼져 있다면 장애가 생성되더라도 잘 전파되지 않는다는 단점이 있었습니다 🫠
이에 좀 더 빠르고! 쉽게! 장애를 전파하기 위해 On-call 시스템을 도입하게 되었습니다.
AWS Lambda란?
AWS Lambda란 서버리스 컴퓨팅 서비스로, 개발자가 서버 관리 없이 코드를 실행할 수 있게 해주는 플랫폼입니다.
Lambda를 사용하면 코드를 업로드하고 실행할 수 있는 환경을 구축할 필요가 없으며, 작성한 함수가 원하는 이벤트에 응답하도록 설정할 수 있습니다.
슬랙을 통해 인시던트 채널을 생성하는 기능은 기존에 구현되어 있었고 저는 Lambda의 트리거 기능을 활용하여 원하는 시점에 웹 훅 함수를 바로 호출할 수 있도록 Lambda를 이용하게 되었습니다.
Lamda를 통해 어떻게 관리하고 있나요?
- [슬랙봇 명령어를 통한 인시던트 생성]
슬랙봇을 통해 인시던트를 생성합니다.
- [인시던트 채널 생성]
Lambda 함수를 호출하여 인시던트 채널을 생성합니다. 슬랙에서 받아온 채널명을 파싱하고 기존에 설정해 둔 그룹이 자동으로 초대되도록 합니다. 아래 예제 코드를 확인해 봅시다.
exports.handler = (event, context, callback) => {
// 이벤트 데이터 처리
let queryParam = Buffer.from(event['body'], "base64").toString('utf8');
let payload = new URLSearchParams(queryParam).get('payload');
let parsedPayload = JSON.parse(payload);
let tasks = [
function(callback) {
// 슬랙 채널 생성하는 함수 작성
},
function(result1, callback) {
// 슬랙 채널 생성 시 참여할 User 추가하는 함수 작성
}
];
try {
// 비동기 작업을 순차적으로 실행
async.waterfall(tasks, (err, result) => {
if (err) {
// 오류 발생 시 callback으로 오류 반환
return callback(err);
}
// 모든 작업이 성공적으로 완료되었을 때의 결과
console.log('All tasks completed. Final Result:', result);
const response = {
statusCode: 200,
body: JSON.stringify({ message: 'Success', data: result })
};
// 성공적인 결과 반환
callback(null, response);
});
} catch (error) {
// 오류 발생 시 callback으로 오류 반환
callback(error);
}
};
🔶 이벤트 데이터 처리
- event['body']를 Base64로 디코딩하여 queryParam을 추출합니다. queryParam에서 payload 값을 가져와 JSON 형식으로 파싱하여 parsedPayload를 생성합니다. 해당 작업을 통해 슬랙에서 입력한 데이터를 정상적으로 받아올 수 있습니다.
🔶 User 초대 그룹화
- 기존에는 초대할 인원이 많지 않았기 때문에 코드에 담당 인원 아이디를 붙여 넣는 하드코딩 방식으로 진행하였습니다. 하지만 점점 담당자가 늘어나고 유지보수 및 관리가 어려웠기에 슬랙 그룹에서 유저 리스트를 받아 초대하는 방식으로 변경하였습니다.
🔶 비동기 작업 수행
- task 배열을 통해 수행할 작업을 정의합니다. 이때, async.waterfall을 사용하여 비동기 작업들을 순차적으로 실행하고 각 작업의 결과가 다음 작업의 입력으로 사용되도록 합니다. 슬랙 채널을 생성하면서 필요한 작업을 연쇄적으로 수행할 수 있도록 합니다.
🔶 CloudWatch Logs 기록
- 작업이 완료되면 로그에 결과를 기록하여 CloudWatch Logs에서 확인할 수 있도록 합니다. 해당 로그는 다음 함수를 실행할 트리거로 사용합니다.
- [Jira Automation 웹 훅 호출]
CloudWatchLog를 트리거로 활용하여 새로운 Lambda 함수를 작성합니다. 이 함수는 인시던트 채널 생성 로그를 감지하고, 해당 로그가 발생하면 Jira 티켓이 자동으로 생성되는 웹 훅을 호출합니다.
- 새로운 함수도 2번과 동일하게 event를 통해 넘겨준 로그를 넘겨받고 원하는 채널명을 가져오기 위해 파싱합니다. 해당 정보로 인시던트 채널 이름을 설정할 수 있으며 이를 포함한 JSON 데이터를 Jira API로 전송하여 이슈 티켓을 자동으로 생성해 줍니다.
- [온콜 웹 훅 호출]
3번을 통해 Jira 티켓이 정상적으로 생성되면 기존에 만들어둔 온콜 웹 훅을 호출하여 관련 팀에 알림을 전송합니다.
- [장애 전파 및 처리]
온콜 웹 훅이 호출되면서 장애 관련 담당자에게 전화 알림이 발송되고 QA 팀 채널에 장애 채널이 전파됩니다.
Lambda를 사용해서 좋은 점
- [확장성]
Lambda는 필요에 따라 함수를 추가하거나 업데이트할 수 있어서 시스템 변화에 빠르게 대응할 수 있습니다.
- [비용 절감]
서버가 항상 실행되지 않고 실제로 코드가 실행될 때만 비용이 청구되므로 비용을 절감할 수 있습니다.
- [유연성]
Lambda는 다양한 이벤트 소스와 통합되어 있어서 다양한 시나리오에 적용할 수 있습니다.
Lambda를 도입하면서 어려웠던 점
- [Jira 연동 어려움]
Lambda 도입 시 Jira와의 연동이 필요했는데 사내망에서만 접속할 수 있는 Jira를 외부망인 AWS Lambda를 통해 접근하는 데 어려움이 있었습니다. 이를 해결하기 위해 특정 대역에서만 방화벽을 허용할 수 있도록 인프라(Thanks to SRE) 쪽 도움을 받아 해결할 수 있었습니다.
- [코드 길어짐으로 인한 확장성 저하]
코드가 길어지면서 안정성이 낮아지는 문제가 있었습니다. 이를 해결하기 위해 함수를 각각 분리하였더니 이에 따라 코드의 가독성과 유지보수성이 향상되었고 더욱 안정적으로 동작하는 것을 확인할 수 있었습니다.
마무리하며
기존에는 담당자가 슬랙을 확인하지 않는 경우, 별도의 연락망을 통해 유선 전화를 하는 등 전파되기까지 시간이 다소 오래 걸렸습니다. 그러나 온콜 시스템 도입 이후에는 장애 발생 시 언제든지 즉시 연락이 전송되어 더 빠르게 장애를 인지하고 처리할 수 있게 되었습니다. 또한 인시던트가 발생하는 즉시 Jira 티켓이 생성되어 관리가 더 수월해졌습니다. 많은 분들이 이러한 변화에 만족하셨던 것 같습니다 🥰 (물론 제일 좋은 것은 장애가 발생하지 않는 것)
현재 올리브영은 QA Engineer 포지션 적극! 채용 진행중이니 관심 있다면 지원 하러가기💕
참고
올리브영은 Opsnow360의 AlertNow 솔루션을 사용하고 있습니다🙂