Github Actions + S3 + CodeDeploy + Nginx 무중단 배포(2)

ran·2023년 7월 13일

CI/CD

목록 보기
2/3
post-thumbnail

이전 글에서 main 브랜치로 push시 Github actions가 작동하여 jar 파일을 S3에 올리는 작업까지 진행했다.
이번에는 CodeDeploy에게 S3의 jar 파일을 가져가서 담당한 배포그룹의 ec2에 배포하는 과정을 진행한다.


CodeDeploy

CodeDeploy는 SourceCode를 운영환경에 자동 배포하는 역할을 수행하는 AWS Service이다. 즉, CD 지속적 배포 서비스이다.
또한 현재위치 배포나 블루/그린 배포와 같은 무중단 배포를 지원한다.

CodeDeploy의 배포과정은 아래와 같다.

  1. 개발한 애플리케이션 최상단 경로에 AppSpec.yml 파일을 추가한다.

    • AppSpec.yml 은 배포에 필요한 모든 절차를 적어둔 명세서이다.
  2. CodeDeploy에 프로젝트 특정 버전을 배포해달라고 요청하면, CodeDeploy는 배포를 진행할 EC2 인스턴스에 설치돼 있는 CodeDeploy Agent들과 통신하며 Agent들에게 요청받은 버전을 배포해 달라고 요청한다.

  3. 요청 받은 Agent들은 코드 저장소에서 프로젝트 전체를 서버에 내려받고, AppSpec.yml 파일을 읽어 해당 파일에 적힌 절차대로 배포를 진행한다.

  4. Agent는 배포를 진행한 후 CodeDeploy에게 성공/실패 등의 결과를 알려준다.

따라서 EC2에는 실제 배포를 진행하는 CodeDeploy Agent가 설치되어야 한다.


EC2 세팅

  1. EC2를 생성한다.(저는 Amazon linux 2023 AMI를 사용했습니다.)
  2. 생성후 보안의 인바운드 규칙을 아래와 같이 설정한다.
  • ssh의 경우 pc를 통해 가상서버에 접속하기 위해 내 ip로 설정하고, 그 외는 외부접속을 허용한다.
  1. EC2 인스턴스에 접속한다.
  2. java11을 설치해준다.
java 11설치
yum install java-11-amazon-corretto.x86_64

# java 버전 확인
java -version
  1. CodeDeploy Agent를 설치한다.
# 패키지 매니저 업데이트, ruby 설치
sudo yum update
sudo yum install ruby
sudo yum install wget

# 서울 리전에 있는 CodeDeploy 리소스 키트 파일 다운로드
cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install

# 설치 파일에 실행 권한 부여
chmod +x ./install

# 설치 진행 및 Agent 상태 확인
sudo ./install auto
sudo service codedeploy-agent status
  1. 마지막 명령어를 통해 Agent 상태를 확인해준다.
    마지막 줄과 같이 실행중이면 된다.

EC2에 IAM 역할 부여

EC2 에 S3, CodeDeploy 권한 정책을 부여하겠다.

  1. EC2로 사용사례를 선택한다.

  2. AmazonsS3FullAccess, AWSCodeDeployFullAccess 두가지 권한을 부여한다.

  3. 역할이름을 적고 생성한다.

  4. 아래와 같이 인스턴스에 들어가서 IAM 역할 수정을 한다.

  5. 위에서 만든 역할을 부여해준다.


CodeDeploy IAM 역할 생성

  1. CodeDeploy 또한 IAM Role이 필요하므로 역할 생성을 누른다.
  2. 아래와 같이 사용 사례를 CodeDeploy로 설정한다.
  3. 권한은 이미 부여되어 있으므로, 이름만 설정하고 역할을 생성한다.

CodeDeploy 애플리케이션 생성

  1. CodeDeploy에 접속하여 애플리케이션 탭에 들어가서 애플리케이션 생성을 한다.

  2. 생성후 배포그룹을 생성한다. 역할은 이전에 생성한 CodeDeploy Role을 부여하고, 배포유형은 현재위치 배포를 선택한다.

    (배포 방식에 대해서는 다른 글로 대체하겠다. - https://gist.github.com/ninanung/9d63304cb0d070642e89f9b94b6fe24b)

  3. 환경 구성을 설정한다. EC2를 선택하고, 태그 그룹에 생성한 EC2 인스턴스를 입력한다.

  4. 에이전트 구성은 하지 않고, 배포 설정은 여러대의 서버를 어떤 단계레 따라 순차적으로 배포할것인지를 선택하는 설정인데, EC2하나만 배포하기 때문에 한번에 배포하고 끝내는 CodeDeployDefault.AllAtOnce를 선택한다.
    또한, 로드밸런서는 없으므로 사용하지 않는다.

  5. 배포그룹을 생성한다.


AppSpec.yml 추가

appspec은 CodeDeploy Agent가 읽고 배포를 진행하는 명세서와 같다.
해당 파일은 프로젝트 최상단에 생성한다.

# appspec.yml

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/cicd_hwan/ # 프로젝트 이름
    overwrite: yes

permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user
  • files.source
    • 복사할 파일 또는 디렉토리의 경로를 지정하고
  • files.destination
    • S3에서 받아온 프로젝트의 저장 위치를 지정한다.

Github actions 스크립트 업데이트

CodeDeploy에 대한 설정을 추가해준다.

  push:
    branches: [ main ]

env: 
  S3_BUCKET_NAME: cicd-hwan
  PROJECT_NAME: cicd-hwan

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Setup Java JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
        shell: bash

      - name: Build with Gradle
        run: ./gradlew build
        shell: bash

      
      - name: Make zip file
        run: zip -r ./$GITHUB_SHA.zip .
        shell: bash

      - 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: ${{ secrets.AWS_REGION }}

      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip

      ### 새로 추가한 부분 ###
      - name: Code Deploy
        run: aws deploy create-deployment --application-name cicd_hwan --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name develop --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip
  • application-name
    • CodeDeploy 애플리케이션의 이름을 지정.
  • deployment-config-name
    • 배포 그룹 설정에서 선택했던 배포 방식을 지정.
  • deployment-group-name
    • 배포 그룹의 이름.
  • s3-location
    • jar를 S3에서 가지고 오기 위해 차례로 bucket 이름, 파일 타입, 파일 경로를 입력합니다.

이제 작성한 것을 push하고 actions를 살펴보면 되는데, 그 전에 EC2 상에서 실행한 CodeDeploy Agent는 IAM Role을 부여하기 전에 실행했으므로 해달 Role이 적용되지 않았을 것이다. 따라서 restart를 해주고, push 하겠다.

sudo service codedeploy-agent restart

그러면 아래와 같이 배포가 된것을 확인할 수 있다.!!

이제 EC2에서 현재 디렉터리를 확인해보면,

ec2-user home 디렉터리에 프로젝트가 있는것을 확인할 수 있다.
이제는 Nginx를 통해 무중단 배포를 다음글에서 적어보겠다.

profile
Backend Developer

0개의 댓글