Description
Server
•
Login
웹페이지에 로그인을 위한 서버입니다. 앱은 Spring-boot로 구현 되었으며, MySQL 데이터베이스에 사용자 정보를 저장합니다. 서버에는 REST API를 제공하는 Java 앱 프로세스와 Web UI를 위한 정적파일을 제공하는 NGINX 프로세스가 구동됩니다. x86_64 기반 EC2에서 운영되고 있으며 CPU 기준에 따라 스케일링 되도록 오토스케일링 그룹을 사용하고 있습니다.
•
Shop
로그인이 완료되면 상품 페이지를 보여주고 주문 기능을 제공하는 서버입니다. 앱은 Spring-boot로 구현되었으며 MySQL 데이터베이스에 사진을 제외한 상품의 카탈로그 정보와 주문 정보를 저장합니다. 서버에는 REST API를 제공하는 JAVA 앱 프로세스와 상품 사진, css 등 정적파일을 제공하는 NGINX 프로세스가 구동됩니다. x86_64 기반 EC2에서 운영되고 있으며 CPU 기준에 따라 스케일링 되도록 오토스케일링 그룹을 사용하고 있습니다.
•
Batch
MySQL에 있는 주문 정보를 가공하여 RedShift에 저장하는 서버입니다. 데이터웨어하우스를 위한 앱이며 Java로 구현되었습니다. 사용자가 없는 새벽 시간에 하루에 한 번 배치잡이 실행 됩니다. 중복 수행을 방지하기 위하여 x86_64 기반 EC2 한 대를 사용합니다.
•
MySQL
Aurora로 구성된 MySQL 서버입니다. Primary 한 대가 운영되고 있으며 Login, Shop, Batch 서버들에서 접근합니다.
Network
고객들은 모바일, PC를 통해 전세계에서 접근합니다. 한국 사용자가 85%이며 프랑스, 미국, 일본 사용자가 15% 정도 입니다. 인터넷에서 서비스 접근이 필요하기 때문에 Login서버와 Shop 서버는 퍼블릭 서브넷에 배포되어 있습니다. 그 외에 인터넷에 있는 고객들이 직접 접근하지 않아도 되는 Batch 서버와 DB 서버들은 모두 프라이빗 서브넷에 위치해 있습니다.
CI/CD
•
Lifecycle
새로운 코드가 반영되면 빌드를 거쳐 개발환경 S3에 바이너리가 업로드 됩니다. 그리고 해당 바이너리로 CI/CD Pipeline을 거쳐 개발환경에 배포를 진행하고 테스트를 진행합니다. 문제가 없다면 다시 빌드를 하여 운영 환경 S3에 바이너리를 업로드하고 CI/CD Pipeline을 거쳐 해당 바이너리를 운영 환경에 배포합니다.
•
Pipeline
모든 개발환경과 운영환경에 대한 배포는 Jenkins를 이용해 배포가 진행됩니다. Github Actions를 통해 S3에 바이너리가 업로드 된 후 Jenkins는 아래와 같은 워크플로우를 실행합니다.
1. Packer 잡을 실행하여 바이너리 다운로드, 리눅스 설정과 같은 Ansible 코드를 수행.
2. Packer 잡 마지막 단계로 AMI 생성.
3. 생성된 AMI와 Manifest를 바탕으로 새로운 오토스케일링 그룹 생성
4. 새로운 EC2들이 생성되고 userdata에서 본인들의 Public IP를 Route53에 등록
5. 기존 오토스케일링 그룹 삭제가 트리거 되고 lifecycle hook을 이용해 본인들의 Public IP를 Route53에서 제거
6. 기존 오토스케일링 그룹 삭제.
Observability
•
감사 목적으로 서버들에서 발생하는 로그 파일들을 5분에 한 번 S3로 업로드하고 1년 동안 보관합니다. 문제가 있을 때 마다 S3에서 파일을 찾아 확인합니다.
•
시스템 현황을 확인하기 위해 CloudWatch를 이용합니다. 대시보드를 생성해 EC2, DB 정보를 확인하며 Alert을 설정하여 CPU가 입계값 이상 높아지는 경우 알람을 주도록 구성하였습니다.
Claims
아래는 최근 쇼핑몰 사용자와 개발팀으로 부터 받은 클레임 및 요청사항입니다.
•
쇼핑을 페이지 접근 시 가끔 서버에 접근할 수 없다는 에러가 발생하지만 새로고침을 하면 대부분 해결 됨.
•
해외 사용자가 로그인과 주문은 큰 불편함이 없다고 하지만 상품 로딩이 오래 걸린다고 함.
•
새로운 버전의 릴리즈 주기를 더 단축하고 싶어함.
•
1년 배포 통계를 보았을 때 50%는 30분 내에 장애가 발생해 롤백하였음
•
최근 Shop EC2에 악성 비트코인 채굴 패키지가 설치되었으나 일주일 뒤에 발견됨
•
트러블슈팅 당시 EC2에서 확인 했던 로그이지만 S3에서 확인하면 한번 씩 존재하지 않음
Outcomes
진행 했던 내용을 프레젠테이션에 자유롭게 작성해주시고 아래 내용을 마지막에 정리하는 느낌으로 한 번 더 간략히 작성해주세요.
•
해결하고자 하는 문제들
•
문제라고 생각했던 이유
•
각 문제들을 해결하기 위한 솔루션 (간단한 설명, 그림)
•
모든 솔루션들을 통합하여 적용한 한 장의 시스템 아키텍처 그림
•
최종 설계된 CI/CD 파이프라인을 나타낸 한장의 그림
Tips
•
Claims에 있는 내용 외에 불편함을 겪고 있는 포인트들이 더 있습니다. 문제라고 판단 되는 것에 대해 작성해 주시면 됩니다.
•
구체적인 AWS 사용법과 아키텍처를 이용해 솔루션을 작성해 주는 것은 플러스 요소가 될 수는 있지만, 그것 보다 문제를 잘 캐치하고 상황에 맞는 적절한 솔루션을 도입했는지가 더 중요합니다.
•
문제들에 대해 절대적인 답안은 없고 해결 가능한 여러가지의 방법이 있습니다. 왜 그런 접근을 하였는지 본인의 생각을 잘 정리해주세요.
•
AWS 지식 매몰되지 말고 네트워크, 컴퓨팅과 같은 부분도 고민해 볼 수 있습니다. DNS, 지연 시간과 같은 부분이나 컴퓨팅 리소스와 같은 측면도 생각해 보세요.


