들어가기
최근 배포, 배치 환경을 구성하는데 어떤 방법을 이용해서 배포를 할 것이고, 어떤 서비스를 사용할 것인지에 대해서 고민을 하는 모습을 보았다.
처음 해보는 것이니, 어떤 기술이 있어야 하고, 어떤 것들을 주의해야 하고 하는 것을 알 수 있으려나?
나는 익숙해진 흐름으로 배포, 배치하려면 이런 이런 솔루션이나 특정 값들을 확인해서 배포하도록 설정을 하고 있기에 정리해 놓고 다른 더 좋은 방법은 없는지 확인하려고 한다.
직접 배포와 배치
A 서비스 배포
- 언어: Ruby
- 프레임워크: Ruby on Rails
- 배포/배치 도구: Capistrano
- 배포 환경: KT Cloud 인스턴스, AWS EC2
Capistrano를 사용해서 원격 서버에 SSH로 연결하여, 수정된 파일을 직접 배포하고, 배치하는 구성을 작업함.
B 서비스 배포 (!!부정확함!!)
- 언어: Python
- 프레임워크: Tornado
- 배포/배치 도구: Git / AWS ASG
- 배포 환경: AWS EC2
ASG를 이용해서 EC2를 배포할 수 있도록 구성하고, EC2가 실행될 때마다 Init 항목에서 코드를 받아오도록 했었다.
그런데 기억이 여기까지라 맞는지 모르겠다.
컨테이너를 이용한 배포와 배치
컨테이너 이미지를 만들어 배포하고, 컨테이너 이미지를 컨테이너 오케스트레이션 환경에 배치한다.
C 서비스 배포
- 배포/배치 도구: AWS CodeBuild, GitHub Actions / AWS CodeDeploy
- 배포 환경: AWS EC2
배포와 배치 순서는 다음과 같다.
- 개발 repo에서 컨테이너 이미지를 빌드한다. (이미지 태그는
latest) - AWS ECR로 생성한 이미지를 업로드한다.
- 업로드한 이미지를 기반으로 AWS CodeDeploy를 이용하여 AppSpec 문서에 작성된 행위를 진행한다.
- CodeDeploy에 설정된 ASG를 기반으로 Blue/Green 배포를 진행하여 새로운 컨테이너로 배포를 진행한다.
위 작업을 위해서 최소한으로 구성해야 하는 리소스는 다음과 같다.
- EC2 AMI : Docker 데몬이 설치되어 있어야 한다.
- ASG, LT: 첫 배포에 사용될 ASG를 생성하여 AWS CodeDeploy에 등록을 해주어야 하기에 필요하다.
- AppSpec에서 실행할 스크립트: 스크립트는 docker compose 파일을 생성 혹은 다른 저장소에서 가져와 실행할 수 있도록 구성한다.
- GitHub 과 AWS 간 OIDC 설정과 Assume Role 생성: 서비스 간 권한을 제공하기 위해서 필요하다.
D 서비스 배포
- 배포/배치 도구: GitHub Actions / AWS CloudFormation
- 배포 환경: AWS ECS Fargate
배포와 배치의 순서는 다음과 같다.
- 개발 repo에서 GitHub Actions를 이용하여 이미지를 빌드한다. (이미지 태그는
버전) - AWS ECR로 생성한 이미지를 업로드한다.
- 업로드한 이미지를 기반으로 AWS ECS Fargate를 배포할 수 있도록 하는 GitHub Actions workflow를 실행한다.
- AWS CDK로 만들어 놓은 코드를 이용하여 AWS CloudFormation에 있는 값을 업데이트하여 배치가 진행된다.
위 작업을 위해서 최소한으로 구성해야 하는 리소스는 다음과 같다.
- AWS ECS Cluster, Service, Task definition: AWS ECS를 사용할 수 있는 환경을 먼저 만들어 두는 것이 좋다. 나는 AWS CDK를 이용하여 구성했다.
- GitHub 과 AWS 간 OIDC 설정과 배치를 위한 Assume Role 생성: 서비스 간 권한을 제공하기 위해서 필요하다.
E 서비스 배포
- 배포/배치 도구: GitHub Actions / ArgoCD
- 배포 환경: AWS EKS
배포와 배치의 순서는 다음과 같다.
- 개발 repo에서 GitHub Actions를 이용하여 이미지를 빌드한다. (이미지 태그는
버전) - AWS ECR로 생성한 이미지를 업로드한다.
- ArgoCD 와 연결된 repo에서 서비스 yaml 파일을 업데이트하고 머지한다.
- ArgoCD가 트리거를 기반으로 배치를 시작한다.
위 작업을 위해서 최소한으로 구성해야 하는 리소스는 다음과 같다.
- AWS EKS: 서비스를 실행하고 접근할 수 있는 AWS 리소스를 생성한다. Terraform을 이용하였었다.
- GitHub 과 AWS 간 OIDC 설정과 ArgoCD에서 사용할 Role 생성: OIDC는 필요하지만, role은 정확하지 않다. 공부해야 한다.
- ArgoCD: 운영하는 클러스터가 아닌 개발 보조를 위한 EKS 클러스터를 따로 구성하여 올려야 한다.
마치며
내가 보았고, 구성했던 것들을 한번 정리하였는데. 지금은 “D 서비스 배포” 방식을 사용하고 주로 구성하고 있다.
더 많은 배포 방식이 있을 것이고, 요구 사항에 따라 달라지는 부분이 발생할 수 있다. 그럴 땐, 제공되는 서비스가 있다면 사용하고, 없다면 만들면서 맞춰가는 방법 말고는 없긴 하다.
AWS EKS 배포 구성은 개발, 운영, 보조 클러스터를 만들어서 구분 짓고 배포할 수 있도록 작업을 해야 하는 것은 아직 익숙하지도 않고, 많이 해보지 않았기에 명시만 해두었다.
나보다 더 잘하시는 분들이 많은 글을 쓰셨을 것으로 알고 있으니, 관련해서 검색을 해보시는 것이 좋을 듯하다.
구분을 위해서 (영어도 다르다) 배포와 배치를 나눠 놨으나, 개발자에게는 하나의 동작으로 인식되도록 해주면 가장 좋다고 생각한다.
사용가능한 솔루션은 유명한 것을 고르고 더 필요하다면 만들어서 공유 부탁드린다. :+1: