AWS EC2 배포(2) - GitHub Actions를 이용한 CD 적용

Y·2023년 4월 11일
0

인프라

목록 보기
2/2

전날 배포에 이어서 이번에는 CI/CD를 적용해보고자 한다. CI/CD는 개인 프로젝트 수준에서는 굳이 안 해도 되겠지만 하면 편리하다. CI/CD 툴은 많이 존재하지만, 일단 GitHub를 이용해 협업을 하고있으니 GitHub에서 무료로 제공하는 GitHub Actions를 쓴다.
AWS와 GitHub Actions를 연동해서 하는 방식은 다양하겠지만, 대부분 이 방식을 많이 쓰는 것으로 보인다. 전체적인 구조는 대략적으로 아래와 같다. (CI는 생략)

  1. EC2 인스턴스 태그 설정
    CodeDeploy를 생성시 어떤 인스턴스에서 수행할지를 구분하기 위해서 태그를 사용한다. 그래서 태그 설정이 필요하다. EC2 인스턴스창 - 작업 - 인스턴스 설정 - 태그 관리에 들어가서 key값을 설정해주면 된다. (인스턴스 창 하단에 태그창에 들어가면 확인됨.)

  2. IAM 생성
    자동으로 AWS상에 배포하기 때문에 IAM 권한이 필요하다. 역할 생성에서 신뢰할 수 있는 엔티티 유형에는 AWS 서비스, 사용 사례에는 EC2를 선택해준다. 그리고 AmazonS3FullAccess 권한을 추가해준다. 그리고 이름 설정해주고 생성해주면 된다. 이후에 다시 EC2 창으로 돌아가서 작업 - 보안 - IAM 역할 수정에서 방금 생성한 IAM 역할을 선택해준다.

  3. CodeDeploy Agent 설치
    EC2 서버에 접속해서 다음과 같이 입력해주면 된다.

     sudo apt-get update
     sudo apt-get install ruby-full
     sudo apt-get install wget
     cd /home/ubuntu
     wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
     chmod +x ./install
     sudo ./install auto > /tmp/logfile

이후에 다음 명령어를 입력하면 code deploy가 정상적으로 동작하고 있는 내용이 나와야한다.

 sudo service codedeploy-agent status
  1. S3 생성
    버킷 생성해서 이름 입력해주고, 나머지는 전부 기본 설정대로 하면 된다. 버킷키는 비활성화했는데 기본설정이 SSE-S3이라 크게 관계없어보이긴한다..? 아무튼 그렇게 생성해줬다.

  2. CodeDeploy용 IAM 생성
    엔티티 유형에는 AWS 서비스, 사용 사례에는 CodeDeploy를 검색해서 선택해준다. 역할 추가는 따로 더 필요없고 이름만 설정해주면 된다.

  3. CodeDeploy 생성
    배포 - 애플리케이션에서 애플리케이션 생성 해준다. 이름 넣어주고 컴퓨팅 플랫폼은 EC2/온프레미스. 이렇게 생성한 후에 배포그룹을 만들어줘야한다. 이름 설정해주고 역할은 앞서 만들어준 IAM 역할. 배포 유형은 현재 위치. (블루/그린은 무중단배포시에 필요한 것으로 알고있다.) 환경 구성에서 Amazon EC2 인스턴스 선택해주고 위에서 설정했던 태그 이름 입력해준다. AWS Systems Manager은 일단 한 번만으로 해주고, 배포 설정은 CodeDeployDefault.AllAtOnce. 로드 밸런서의 경우에는 선택이겠지만 우리 프로젝트 크기에서는 굳이 필요없으니 활성화하지 않는다. 그렇게 배포그룹 생성해주면 된다.

  4. GitHub Actions용 IAM 생성
    이번엔 IAM 사용자를 생성한다. CodeDeployFullAccess와 S3FullAccess 권한을 선택해서 생성해준다.이후에 보안 및 자격증명에서 Access Key 생성해준다.

  5. GitHub Repository Secrets 추가
    AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 이름으로 각각 추가해준다.

  6. appspec 작성

version: 0.0
os: linux

files:
  - source:  /
    destination: /home/ubuntu/app
    overwrite: yes

permissions:
  - object: /
    pattern: "**"
    owner: ubuntu
    group: ubuntu

hooks:
  AfterInstall:
    - location: scripts/stop.sh
      timeout: 60
      runas: ubuntu
  ApplicationStart:
    - location: scripts/start.sh
      timeout: 60
      runas: ubuntu

이걸 프로그램의 루트 디렉토리에 생성해주면 된다. (git 말고, 프로그램 기준) hook을 설정해줘도 되는데 이건 자유다. hook의 경우 해당 블로그 에 있는 소스 코드 참고하였음.

  1. GitHub Actions Workflow 작성
    actions에 들어가서 workflow 아무거나 선택하고 입력된 내용은 다 지운다음에 아래 내용 기준으로 각자 소스에 맞춰서 작성하면 된다. (make zip file의 경우 만약 working directory가 ./라면 zip -qq -r ./$GITHUB_SHA.zip ./으로 입력해주라는 뜻이다.) 그리고 해당 코드 main에 push해주면 메인에 push 될때마다 자동으로 배포가 된다.
      name: Deploy to Amazon EC2

      on:
        push:
          branches:
            - main

      env:
        AWS_REGION: 
        S3_BUCKET_NAME: 
        CODE_DEPLOY_APPLICATION_NAME: 
        CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: 

      permissions:
        contents: read

      jobs:
        build:
          runs-on: ubuntu-latest
          environment: production
          env:
            working-directory: 

          steps:

            - name: Checkout
              uses: actions/checkout@v3


            - name: Set up JDK 11
              uses: actions/setup-java@v3
              with:
                distribution: 'temurin'
                java-version: '11'

            - name: Gradle Caching
              uses: actions/cache@v3
              with:
                path: |
                  ~/.gradle/caches
                  ~/.gradle/wrapper
                key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
                restore-keys: |
                  ${{ runner.os }}-gradle-


            - name: Build with Gradle Except Test
              run: |
                chmod +x gradlew
                ./gradlew build -x test
              working-directory: ${{env.working-directory}}

            - name: Make Zip File
              run: zip -qq -r ./$GITHUB_SHA.zip (working-directory)
              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: ${{ env.AWS_REGION }}


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

            - name: Deploy to AWS EC2 from S3
              run: |
                aws deploy create-deployment \
                  --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
                  --deployment-config-name CodeDeployDefault.OneAtATime \
                  --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
                  --s3-location bucket=${{env.S3_BUCKET_NAME}},bundleType=zip,key=$GITHUB_SHA.zip

나는 이 소스를 사용한다. (그리고 추가적으로 application.yml 파일을 secrets에 등록해놓고 해당 경로에 파일을 새로 생성해주는 방식도 사용했다.) 이렇게 하면 CI/CD까지 끝이다!

profile
개발자, 학생

0개의 댓글