자동 배포(CD) 왜 필요한가?
프로젝트를 진행 중 일정 단위의 개발이 완료된다면, 변경 내용을 실제 서버에 반영하기 위한 Deployment 를 진행하게 된다. 하지만, 이러한 Deploy 작업이 무언가 특별한 새로운 과정이 있는 것이 아니라 늘 같은 과정을 반복하는 것이기 때문에, 개발 이외에 많은 공수를 잡아먹는 작업 중 하나이다.
그리고, 실제 애플리케이션을 운영함에 있어서도 이러한 Deploy 작업을 인간이 수동으로 실시하다보면, 애플리케이션의 변경 내용과 관계없이 사람의 실수로 인한 장애가 발생하기도 한다. 이렇게 Deploy 작업에 불필요하고 비효율적으로 많은 시간을 소모한다면, 이는 유저에 대한 새로운 기능과 서비스 제공이 늦어짐을 의미한다.
그래서 이러한 문제를 해결하기 위한 노력으로 많은 애플리케이션에 CI/CD 가 도입되고 있고, 그 중에서도 CD는 지속적인 서비스 제공(Continuous Delivery) 및 지속적인 배포(Continuous Deployment)를 의미하고 있다.
사용할 AWS 서비스
- CodeDeploy : 실제로 EC2에 Source Code 를 업로드하여, Deploy 를 실시
- CodePipeline : GitHub, S3, CodeDeploy 와 연계하여 Auto deploy 가 가능하도록 파이프라인을 제공
- EC2 : Source Code 가 Deploy 되는 대상 서버
- S3 : 변경된 Source Code 를 저장하기 위한 저장소
자동 배포의 흐름
사전 작업
1. 자동 배포를 진행할 애플리케이션 생성 및 설정 (GitHub)
애플리케이션 생성은 간단한 절차라고 생각하기 때문에 여기에서는 구체적으로 설명하지 않는다. 그냥 GitHub Repository 를 하나 생성하고, 자신이 개발 중인 프로젝트를 Push 하면된다. 단, CodeDeploy 사용을 위해 작성이 필요한 파일이 있다.
EC2 에 Source Code 를 배포하는 것이기 때문에, Source Coder 를 어떤 디렉터리 구조에 배치해야하고, 배포 시에 어떤 작업을 실행해야하는지 정의하기 위해서, Source directory root 에 appspec.yml 이라는 YAML 파일을 작성해야한다.
version: 0.0
os: linux
# Source Code 를 배치할 위치, overwrite 을 옵션으로 사용가능
files:
- source: /
destination: /var/www/html
overwrite: yes
# 필요에 따라서는 배포 후 파일의 권한을 설정할 수 있음
permissions:
- object: /var/www/html
owner: develop
group: develop
mode: 755
type:
- directory
- object: /var/www/html
owner: develop
group: develop
mode: 664
type:
- file
# CodeDeploy 실행 전/후로 필요한 동작을 sh 파일에 정의해 실행
# (BeforeInstall, AfterInstall, ApplicationStart, ApplicationStop 등이 있음)
# hooks 의 install_dependencies.sh 는 필요에 따라 자유롭게 작성
hooks:
AfterInstall:
- location: scripts/install_dependencies.sh
runas: develop
2. AWS - GitHub 계정 연동
CodeDeploy 의 설정을 진행하기에 앞서 AWS CodeDeploy 에 GitHub 계정을 연동할 필요가 있다. CodeDeploy - Settings - Connections - Create connection 에서 GitHub 를 선택하여 정보를 입력한 후, Connect to GitHub 을 클릭하면 GitHub SSO 연동 페이지가 뜬다.
3. EC2 Tag 설정 및 CodeDeploy Agent 설치
CodeDeploy 의 설정이 크게 Applications 생성 → Deployment groups 생성 순으로 진행되는데, Deployment groups 의 배포 대상이 되는 EC2 를 식별하기 위해 EC2 에 Tag 를 추가해야 한다. 나는 Key 를 deploy, Value 는 code-deploy 로 해주었다.
그리고 아래의 Document 를 참고하여, EC2 에 CodeDeploy Agent 를 설치한다.
4. S3 Bucket 생성
CodePipeline 을 설정할 때, Source Code 를 압축하여 보관할 위치를 지정할 수 있다. Default 를 사용하면 Bucket name 에 hash string 이 붙기 때문에, 명확하게 이름으로 구분 가능핟도록 따로 Bucekt 을 생성해주었다. S3 에 특별히 설정할 것은 없지만, EC2 와 S3, CodeDeploy 와 CodePipeline 이 모두 같은 Region 안에 있도록 생성해야 한다.
5. IAM 생성
자동 배포가 실행되는 과정에서 EC2 는 S3에 CodeDeploy 와 CodePipeline 은 CodeDeploy 의 여러 정보(GitHub 계정 연동 정보와 같은) 에 접근하기 때문에, 총 2개의 IAM Role 생성이 필요하다. IAM - Role - Create Role 을 클릭하여, 아래와 같이 IAM Role 에 각각 필요한 Policy를 부여한다. 단, S3 에 대한 Permissions 의 경우 이번에는 AmazoneS3FullAccess Policy 를 부여하지만, 실제로는 필요한 S3 Bucket 만으로 범위를 좁혀서 설정하는 것을 권장한다.
CD 설정
1. CodeDeploy 설정
앞에서도 잠깐 이야기했지만, CodeDeploy 의 설정에는 Applications 과 Deployment groups 생성이 필요하다. CodeDeploy - Deploy - Applications - Create application 을 클릭하여, 아래와 같이 입력해준다. 혹시 배포 대상이 EC2 가 아니라면, Compute platform 에서 배포하고자 하는 대상을 선택하면 된다.
생성을 완료하면 생성한 CodeDeploy Application 페이지로 이동하는데, 여기에서 바로 Create deployment group 을 클릭하여, 필요한 정보를 입력하고 완료해준다.
- Service role : "IAM 생성" 에서 만든 CodeDeploy IAM Role 설정
- Deployment type
- In-place
- 자신의 Deploy 환경에 따라, Blue/green 배포 방식도 사용 가능
- Environment configuration
- Amazon EC2 instances : 한 대의 EC2 에 대해서 배포하는 것이기 때문에 (ASG 사용 가능)
- Key 는 deploy, Value 는 code-deploy 입력 : 정상적으로 EC2 를 인식하면 1 unique matched instance 라고 출력
- Deployment settings
- CodeDeployDefault.AllAtOnce 을 사용
- 자신의 환경에 맞춰서 deployment configuration 을 만들 수 있음
- Load balancer : Enable load balancing 에 체크 해제 (이번에 따로 설정하지 않음)
입력을 모두 완료하고 나면, CodeDeploy 에 설정된 Application 과 Deployment group 을 아래와 같이 확인할 수 있다.
2. CodePipeline 설정
GitHub 를 통해 CodeDeploy 가 실행될 수 있도록 trigger 를 설정해 주는 부분이다. CodeDeploy - Pipeline - Create pipeline 을 클릭해 필요한 정보를 입력해준다.
- Choose pipeline settings
- Service role : 위에서 생성해준 IAM Role 과 동일한 Role 을 사용하거나, New service role 로 해도 OK
- Advanced settings - Custom location : S3 Bucket 을 지정
- Add source stage
- Source provider : GitHub (Version 2)
- Connection : 위에서 설정한 GitHub Connection 선택
- Repository & Branch name
- 배포하고자 하는 Repository 의 branch 선택
- PR Merge 도 Branch 의 Source Code 가 변경된 것이기 때문에, 똑같이 실행됨
- Change detection options : Start the pipeline on source code change Check (코드가 변경되면 자동으로 실행)
- Output artifact format : CodePipeline default
- Add build stage : 특별히 사용하고 있는 build tools 이 없다면, Skip build stage
- Add deploy stage
- Deploy provider : AWS CodeDeploy 선택
- Application name & Deployment group : CodeDeploy 에서 생성한 정보 입력

'🧑🏻💻 Develop > AWS' 카테고리의 다른 글
AWS 로 Web Application Architecture 구성하기 (1) (0) | 2022.10.02 |
---|---|
팀 프로젝트에서 AWS 관리하기 (3) - 개발용 IAM 사용자 (0) | 2022.09.18 |
팀 프로젝트에서 AWS 관리하기 (2) - 관리용 IAM 사용자 (0) | 2022.09.12 |
팀 프로젝트에서 AWS 관리하기 (1) - IAM 사용자 (0) | 2022.09.12 |
댓글3