본문 바로가기

개발 기록/AWS

Github와 AWS CodeDeploy 연동 - CI/CD 구축

안녕하세요 :)

이번시간에는 Github(action)와 AWS(Codedeploy, ec2)를 활용하여 CI/CD 구축을 하도록 하겠습니다.

CI(continuous integration) /CD(continuous deployment)는 자동으로 코드 통합과 배포를 위한 시스템 설계예요.

개발은 로컬에서 진행이 되고, 개발이 완료되면 Github로 push를 하게 됩니다.

이때 빌드, 테스트 그리고 배포까지 자동으로 수행이 되며, 서버(ec2)에 변경된 코드가 실행까지 이루어지게 되는데요.

코드를 push만 하면 모든 것이 자동으로 이루어지니 굉장히 편하겠습니다 :)

한 번만 세팅을 해놓으면 개발 이외에는 자동화를 시킬 수 있으니 꼭 도전을 해보셨으면 좋겠습니다!

물론 아래 실습은 aws 프리티어로 진행을 하였으며 1년은 무료로 사용을 하실 수 있어요. 1년 이후에는 사용한 만큼의 (아마도 소액의 _ _ ) 금액이 지불이 되겠습니다.

 

ec2 생성은 aws linux 2023로 생성을 하였습니다.

ec2 인스턴스 설치 이후 설정 (codedeploy-agent 설치) [0]

sudo yum update
sudo yum install ruby -y
sudo yum install wget
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent start
sudo service codedeploy-agent status

codedploy-agent 설치가 되어야 Codedeploy에서 ec2를 제어할 수 있습니다.

 

IAM 생성

IAM이란, 특정 인스턴스가 특정 동작 및 접근을 할 수 있도록 권한을 제어할 수 있는 서비스입니다.

예를 들어서 CodeDeploy -> EC2에 접근할 수 있는 권한을 주기 위해서는, 접근할 수 있는 역할(IAM)을 만들고 CodeDeploy에 역할을 부여해주셔야 EC2에 접근을 하실 수 있어요.

 

1. IAM 이동 -> 역할 -> 역할 만들기

2. AWS 서비스 및 EC2 선택

3. AWSCodeDeployRole 선택 및 생성

4. 서비스 추가 (지금의 서비스가 추가가 되어야, 아래에서 만들 CodeDeploy 그룹 생성 가능)

방금 생성하신 역할로 이동 -> 신뢰 관계 이동 -> 신뢰 정책 편집 -> 아래 서비스 수정 및 추가

 

5. EC2로 이동 및 방금 생성한 IAM 연결

CodeDeploy 생성

1. CodeDeploy 접속 -> 애플리케이션 생성 클릭

2. 이름 작성 및 컴퓨팅 플랫폼 선택 -> EC2에 연결하기 때문에 EC2/온프레미스 선택

3. 애플리케이션 생성 후 배포 그룹 생성

4. 배포 그룹 생성 중 (서비스 역할은 이전에 생성했 던 IAM 선택)

5. ec2에서 만든 이름 선택

키 부분에 Name 입력 시, 이전에 생성한 EC2 인스턴스 이름 확인 가능 -> 선택!!

6. 배포 방법 선택

디폴트는 한 번에 전부 배포를 시도하지만, 한 번에 하나씩 배포하기 선택

 

7. 로드 밸런서 비활성화, 그룹 생성 완료

현재는 인스턴스를 하나만 유지하기 때문에 로드 밸런서 비활성화

 

Github에서 CodeDeploy로 접속할 수 있도록 IAM 사용자 추가

1. IAM -> 사용자 -> 생성

2. 사용자 이름 작성 -> 권한 옵션 부여

직접 정책 연결 선택 및 AWSCodeDeployFullAccess 선택

3. 생성이 완료된 사용자로 접속 -> 액세스 키 만들기 선택

4. Command Line Interface 선택

지금의 과정을 통해서 액세스키와 시크릿키를 발급받을 수 있습니다. 키를 활용하여 외부에서 aws로 접근 가능.

 

액세스키와 시크릿키를 Github 환경 변수 등록

방금 발급받은 키를 github에 등록을 하겠습니다.

1. Github 내 레파지토리로 이동

2. 상단 레파지토리 내비게이션에서 Settings로 이동

3. 왼쪽 내비게이션 Secrets and variables -> Actions로 이동

4. New repository secret 클릭 후 액세스키와 시크릿키 등록

5. 키 등록 완료

등록된 키를 갖고 Github -> AWS로 접근을 할 수 있습니다.

appspec.yml 파일[1] 생성

appspec.yml 파일은 Github -> CodeDeploy -> ec2까지 이동 후, ec2에서 어떤 동작을 할지에 대한 명세를 하게 됩니다.

 

1. 내 프로젝트 최상위 위치에 appspec.yml 생성

2. appspec.yml 가이드를 참고하여 코드 작성 (샘플은 아래 코드를 참고해 주세요)

version: 0.0
os: linux
files:
  - source: .
    destination: /home/ec2-user/work/mint-server
hooks:
  BeforeInstall:
   - location: scripts/before_install.sh
     runas: root
  Install:
   - location: scripts/install.sh
     runas: root
  ApplicationStart:
   - location: scripts/application_start.sh
     runas: root

ec2 내에서 어떤 동작을 할지에 대한 명세를 해주시면 되겠습니다. (scripts 파일 참고: URL)

위의 스크립트 동작은 프로젝트마다 구성이 다르므로 프로젝트에 맞게 설정을 필요로 해요.

 

Git Acion 설정

마지막으로 Github로 코드를 push 했을 때 빌드, 테스트 그리고 AWS로 전송하기 위한 Action 코드를 작성하겠습니다.

예제: github URL

# 파일 위치: .github/workflows/django.yml
name: Django CI

on:
  push:
    branches: [ "master" ]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [3.8]

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v3
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install Dependencies
      run: |
        docker-compose pull
        docker-compose build
    - name: Run Tests
      run: |
        docker-compose run web python manage.py test

  continuous-deployment:

    runs-on: ubuntu-latest
    needs: [ build ]

    steps:
      # Step 1
      - 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 }}

      # Step 2
      - name: Create CodeDeploy Deployment
        id: deploy
        run: |
          aws deploy create-deployment \
            --application-name mint-server \
            --deployment-group-name mint-server-group \
            --deployment-config-name CodeDeployDefault.OneAtATime \
            --github-location repository=${{ github.repository }},commitId=${{ github.sha }}

위의 코드를 보시게 되면 master 브랜치에 push가 되었을 때 동작을 하게 돼요. 빌드와 테스트 코드가 동작하는 모습을 보실 수 있고, aws로 배포가 되는 모습까지도 보실 수 있겠습니다.

 

CI/CD 구축을 하신 이후에 조금 더 편하게 그리고 재미있게 개발을 하셨으면 좋겠습니다 :)

감사합니다.

 

[0]

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html

[1]

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file.html