Posts AWS 서버리스 아키텍처 기반 2,000여명 고객사 인사데이터 동기화 시스템 구축기
Post
Cancel

AWS 서버리스 아키텍처 기반 2,000여명 고객사 인사데이터 동기화 시스템 구축기

배경

임직원 규모가 1,000명 이상인 기업에선 자사 인사 관리 시스템(HCM)과 외부 서드 파티 솔루션의 임직원 데이터를 이중화 관리해야 하는 번거로움이 존재한다.

Open API가 구축되지 않은 상황에서 위 문제를 해결하기 위해 고객사에서 동기화 시스템 구축을 제품 도입 조건으로 제안하게되어 시작하게 되었다.

클라우드 아키텍처 설계

이전까지 사내에서 스케줄링 요구사항은 단일 EC2 인스턴스에 스프링 애플리케이션을 배포하여 @Scheduled 어노테이션 기반으로 구현되어 있었다.

하지만 기존 방식의 EC2 인스턴스 프로비저닝 작업, CICD 구축, 유지보수 비용 등을 고려했을때 더 나은 방안이 없을까 고민하게 되었고 AWS EventBridge와 Lambda 기반 서버리스 아키텍처를 설계 및 구현하게 되었다.

Image

세부적인 동기화 메커니즘은 다음과 같다.

1) AWS EventBridge에 Rule 을 등록하여 json 페이로드를 람다에 인자로 전달하며 실행시키는 이벤트 발생

1
2
3
4
5
6
7
8
9
10
{
    "cmsServerEnv": string, // dv, pr
    "tenantInfos": [
        {
            "tenant": string,
            "externalServerEnv": string // dv, pr - 외부 고객사 게이트웨이 환경
        }
    ],
    "enalbedNotification": boolean
}

2) 람다 함수에서 고객사 인사게이트로 부터 HTTP 프로토콜 기반 임직원 데이터를 조회하여 CMS 형상과 비교후 동기화

3) 동기화 실패 발생시 개발/사업 담당자 및 고객사 담당자에게 실패 메일 발송(장애 대응 프로세스)

  • MSK, Lambda, SES 기반 메일 발송 모듈을 활용한 메일 발송 처리 구현
  • 동기화 결과(성공/실패)는 무조건 MS Teams로 웹훅 송신하여 일단위 모니터링 가능하도록 구현
  • 개발자 실패 메일에는 에러 스택 트레이스를 포함하여 신속한 장애 대응이 가능하도록 구성

애플리케이션 아키텍처 설계 및 구현

Image

애플리케이션 아키텍처는 ‘클린 아키텍처’ 기반 위와 같은 모듈 간의 의존성을 가지도록 설계하였다.

  • 단방향 의존성
  • 저수준이 고수준을 참조하도록(app-core 모듈로 갈수록 고수준)

또한, 애플리케이션의 변하지 않는 핵심 비즈니스 로직은 다음과 같고 app-core 모듈에 구현되어 있다.

  • 외부 고객사 인사 데이터를 조회
  • CMS 인사 데이터를 조회하여 비교
  • 변경된 형상에 대해 CMS internal-api 를 호출하여 생성, 수정, 삭제

각 고객사 모듈은(app-samsung, app-lg)은 해당 고객사 시스템의 데이터를 조회하여 CMS 데이터와 비교할 수 있는 모델로 변환해주는 책임을 갖는다. 따라서, 새로운 고객사의 동기화 요구사항이 들어오게되면 외부 고객사 모듈만 추가하여 외부 고객사 시스템으로부터 데이터를 조회해와서 컨버팅 로직만 구현해주면 된다.

(참고: https://jeonyoungho.github.io/posts/클린아키텍처-12~14장/#14장-컴포넌트-결합)

설계 및 구현시 고려 사항(Lambda 애플리케이션 배포 방식 선택)

AWS Lambda 에 애플리케이션 소스를 올리는 방법은 4가지가 존재한다.

1) 인라인 코드 작성 (용량 제한 : 3MB)

2) zip 파일 업로드 방식 배포 (용량 제한 : 50MB)

3) AWS S3의 zip 파일 업로드 기반 배포

4) AWS ECR에 등록된 이미지를 기반 배포

AWS 람다는 압축 패키지의 한도는 50MB, 압축 해제된 소스의 경우 250MB의 제한이 있다보니 1, 2, 3 번의 방법들은 모두 고객사가 늘어날수록 업로드하는데 한계가 존재할 수 있겠다는 판단을 하게 되었다.

하지만 4번 ECR에 등록된 컨테이너 이미지로 배포를 하게 되면 AWS 공식 문서에 기재된 것처럼 최대 10GB의 이미지 크기까지 람다 함수에 배포가 가능하므로, 람다 함수 용량 제한에 대한 걱정 없이 충분하게 인사 정보 동기화 구현을 할 수 있게 되어 선택하게 되었다😀

Reference

AWS 서버리스 아키텍처 도입을 통한 이점

  • EC2 인스턴스 구동 비용 절감으로 인한 클라우드 비용 제로화
  • 유지보수 효율성 극대화(인프라프로비저닝/CICD 구축 공수 및 유지보수 비용 절감)

약 1년 8개월이 지난 현재(25년 3월)까지도 안정적으로 동작하며 유지보수되고 있습니다🙂

This post is licensed under CC BY 4.0 by the author.