올리브영 테크블로그 포스팅 올리브영 QA의 AWS Lambda를 통한 On call 도입기
tech

올리브영 QA의 AWS Lambda를 통한 On call 도입기

Lambda 및 Jira Automation을 통한 On call 도입

2024.05.20

안녕하세요. 올리브영 QA Enginner 멜짱입니다.

올리브영은 인시던트를 어떻게 관리하고 있는가? 2탄 🙈

이전에 작성되었던 올리브영은 인시던트를 어떻게 관리하고 있는가? 은 모두 잘 보셨을까요?

이번에는 인시던트 발생 시 슬랙 채널 생성 후 자동 알림이 발송되는 On-call 시스템을 어떻게 구축하였는지 설명해 드리려고 합니다.

기존에는 슬랙으로만 인시던트 관리를 진행하고 있었기 때문에 슬랙 알림이 꺼져 있다면 장애가 생성되더라도 잘 전파되지 않는다는 단점이 있었습니다 🫠

이에 좀 더 빠르고! 쉽게! 장애를 전파하기 위해 On-call 시스템을 도입하게 되었습니다.


AWS Lambda란?

AWS Lambda란 서버리스 컴퓨팅 서비스로, 개발자가 서버 관리 없이 코드를 실행할 수 있게 해주는 플랫폼입니다.

Lambda를 사용하면 코드를 업로드하고 실행할 수 있는 환경을 구축할 필요가 없으며, 작성한 함수가 원하는 이벤트에 응답하도록 설정할 수 있습니다.

슬랙을 통해 인시던트 채널을 생성하는 기능은 기존에 구현되어 있었고 저는 Lambda의 트리거 기능을 활용하여 원하는 시점에 웹 훅 함수를 바로 호출할 수 있도록 Lambda를 이용하게 되었습니다.


Lamda를 통해 어떻게 관리하고 있나요?

  1. [슬랙봇 명령어를 통한 인시던트 생성]

슬랙봇을 통해 인시던트를 생성합니다.

on call 0
(으악!)
  1. [인시던트 채널 생성]

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에서 확인할 수 있도록 합니다.
    해당 로그는 다음 함수를 실행할 트리거로 사용합니다.
  1. [Jira Automation 웹 훅 호출]

CloudWatchLog를 트리거로 활용하여 새로운 Lambda 함수를 작성합니다. 이 함수는 인시던트 채널 생성 로그를 감지하고, 해당 로그가 발생하면 Jira 티켓이 자동으로 생성되는 웹 훅을 호출합니다.

on call 21
  • 새로운 함수도 2번과 동일하게 event를 통해 넘겨준 로그를 넘겨받고 원하는 채널명을 가져오기 위해 파싱합니다.
    해당 정보로 인시던트 채널 이름을 설정할 수 있으며 이를 포함한 JSON 데이터를 Jira API로 전송하여 이슈 티켓을 자동으로 생성해 줍니다.
on call 20
(CloudWatch로 트리거 생성!)
  1. [온콜 웹 훅 호출]

3번을 통해 Jira 티켓이 정상적으로 생성되면 기존에 만들어둔 온콜 웹 훅을 호출하여 관련 팀에 알림을 전송합니다.

on call 3 on call 4

(티켓이 생성 후 슬랙 채널에 티켓 공유와 온콜 웹 훅을 호출)
  1. [장애 전파 및 처리]

온콜 웹 훅이 호출되면서 장애 관련 담당자에게 전화 알림이 발송되고 QA 팀 채널에 장애 채널이 전파됩니다.

on call 6

Lambda를 사용해서 좋은 점

  1. [확장성]

Lambda는 필요에 따라 함수를 추가하거나 업데이트할 수 있어서 시스템 변화에 빠르게 대응할 수 있습니다.

  1. [비용 절감]

서버가 항상 실행되지 않고 실제로 코드가 실행될 때만 비용이 청구되므로 비용을 절감할 수 있습니다.

  1. [유연성]

Lambda는 다양한 이벤트 소스와 통합되어 있어서 다양한 시나리오에 적용할 수 있습니다.


Lambda를 도입하면서 어려웠던 점

  1. [Jira 연동 어려움]

Lambda 도입 시 Jira와의 연동이 필요했는데 사내망에서만 접속할 수 있는 Jira를 외부망인 AWS Lambda를 통해 접근하는 데 어려움이 있었습니다. 이를 해결하기 위해 특정 대역에서만 방화벽을 허용할 수 있도록 인프라(Thanks to SRE) 쪽 도움을 받아 해결할 수 있었습니다.

  1. [코드 길어짐으로 인한 확장성 저하]

코드가 길어지면서 안정성이 낮아지는 문제가 있었습니다. 이를 해결하기 위해 함수를 각각 분리하였더니 이에 따라 코드의 가독성과 유지보수성이 향상되었고 더욱 안정적으로 동작하는 것을 확인할 수 있었습니다.


마무리하며

기존에는 담당자가 슬랙을 확인하지 않는 경우, 별도의 연락망을 통해 유선 전화를 하는 등 전파되기까지 시간이 다소 오래 걸렸습니다. 그러나 온콜 시스템 도입 이후에는 장애 발생 시 언제든지 즉시 연락이 전송되어 더 빠르게 장애를 인지하고 처리할 수 있게 되었습니다. 또한 인시던트가 발생하는 즉시 Jira 티켓이 생성되어 관리가 더 수월해졌습니다. 많은 분들이 이러한 변화에 만족하셨던 것 같습니다 🥰 (물론 제일 좋은 것은 장애가 발생하지 않는 것)

on call 5
(온콜 첫 도입 시점)

현재 올리브영은 QA Engineer 포지션 적극! 채용 진행중이니 관심 있다면 지원 하러가기💕

참고

올리브영은 Opsnow360의 AlertNow 솔루션을 사용하고 있습니다🙂

QAAWS Lambda온콜
올리브영 테크 블로그 작성 올리브영 QA의 AWS Lambda를 통한 On call 도입기
🐶
멜짱 |
QA Engineer
파이팅해야지!!💪🏻