AWS CodeDeploy는 여러 장점이 있지만, 크게 4가지 설명을 할 수 있을 것 같습니다.
1. 배포 진행 상황을 모니터링 할 수 있습니다.저는 인프라 초보이기 때문에 수행하는 과정에서 발생하는 많은 오류에 대한 로그가 필요했고, CodeDeploy에서 제공하는 console 이 큰 도움이 됐습니다. 이와 관련해 본문에서 설명하도록 하겠습니다.
2. (거의) 무료다!!우리는 EC2에서 CodeDeploy를 사용할 것이므로 배포를 하는데 추가 비용이 들지 않습니다. 다만 저희의 배포 과정에서는 하나의 파일을 S3에 업로드 하고 이에 따른 비용을 지불해야 하는데, 이와 관련한 약간의 비용이 나갈 수는 있겠네요 :)
3. 가동 중지 시간을 최소화 시킬 수 있습니다.공식 문서에 따르면blue / green 배포과정에서 거의 즉시 트래픽을 리다이렉션 시켜준다고 합니다. 즉, 새 애플리케이션 버전 변경으로 인한 중단을 최소화합니다. 자동 배포 과정에서 잠깐이나마 서비스가 죽는 것을 원하지 않는다면, CodeDeploy에서 blue / green 배포 설정을 해줄 수 있습니다.
4. 동시 배포를 할 수 있습니다. 하나 이상의 EC2 컴퓨팅 플랫폼을 사용하는 애플리케이션에 배포가 필요할 경우, CodeDeploy를 사용하면 큰 효과를 보실 것으로 예상됩니다!
Blue-Green?
Blue-Green deployment는 배포 전략 중 하나입니다. 라이브 환경을Blue 라고 지칭하며 새로운 환경은Green이라고 지칭합니다. 새로운 배포는 Green 환경에서 수행되며, 에러 검출이 되지 않을 경우 traffic을 Green 으로 옮깁니다.
가장 큰 장점은 downtime이 없다는 것입니다!! 배포 중에도 애플리케이션이 실행중이므로 사용자는 배포가 진행되었다는 사실을 거의 알 수 없습니다.
설명은 여기까지하고, 자동 배포를 위해 작업했던 순서에 대해 설명하겠습니다 :)
작업 순서
수행할 작업의 순서는 아래와 같습니다.
1. CodeDeploy 사용을 위한 EC2 IAM 인스턴스 프로파일 생성
2.EC2에CodeDeploy agent 설치
3. CodeDeploy 애플리케이션 생성
4. Github Action workflow 를 위한 yml 파일 생성
5. CodeDeploy Action을 위한 appspec.yml, script 파일 추가
1. CodeDeploy 사용을 위한 EC2 IAM 인스턴스 프로파일 생성
우리는 배포 대상이 될 EC2 인스턴스가 CodeDeploy를 사용할 수 있도록 권한을 부여해야 합니다!!
우선, AWS IAM에 들어오셔서 역할 만들기를 클릭합니다.
EC2를 클릭하시고 S3, CodeDeploy 모든 권한을 넣어주고, 네이밍을 붙여 역할을 만들어줍니다.
우리는 배포 코드를 압축해서 s3에 업로드하고, 해당 빌드 파일을 CodeDeploy를 통해 EC2로 배포할 것이기 때문에 두 권한을 부여하는 것입니다. 자세한 설명은 아래에서 하도록 할게요!
이제 만든 IAM Role을 우리의 인스턴스에 붙여줘야 합니다. 인스턴스 목록에서 체크하시고 작업, 보안 탭을 들어가시면 IAM 역할을 수정해주시면 우리의 EC2는 S3, CodeDeploy 에 대한 접근 권한을 부여받게 됩니다.
2. EC2 에 CodeDeploy agent 설치
배포를 원하는 인스턴스에 CodeDeploy agent를 설치하여 해당 인스턴스를 배포에서 사용할 수 있도록 설정해야 합니다!!
해당 명령어를 입력해주세요.
**Codedeploy agent 설치
**1. ruby 설치:** Codedeploy agent는 ruby로 작성되었으므로 이를 설치한다.
$ sudo apt-get install ruby // (ubuntu 16.04)
**2. wget 설치** (agent 설치파일을 들고오기 위해 쓰인다)
$ sudo apt-get install wget
**3. Codedeploy Agent 설치**
*#* ubuntu 계정을 사용한다면 /home/ubuntu로 가면 된다.*
$ cd /home/jane
***#* 설치파일 **다운로드 *(Seoul region)***
$ wget [<https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install>](<https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install>)**
wget <https://aws=codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install>
****# 실행권한 추가 및 설치**
$ chmod +x ./install
$ sudo ./install auto
하다가 막힌다면 아래 aws docs를 참고한다.
[<https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-ubuntu.html>](<https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-ubuntu.html>)**
배포 시스템인 codedeploy를 통해 ec2 instance에 배포를 가능하게 하는 작업을 설정한다.
EC2 설정
둘 사이의 접근을 가능하게 위해서는 AWS IAM에서 ‘역할 만들기’를 한다. 사용자 등록이 AWS 외부에서부터의 접근을 허가하는 것이라면, 역할은 AWS 내에서의 접근 권한이라고 볼 수 있으며 등록 예시는 다음과 같다.
다른 계정의 IAM 사용자
AWS 리소스에서 작업을 수행해야 하는 EC2 인스턴스에서 실행 중인 애플리케이션 코드
계정 내 리소스에서 작업을 수행하여 기능을 제공해야 하는 AWS 서비스
SAML을 통해 인증 연동을 사용하는 사내 디렉토리의 사용자
역할을 등록하고 나서는 EC2에서 해당 역할을 사용하도록 저장한다.
역할을 수정하고 인스턴스를 재부팅해준다.(인스턴스 상태 > 재부팅)
재부팅이 완료되면 EC2 Instance에서 다음 명령어를 통해 codedeploy를 설치한다.
**Codedeploy agent 설치
**1. ruby 설치:** Codedeploy agent는 ruby로 작성되었으므로 이를 설치한다.
$ sudo apt-get install ruby // (ubuntu 16.04)
**2. wget 설치** (agent 설치파일을 들고오기 위해 쓰인다)
$ sudo apt-get install wget
**3. Codedeploy Agent 설치**
*#* ubuntu 계정을 사용한다면 /home/ubuntu로 가면 된다.*
$ cd /home/jane
***#* 설치파일 **다운로드 *(Seoul region)***
$ wget [<https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install>](<https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install>)
**# 실행권한 추가 및 설치**
$ chmod +x ./install
$ sudo ./install auto
하다가 막힌다면 아래 aws docs를 참고한다.
[<https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-ubuntu.html>](<https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-ubuntu.html>)**
아래 메시지가 출력된다.
The AWS CodeDeploy agent is running as PID ****
CodeDeploy 설정
EC2와 마찬가지로, CodeDeploy에서도 역할을 생성하고 설정해야한다.
codedeploy는 권한 종류가 AWSCodeDeployRole 한 가지이니 그냥 선택해서 만들면 된다.
이제 codedeploy 서비스에서 애플리케이션 생성을 한다.
애플리케이션을 생성하고, 배포 그룹 생성을 이어 진행한다.
한 대의 서버이기 때문에 해당 옵션을 선택한다.
이제 프로젝트 폴더에 appspec.yml 파일을 생성한다. 이 파일은 codedeploy가 서버 환경에 설치를 할 수 있도록 동작을 정의한 내용이다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/app/deploy
그리고, 위치할 디렉토리를 생성한다.
mkdir /home/ec2-user/app/deploy
Github Action 설정
env:
AWS_REGION: ap-northeast-2 (지역)
S3_BUCKET_NAME: 설정한 버킷 이름
CODE_DEPLOY_APPLICATION_NAME: 설정한 codedeploy 어플리케이션 이름
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: 설정한 codedeploy 그룹 이름
ZIP_NAME: zip -r ./프로젝트명.zip .
APPLICATION: ./src/main/resources/application.yml
# (7) S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
- name: Deploy to AWS EC2 from S3
run: |
aws deploy create-deployment \\
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \\
--deployment-config-name CodeDeployDefault.AllAtOnce \\
--deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \\
--s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip
name: Deploy to Amazon EC2
on:
push:
branches: [ "main" ]
# pull_request:
# branches: [ "feature" ]
env:
AWS_REGION: ap-northeast-2
S3_BUCKET_NAME: ddal-ggak-codedeploy-app
CODE_DEPLOY_APPLICATION_NAME: codedeploy
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: codedeploy_g
ZIP_NAME: zip -r ./finalproject.zip .
APPLICATION: ./src/main/resources/application.yml
permissions:
contents: read
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
# (1) 기본 체크아웃
- name: Checkout
uses: actions/checkout@v2
# (2) application.yml 추가
- run: touch ./src/main/resources/application.yml
- run: echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application.yml
- run: cat ./src/main/resources/application.yml
# (3) JDK 11 세팅
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: '11'
distribution: 'temurin'
# (4) Gradle build (Test 제외)
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
arguments: clean build -x test
# (5) 디렉토리 생성
- name: Make Directory
run: mkdir -p deploy
# (6) Jar 파일 복사
- name: Copy Jar
run: cp ./build/libs/*.jar ./deploy
# # (7) clean build ( test를 사용하지 않아서 제외 시켰습니다.)
# - name: Build with Gradle
# run: ./gradlew clean build
# shell: bash
# (8) zip file
- name: Make zip file
run: zip -r ./$finalproject.zip .
shell: bash
# (5) AWS 인증 (IAM 사용자 Access Key, Secret Key 활용)
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
# (6) 빌드 결과물을 S3 버킷에 업로드
- name: Upload to AWS S3
run: |
aws deploy push \\
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \\
--ignore-hidden-files \\
--s3-location s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip \\
--source .
# (7) S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
- name: Deploy to AWS EC2 from S3
run: |
aws deploy create-deployment \\
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \\
--deployment-config-name CodeDeployDefault.AllAtOnce \\
--deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \\
--s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip