1. 개요
1) 목적
개발과 운영을 결합한 형태인 데브옵스라는 문화가 IT 업계의 트렌드로 자리잡은지는 오래되었지만 여전히 많은 조직에서는 개발과 운영이 분리되어 있습니다. 작은 기업의 경우 실제 서비스와 관련된 애플리케이션 개발에 투자를 집중하다 보니 상대적으로 운영은 개발 이후의 부속 작업으로 여겨지는 경우가 많습니다.
상황이 이렇다 보니 개발자들은 인프라에 대한 이해가 부족한 상태에서 애플리케이션을 배포하게 됩니다. 개발 환경과 운영 환경의 차이, 트래픽 증가 등 예상하기 힘든 이벤트들로 인해 장애가 발생할 확률은 높아질 수밖에 없겠죠. 또한 출시 후 일부 기능 변경이 필요할 때도 수정한 코드를 배포하는 과정에서 서비스 중단이 발생할 수도 있습니다.
베스핀글로벌은 운영의 어려움을 쉽게 해결할 수 있는 솔루션들을 개발하고 있습니다. 그중에서도 이번에 개발한 CI/CD 솔루션은 인프라에 대해 깊게 이해하지 못해도 다양한 운영 이슈를 한 번에 해결하는 데 초점을 맞췄습니다.
이번 글에서는 이번 솔루션의 기본 템플릿을 예로 들어 인프라 구축부터 배포 자동화까지 운영의 전 과정이 얼마나 수월해질 수 있는지 얘기해보고자 합니다.
2) 환경
CI/CD 솔루션을 적용하기 위해서는 우선 인프라 환경이 구축되어 있어야 합니다. 이 솔루션에서는 기본적인 웹서비스 인프라를 구축할 수 있는 템플릿을 제공합니다. Terraform 코드로 작성된 템플릿을 실행하면 클라우드 환경에 인프라가 자동으로 생성됩니다.
코드 배포는 GitHub Action과 AWS CodeDeploy의 연동을 통해 진행됩니다. GibHub 리포지토리에 업로드된 소스 코드가 수정되면 GitHub Action과 CodeDeploy를 통해 인프라에 수정 사항이 반영됩니다. 배포 방식은 CodeDeploy에서 제공하는 in-replace 방식과 blue/green 방식 중에 선택할 수 있습니다.
3) 요구사항
이번 CI/CD 솔루션에서 이용하는 기술 스택은 아래와 같습니다.
- Terraform
- S3, RDS 등의 AWS 리소스
- GitHub
- Github Action
- AWS CodeDeploy
2. Infrastructure
본 솔루션의 기본 템플릿 아키텍처는 아래와 같이 구성됩니다.
1) 네트워크
- 서비스플로우: 웹클라이언트 > S3 > ALB > WAS > DB
기본 템플릿의 서비스플로우는 위 그림과 같습니다. 사용자의 url 요청은 Route53을 타고 들어와 CDN 서비스인 CloudFront를 거쳐 WEB용 코드를 호스팅하는 S3로 전달됩니다. 이 요청은 ALB를 타고 부하분산을 거쳐 오토스케일링 그룹에 묶여 있는 WAS 서버로 전달되며, 그 뒤에 DB로 전달됩니다.
2) 서버
- WEB용 S3
위 그림과 같이 이 솔루션의 기본 템플릿에서는 일반적인 3티어 아키텍처와 달리 WEB용 서버로 EC2가 아닌 S3를 사용합니다. 정적 웹 호스팅에 S3를 사용할 경우 자동 확장, 부하 분산, 비용 절감 등의 효과를 얻을 수 있습니다. 이 점이 기본 템플릿의 주요 특징이라 할 수 있습니다.
- WAS용 EC2
EC2를 사용하는 WAS용 서버는 프라이빗 서브넷에 배치되며, Autoscaling Group(ASG)으로 묶여 트래픽 증가에 따라 자동 확장되도록 구성되었습니다.
- 데이터 입출력을 위한 RDS 및 Redis
DB는 WAS보다 뒤에 배치된 프라이빗 서브넷에 위치합니다. 위 그림과 같이 DB단에서 데이터 캐싱을 위한 Redis 서버를 함께 사용한다는 점이 기본 템플릿의 또 다른 특징입니다.
3) 배포
- WEB 배포: git push > S3 서버
WEB 서버의 경우 개발자가 GibHub의 WEB 리포지토리에 소스 코드를 푸시하게 되면 S3에 자동으로 업로드되어 수정된 코드가 즉시 반영됩니다.
- WAS 배포: git push > S3 저장 > WAS 서버
WAS 서버의 경우 GitHub 리포지토리에 수정된 코드가 푸시되면, 해당 이벤트를 GibHub Action이 받아 빌드를 진행합니다. 빌드가 완료된 아티팩트는 AWS S3에 자동으로 저장되고, CodeDeploy를 통해 ASG에 연결 되어있는 서버로 배포 됩니다.
3. IaC
이 솔루션에서는 인프라 구축에 Terraform을 사용합니다. Terraform은 인프라를 코드로 생성하고 관리할 수 있게 해주는 도구로, 인프라 관리를 자동화할 수 있습니다.
Terraform을 사용하면 모든 인프라가 코드로 기록되기 때문에 인프라 구현에 직접 참여하지 않은 사람도 전체 인프라를 쉽게 파악할 수 있습니다.
- Terraform 코드 모듈화
인프라 구축에 필요한 Terraform 코드는 아래와 같이 리소스별로 형상 관리할 수 있도록 제공됩니다.
- Tag를 이용한 형상 관리
각 인프라 리소스 템플릿은 tag를 이용하여 형상 관리합니다. Tag 반영은 아래와 같이 Config에서 작업할 때 Template Tag version을 호출하여 반영합니다.
4. 배포
이 솔루션에서는 CI를 위하여 Github Action을 사용합니다. Github Action은 Github 저장소를 기반으로 워크플로우(Workflow)를 자동화 할 수 있는 도구로 테스트, 빌드, 배포 등의 다양한 작업들을 자동화하여 처리할 수 있습니다.
워크플로우를 자동화하는 데는 .yml 파일이 사용됩니다. GitHub에서는 다양한 옵션의 .yml을 제공하고 있습니다. 워크플로우 자동화를 위한 .yml 파일은 GitHub 저장소에 직접 등록할 수도 있고 .github/workflows 폴더 안에 추가하여 등록할 수도 있습니다.
.yml 파일