|
| 1 | +Title: 배포, 나는 어떻게 구성했나 |
| 2 | +Date: 2025-10-29 18:41 |
| 3 | +Modified: 2025-10-29 18:41 |
| 4 | +Category: Operation |
| 5 | +Tags: deploy, aws |
| 6 | +Slug: 배포-나는-어떻게-구성했나 |
| 7 | +Summary: 내가 지금까지 사용했고, 구성해보았던 배포 방식에 대해서 정리한다. 그리고 배치는 "어떤 환경에 어떤 방법으로 서비스를 배치할 것인가?"에 대해서 생각해야 한다. |
| 8 | + |
| 9 | +# 들어가기 |
| 10 | + |
| 11 | +최근 배포, 배치 환경을 구성하는데 어떤 방법을 이용해서 배포를 할 것이고, 어떤 서비스를 사용할 것인지에 대해서 고민을 하는 모습을 보았다. |
| 12 | +처음 해보는 것이니, 어떤 기술이 있어야 하고, 어떤 것들을 주의해야 하고 하는 것을 알 수 있으려나? |
| 13 | + |
| 14 | +나는 익숙해진 흐름으로 배포, 배치하려면 이런 이런 솔루션이나 특정 값들을 확인해서 배포하도록 설정을 하고 있기에 정리해 놓고 다른 더 좋은 방법은 없는지 확인하려고 한다. |
| 15 | + |
| 16 | +# 직접 배포와 배치 |
| 17 | + |
| 18 | +## A 서비스 배포 |
| 19 | + |
| 20 | +- 언어: Ruby |
| 21 | +- 프레임워크: Ruby on Rails |
| 22 | +- 배포/배치 도구: [Capistrano](https://github.com/capistrano/capistrano) |
| 23 | +- 배포 환경: KT Cloud 인스턴스, AWS EC2 |
| 24 | + |
| 25 | +Capistrano를 사용해서 원격 서버에 SSH로 연결하여, 수정된 파일을 직접 배포하고, 배치하는 구성을 작업함. |
| 26 | + |
| 27 | +## B 서비스 배포 (!!부정확함!!) |
| 28 | + |
| 29 | +- 언어: Python |
| 30 | +- 프레임워크: Tornado |
| 31 | +- 배포/배치 도구: Git / AWS ASG |
| 32 | +- 배포 환경: AWS EC2 |
| 33 | + |
| 34 | +ASG를 이용해서 EC2를 배포할 수 있도록 구성하고, EC2가 실행될 때마다 Init 항목에서 코드를 받아오도록 했었다. |
| 35 | +그런데 기억이 여기까지라 맞는지 모르겠다. |
| 36 | + |
| 37 | +# 컨테이너를 이용한 배포와 배치 |
| 38 | + |
| 39 | +컨테이너 이미지를 만들어 배포하고, 컨테이너 이미지를 컨테이너 오케스트레이션 환경에 배치한다. |
| 40 | + |
| 41 | +## C 서비스 배포 |
| 42 | + |
| 43 | +- 배포/배치 도구: AWS CodeBuild, GitHub Actions / AWS CodeDeploy |
| 44 | +- 배포 환경: AWS EC2 |
| 45 | + |
| 46 | +배포와 배치 순서는 다음과 같다. |
| 47 | + |
| 48 | +1. 개발 repo에서 컨테이너 이미지를 빌드한다. (이미지 태그는 `latest`) |
| 49 | +2. AWS ECR로 생성한 이미지를 업로드한다. |
| 50 | +3. 업로드한 이미지를 기반으로 AWS CodeDeploy를 이용하여 AppSpec 문서에 작성된 행위를 진행한다. |
| 51 | +4. CodeDeploy에 설정된 ASG를 기반으로 Blue/Green 배포를 진행하여 새로운 컨테이너로 배포를 진행한다. |
| 52 | + |
| 53 | +위 작업을 위해서 최소한으로 구성해야 하는 리소스는 다음과 같다. |
| 54 | + |
| 55 | +- EC2 AMI : Docker 데몬이 설치되어 있어야 한다. |
| 56 | +- ASG, LT: 첫 배포에 사용될 ASG를 생성하여 AWS CodeDeploy에 등록을 해주어야 하기에 필요하다. |
| 57 | +- AppSpec에서 실행할 스크립트: 스크립트는 docker compose 파일을 생성 혹은 다른 저장소에서 가져와 실행할 수 있도록 구성한다. |
| 58 | +- GitHub 과 AWS 간 OIDC 설정과 Assume Role 생성: 서비스 간 권한을 제공하기 위해서 필요하다. |
| 59 | + |
| 60 | +## D 서비스 배포 |
| 61 | + |
| 62 | +- 배포/배치 도구: GitHub Actions / AWS CloudFormation |
| 63 | +- 배포 환경: AWS ECS Fargate |
| 64 | + |
| 65 | +배포와 배치의 순서는 다음과 같다. |
| 66 | + |
| 67 | +1. 개발 repo에서 GitHub Actions를 이용하여 이미지를 빌드한다. (이미지 태그는 `버전`) |
| 68 | +2. AWS ECR로 생성한 이미지를 업로드한다. |
| 69 | +3. 업로드한 이미지를 기반으로 AWS ECS Fargate를 배포할 수 있도록 하는 GitHub Actions workflow를 실행한다. |
| 70 | +4. AWS CDK로 만들어 놓은 코드를 이용하여 AWS CloudFormation에 있는 값을 업데이트하여 배치가 진행된다. |
| 71 | + |
| 72 | +위 작업을 위해서 최소한으로 구성해야 하는 리소스는 다음과 같다. |
| 73 | + |
| 74 | +- AWS ECS Cluster, Service, Task definition: AWS ECS를 사용할 수 있는 환경을 먼저 만들어 두는 것이 좋다. 나는 AWS CDK를 이용하여 구성했다. |
| 75 | +- GitHub 과 AWS 간 OIDC 설정과 배치를 위한 Assume Role 생성: 서비스 간 권한을 제공하기 위해서 필요하다. |
| 76 | + |
| 77 | +## E 서비스 배포 |
| 78 | + |
| 79 | +- 배포/배치 도구: GitHub Actions / ArgoCD |
| 80 | +- 배포 환경: AWS EKS |
| 81 | + |
| 82 | +배포와 배치의 순서는 다음과 같다. |
| 83 | + |
| 84 | +1. 개발 repo에서 GitHub Actions를 이용하여 이미지를 빌드한다. (이미지 태그는 `버전`) |
| 85 | +2. AWS ECR로 생성한 이미지를 업로드한다. |
| 86 | +3. ArgoCD 와 연결된 repo에서 서비스 yaml 파일을 업데이트하고 머지한다. |
| 87 | +4. ArgoCD가 트리거를 기반으로 배치를 시작한다. |
| 88 | + |
| 89 | +위 작업을 위해서 최소한으로 구성해야 하는 리소스는 다음과 같다. |
| 90 | + |
| 91 | +- AWS EKS: 서비스를 실행하고 접근할 수 있는 AWS 리소스를 생성한다. Terraform을 이용하였었다. |
| 92 | +- GitHub 과 AWS 간 OIDC 설정과 ArgoCD에서 사용할 Role 생성: OIDC는 필요하지만, role은 정확하지 않다. 공부해야 한다. |
| 93 | +- ArgoCD: 운영하는 클러스터가 아닌 개발 보조를 위한 EKS 클러스터를 따로 구성하여 올려야 한다. |
| 94 | + |
| 95 | +# 마치며 |
| 96 | + |
| 97 | +내가 보았고, 구성했던 것들을 한번 정리하였는데. 지금은 "D 서비스 배포" 방식을 사용하고 주로 구성하고 있다. |
| 98 | +더 많은 배포 방식이 있을 것이고, 요구 사항에 따라 달라지는 부분이 발생할 수 있다. 그럴 땐, 제공되는 서비스가 있다면 사용하고, 없다면 만들면서 맞춰가는 방법 말고는 없긴 하다. |
| 99 | + |
| 100 | +AWS EKS 배포 구성은 개발, 운영, 보조 클러스터를 만들어서 구분 짓고 배포할 수 있도록 작업을 해야 하는 것은 아직 익숙하지도 않고, 많이 해보지 않았기에 명시만 해두었다. |
| 101 | +나보다 더 잘하시는 분들이 많은 글을 쓰셨을 것으로 알고 있으니, 관련해서 검색을 해보시는 것이 좋을 듯하다. |
| 102 | + |
| 103 | +구분을 위해서 (영어도 다르다) 배포와 배치를 나눠 놨으나, 개발자에게는 하나의 동작으로 인식되도록 해주면 가장 좋다고 생각한다. |
| 104 | + |
| 105 | +사용가능한 솔루션은 유명한 것을 고르고 더 필요하다면 만들어서 공유 부탁드린다. :+1: |
0 commit comments