Skip to main content

One post tagged with "aws"

View All Tags

AWS Github CICD 배포 파이프라인 설계

· 6 min read
te
Sofrware Engineer

이 문서는 팀 프로젝트에서 AWS 협업 과정을 기록하기 위해 작성했습니다.

  • AWS 클라우드 환경을 IaC 기반으로 구축하기 위한 CI/CD 파이프라인을 설계를 다룹니다.

프로젝트 개요 Project Overview

AWS 클라우드 구축: EC2 서버앱 + RDS + S3 + Cloudformation

두번째 스프린트에서 프로젝트 목적은 클라우드 보안 체계 및 시스템 수립이었습니다.
프로젝트 기간이 많이 남지 않아 Web Socket을 이용한 간단한 실시간 채팅앱을 MVP로 목표했으며,
학습 목적을 고려해 (채팅앱에는 일반적이진 않은) 여러 AWS 기능을 구성했습니다.

  • Region : 서울 Seoul (ap-northeast-2)
  • IAM: 1개의 루트 계정과 각 팀원들에게 적절한 IAM 권한을 설정했습니다. (MFA를 사용합니다.)
  • VPC: Public SubnetPrivate Subnet으로 나누어 외부에 노출되어선 안될 기능을 프라이빗 서브넷에 두었습니다.
    • ACL: 보안을 위한 적절한 ACLAccess Control List과 보안 그룹 Security Group(sg)을 설정했습니다.
  • Route 53: DNS로 상용 중인 AWS 인스턴스를 라우팅하기 위해 사용했습니다.
  • EC2: t3.micro, Python/Flask로 빌드된 서버앱을 배포하기 위해 사용했습니다.
    • Docker: 브랜치 병합 시 Github Actions 환경의 CI 단계에서 파이썬 앱을 도커 이미지로 빌드한 뒤, Github Container Registry에 배포합니다.
    • EC2-Runner: 이미지 배포가 끝난 뒤, 새 버전의 이미지를 pull하여 새로운 컨테이너로 교체합니다.
  • RDS: MySQL 데이터베이스로 채팅 메타데이터, 세션 등을 저장합니다.
    • AWS 튜토리얼에도 명시되었듯이, 일반적으로 실시간 기능에는 DynamoDB, Lambda, Firehose 등을 조합하여 사용합니다. 이번 프로젝트에선 파이썬 Flask을 학습하고, EC2에서 컨테이너를 활용하기 위해 사용했습니다.
  • Application Load Balancer: 분산할 만큼 큰 트래픽은 없지만, 학습 목적을 위해 추가했습니다. Cloudwatch, S3와 연동하여 로그 수집을 하고 있습니다.
  • Cloudformation: Cloudwatch 기능으로부터 AWS 경고 이벤트 알람 기능과 S3 로그 저장 및 다양한 기능을 코드Infra As Code로 관리하기 위해 사용했습니다.
  • Cloudwatch: 로그 수집, 실시간 보안 및 장애 이벤트에 대응하기 위해 사용했습니다.
  • S3: 웹앱의 프론트엔드 배포와 로그를 수집하여 저장하기 위해 사용했습니다.

현재 구성된 AWS의 간략한 유저 플로우와 기능들을 다이어그램으로 표현하면 다음과 같습니다.

시스템 다이어그램 System Diagram


배포 파이프라인 설계

클라우드 구성과 웹앱/DB 등 배포를 진행하면서 여러 작업자들이 영향도Effect가 있는 작업을 진행하면서, 간단한 프로젝트임에도 복잡도가 크게 상승하는 것이 느껴졌습니다.

이러한 문제 상황의 근본 원인은 Git과 같은 형상 관리 없이, AWS 웹 콘솔 대시보드에서 작업이 분산되고 트래킹 없기 때문이 아닐까 생각이 들었습니다.

이에 대한 해결책으로 Github Repo와 클라우드 구성을 코드로 연동하자고 제안하였습니다.
사실 저를 포함한 팀원 다수가 AWS에 대해 경험이 부족한 상태였고, 제가 그나마 기여할 수 있는 것이 Github ActionsCI/CD 파이프라인을 개발하는 것이라는 생각이 들어, 이 작업을 담당하게 되었습니다.

팀원들의 이해를 돕기 위해, 현재 프로젝트 레포와 AWS를 연동하기 위한 배포 파이프라인 설계도를 먼저 작성했습니다.

Github Project Repo 구성

aws-web-app
├── backend // 파이썬 백엔드 앱
├── cloudformation // cloudwatch 구성 yaml
├── db_schema // rds 스키마
├── frontend // s3에 배포될 프론트엔드 코드
│ ├── public
│ └── src
├── lambda // 파이썬 코드로 이루어진 람다 함수
└── scripts // aws ec2에서 실행되는 쉘 스크립트

Github Actions

AWS 설정을 코드로 관리하기 위한 Github Actions CI/CD 파이프라인의 순서도를 작성했습니다.

해당 배포 파이프라인은 팀원과 협업으로 이룰 수 있었습니다. 이 과정에서 코드 리뷰를 진행하였고, 팀원들 모두 학습할 수 있도록 협업하였습니다.

code-review.png

성과 Accomplishment

새롭게 배운 내용과 협업에서 느낀 점이 많았습니다. 간단히 정리하자면 다음과 같습니다:

  • AWS 배포 파이프라인 설계 및 개발과 IaC의 필요성을 절감할 수 있었습니다.
    • 여러 작업자가 Session Manager, 웹 UI 대시보드, ssh 연결 등으로 작업하면서 변동사항의 트래킹이 어려운 점을 절감했습니다.
    • 설정 오류 등으로 장애 발생 시 원인을 파악하는 것이 무척 까다롭게 느껴졌기 때문에, Github과 연동을 신경썼습니다.
  • 문서화의 중요성을 느꼈습니다. 코드의 형상 관리 차원과 함께, 추상적이고 난이도가 높을 수 있는 클라우드 개발을 협업하는데 있어 문서와 아키텍처 설계도가 큰 도움이 되었습니다.