ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GitHub Actions과 AWS CodeDeploy 사용하기
    CI, CD 2021. 6. 23. 16:41

     

    1. GitHub Actions

     

    지난 시간에 Github Action으로 django test 하기(CI) 를 이용해서

     

    python django 코드를 자동으로 테스트하는 것까지 진행하였다.

     

    혹시라도 못보신 분은 위 링크를 참고하시길 바란다.

     

     

    2. AWS CodeDeploy

     

    https://aws.amazon.com/ko/codedeploy/

     

    AWS CodeDeploy는 Amazon EC2, AWS Fargate, AWS Lambda 및 온프레미스 서버와 같은 다양한 컴퓨팅 서비스에 대한 소프트웨어 배포를 자동화하는 완전관리형 배포 서비스입니다. AWS CodeDeploy를 사용하면 새로운 기능을 더욱 쉽고 빠르게 출시할 수 있고, 애플리케이션을 배포하는 동안 가동 중지 시간을 줄이는 데 도움이 되며, 복잡한 애플리케이션 업데이트 작업을 처리할 수 있습니다. AWS CodeDeploy를 사용하여 소프트웨어 배포를 자동화함으로써 오류가 발생하기 쉬운 수동 작업을 제거할 수 있습니다. 배포 요구 사항에 맞게 서비스가 확장됩니다.

     

     

     AWS CodeDeploy는 위 공식문서에서 설명하듯이 배포를 자동화해주는 관리형 배포 서비스 입니다.

    다른 자동 배포 서비스가 많지만 AWS CodeDeploy를 선택한 이유는 여러 서버를 배포하는데 용이하고, 사용자가 원하는 대로

    커스텀해서 배포하는 것도 가능해서 선택하였습니다.

     

    (1) AWS Account

    AWS Account 계정이 있어야 AWS 자원이 사용가능 합니다.

     

    (2) IAM Role 과 Service Role 생성

    Instance Role

    In the first step, we need to create the instance role using AWS IAM. This role is important as it gives the proper permission to EC2 to access and read files from S3 buckets.

    To create it, go to AWS Management Console and log in using our AWS Account. Then, proceed to IAM in the console and click on Roles. Once we have entered the Roles page, click on Create Role.

     

    AWS IAM 으로 들어가신 후, 왼쪽 메뉴에서 Roles 를 선택,

    다음과 같이 보이는 화면에서 Create Role 를 선택

    * 아래 role를 추가해야 되는건 아님

     

    EC2 를 선택한 후,

     

     

    다음 2가지 role 를 찾아서 선택한다.

    • AmazonEC2RoleForAWSCodeDeploy
    • AWSCodeDeployRole

     

    여기서는 'CodeDeployRole' 이라는 명칭으로 생성한다.

     

     

    선택 후 role 를 생성 후, 생성된 role 를 선택한 후

    다음과 같이 Edit trust relationships 를 통해 trust relationships 를 편집한다.

     

     

     

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": [
              "codedeploy.ap-northeast-2.amazonaws.com",
              "ec2.amazonaws.com"
            ]
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }

     

    편집 후, Update Trust Policy 를 눌러 업데이트 한다.

     

     

    (3) EC2 Instance 생성

     

    실제로 해당 Role 이용해서 연결해서 사용할 EC2 Instance 를 생성한다.

     

    Launch Instances  클릭

     

    Amazon Linux 2 AMI (HVM), SSD Volume Type 을 선택

     

    여기서, IAM role 를 'CodeDeployRole' 선택한다.

     

     

     

     

    설정 후, 키 페어까지 생성 후 EC2 Instance 를 생성한다.

     

     

    (3) EC2 Instance 설정

     

    만들었던 EC2 Instance에 ssh 로 접속한다.

     

    1. yum 최신 업데이트 진행

    sudo yum update -y

     

    2. Install git and python 3

    sudo yum install git -y
    sudo yum install python3-pip python3-devel python3-setuptools -y

     

    3. Install CodeDeploy Agent

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

     

     

    여기까지 AWS CodeDeploy Service 설정 완료

     

     

    (4) AWS CodeDeploy Service

     

    AWS CodeDeploy 로 들어간 후,

     

    Create application 선택

    EC2/On-premises 선택한다.

     

    Deployment Group 생성

    Service role 에서 전에 만든 role 를 선택한다.

     

    여기서,

    Amazon EC2 instances 를 선택,

    name에서도 해당 Deployment Group 의 이름을 지정한다.

     

     

    Deployment settings 에서

    기본적으로 CodeDeployDefault.AllAtATime 으로 선택이 되어 있지만,

    CodeDeployDefault.OneAtATime 으로 변경해서 한번에 하나씩 배포하도록 설정한다.

     

     

    'Create deployment group' 버튼을 눌러 생성한다.

     

    (5) CodeDeploy AppSpec file 설정

     

    프로젝트 root에서 AppSpec file 을 설정해야

    이 설정에 맞춰서 배포가 진행된다.

    자세한 설명은 아래 링크 참조

    CodeDeploy AppSpec File reference — AWS CodeDeploy (amazon.com)

     

    version: 0.0
    os: linux
    files:
     - source: .
       destination: /home/ec2-user/api/django_testing
    hooks:
      BeforeInstall:
       - location: scripts/remove_server
         timeout: 300
         runas: root
      Install:
       - location: scripts/install_app_dependencies
         runas: root
      ApplicationStart:
       - location: scripts/start_server
         runas: root

    BeforeInstall:

     설치 전 수행하는 script. 여기서는 주로 설치했던 프로젝트 파일들을 삭제한다.

    #!/bin/bash
    
    cd /home/ec2-user/api/django_testing
    docker-compose down
    
    cd /home/ec2-user/api
    rm -rf ./django_testing
    

     

    Install:

     실제 프로젝트 설치하는 script. git clone 통해 진행

     

    #!/bin/bash
    cd /home/ec2-user/api
    git clone https://github.com/~~~.git
    

    ApplicationStart:

    서버 실행, 여기서는 docker-compose 를 build, up 해서 진행한다.

     

    #!/bin/bash
    cd /home/ec2-user/api/django_testing
    docker-compose build
    docker-compose up -d

     

    (6) workflow file 설정

     

    이전 github actions 에서 했던것처럼 workflow 파일을 설정한다.

     

    여기서 생성하기 전 

    AWS_ACCESS_KEY_ID,

    AWS_SECRET_ACCESS_KEY,

    AWS_REGION

    이 변수들을 github 프로젝트 settings에서 Secrets로 들어가서 

    각각에 맞는 내용들로 설정한다. (어떻게 설정하는지는 너무 길어서 생략한다)

     

     

    name: Django testing CI
    
    on:
      push:
        branches: [ master, develop ]
      pull_request:
        branches: [ master ]
    
    jobs:
      continuous-integration:
    
        runs-on: ubuntu-latest
        strategy:
          max-parallel: 4
          matrix:
            python-version: [3.6]
    
        steps:
        - uses: actions/checkout@v2
        - name: Set up Python ${{ matrix.python-version }}
          uses: actions/setup-python@v2
          with:
            python-version: ${{ matrix.python-version }}
        - name: Install Dependencies
          run: |
            python -m pip install --upgrade pip
            pip install -r requirements.txt
        - name: Run Tests
          run: |
            pytest
    
      continuous-deployment:
    
        runs-on: ubuntu-latest
        needs: [ continuous-integration ]
    
        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 django-test-codedeploy \
                --deployment-group-name django-test-codedeploy-group \
                --deployment-config-name CodeDeployDefault.OneAtATime \
                --github-location repository=${{ github.repository }},commitId=${{ github.sha }}
    

     

    이렇게 한 후,

    기존 했던 github 에 push 또는 pull request를 하게 되면,

    다음처럼 github actions에서 확인이 가능하다.

     

     

    그리고, continuous-deployment 가 성공하면

    AWS console 에서 CodeDeploy 로 가서, 다음처럼 진행 또는 성공으로 나오는 걸 볼 수 있다.

     

     

    자세한 사항은 해당 '배포된 목록' 중 상세에서 'view events' 를 눌러보게 되면

    다음과 같은 순서로 진행되는 것을 알 수 있다.

    만약 배포에서 실패가 발생하면 아래 프로세스 중 어디서 오류가 났는지 확인 할 수 있다.

     

    성공된 것을 확인 한 후,

     

    ec2 instance 터미널로 들어가서 도커 컴포즈와 서버 상태를 확인한다.

     

    아래처럼 Up 상태로 해당 도커가 성공적으로 실행하고 있는것이 확인된다.

     

    참조 사이트

Designed by Tistory.