AWS Snippet - Travis CI, Github과 AWS CodeDeploy 연동하여 EC2에 배포하기

  • Travis CI와 AWS CodeDeploy와 연동하여 django 프로젝트를 푸시 후 자동 배포 하는 프로세스에 관하여 정리합니다.

1. Travis CI와 Github 연동

travis

  • 처음 로그인 하면 profile화면으로 바로 이동하며 우측에 있는 Sync account 버튼으로 github repository를 동기화 할 수 있고,
  • 아래쪽에 프로젝트 목록이 나오며, 프로젝트옆 슬라이드 버튼으로 CI를 연동시킬지 여부를 결정할 수 있습니다.

travis_sync

  • 프로필에서 프로젝트를 연동시키고, 해당 프로젝트 내에 .travis.yml travis 설정파일이 있으면, 코드가 푸시가 되면 Travis CI가 Testing을 자동으로 실행해줍니다.

travis_process

2. .travis.yml 작성

  • 개발을 할 때면, 단순히 코드만 작성하는 것이 아니라, 여러 라이브러리를 설치 및 사용함으로써 의존하게되고, 다양한 OS 환경에서 구동하게됩니다.
  • 이러한 여러가지 환경적인 요소를 CI에 알려줘야합니다. 이것을 .travis.yml에 작성하게 됩니다.
  • 이러한 작성에도 수많은 요소들이 있기때문에 문서가 상당히 많습니다. 아래 링크를 참조하세요.
  • 그리고 처음 작성할 때는 google에서 ‘언어명 travis.yml’ 이라고 검색하면, 많은 자료들을 구할 수 있으니 참조하며 작성하는 것이 좋습니다.

2-1. django .travis.yml 작성

  • 아래는 간단히 django project에 python 3.6 환경으로, requirements.txt에 기록되어 있는 라이브러리를 설치한 후, migrate 및 test를 수행하는 스크립트가 작성되어 있습니다.
language: python
python:
  - "3.6"
# command to install dependencies
install:
  - pip install -r requirements.txt

before_script:
  - python manage.py makemigrations

script:
  - python manage.py migrate
  - python manage.py test

3. AWS CodeDeploy와 Travis 연동

3.1 AWS IAM을 통한 정책 생성

3.1.1 EC2 정책 생성

  • IAM > 정책 > 정책 생성 > JSON 탭
  • 아래의 정책은 S3와 EC2가 통신을 허용하는 부분과 관계있습니다.
  • 만약 S3를 거치지 않고 codedeploy를 통해 바로 EC2로 배포할 경우 아래의 정책은 필요하지 않습니다.
  • CodeDeploy_EC2 라고 명명합니다. 다른 명칭을 입력하셔도 상관 없습니다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

3.1.2 Travis에서 S3배포를 위한 정책 생성

  • 다시 IAM > 정책 > 정책 생성 > JSON 탭
  • 이 정책 또한 S3를 거치지 않고 codedeploy를 통해 바로 EC2로 배포할 경우 아래 정책은 필요하지 않습니다
  • Travis-Deploy-To-S3 명명합니다. 다른 명칭을 입력하셔도 상관 없습니다.
    {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "s3:PutObject"
              ],
              "Resource": [
                  "*"
              ]
          }
      ]
    }
    

3.1.3 CodeDeploy를 위한 정책 생성

  • 다시 IAM > 정책 > 정책 생성 > JSON 탭
  • Travis-Code-Deploy-Policy 명명합니다. 다른 명칭을 입력하셔도 상관 없습니다.
  • 아래 json 코드의 주의점 아래 항목을 바꿔 입력하셔야합니다.
    • 서버리전 : (EC2처음 부여밭는 서브도메인 맨 앞과 같습니다. )
      • ap-northeast-2 : 아시아(서울)
      • ap-northeast-1 : 아시아(도쿄)
      • 기타 등등
    • 액세스ID : aws > 내 계정 > 대시보드 > 계정ID
    • CodeDeploy에 등록하는 어플리케이션이름 : 나중에 CodeDeploy 에서 어플리케이션 등록시 어플리케이션 이름
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codedeploy:RegisterApplicationRevision",
                "codedeploy:GetApplicationRevision"
            ],
            "Resource": [
                "arn:aws:codedeploy:서버리전:액세스ID:application:CodeDeploy에 등록하는 어플리케이션이름"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "codedeploy:CreateDeployment",
                "codedeploy:GetDeployment"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "codedeploy:GetDeploymentConfig"
            ],
            "Resource": [
                "arn:aws:codedeploy:서버리전:액세스ID:deploymentconfig:CodeDeployDefault.OneAtATime",
                "arn:aws:codedeploy:서버리전:액세스ID:deploymentconfig:CodeDeployDefault.HalfAtATime",
                "arn:aws:codedeploy:서버리전:액세스ID:deploymentconfig:CodeDeployDefault.AllAtOnce"
            ]
        }
    ]
}

3.2 AWS IAM에서 User 생성

  • AWS 기본 계정을 사용하면 위험하기 때문에 travis 전용 User를 생성합니다.
  • 생성한 User를 앞서 만든 정책과 연결할 것입니다.
  • IAM > 사용자 > 사용자추가
  • 사용자 이름 기입 - ‘travis_user’ 라고 입력하였습니다. 다른 이름을 사용하셔도 무방합니다.
  • ‘AWS 액세스 유형 선택’ 에서는 ‘프로그래밍 방식 액세스’ 만 체크 합니다.
  • 다음 화면 에서 ‘기존 정책 직접 연결’ 을 클릭합니다.
  • Travis-Deploy-To-S3, Travis-Code-Deploy-Policy 정책을 찾아 체크 후 다음으로 넘어갑니다.
  • 마지막 화면에서 csv 파일을 다운로드 받을 수 있는데 이 파일을 받아둡니다. 나중에 travis사이트에서 활용합니다.

3.3 EC2에 연결할 IAM 역할 생성

  • IAM > 역할 > 역할만들기
  • EC2 선택 > 다음
  • 3.1.1 항목에서 생성한 CodeDeploy_EC2 정책을 검색한 후 체크 후 다음
  • EC2_ROLE이라 명명하고 완료합니다.

3.4 CodeDeploy Application을 위한 IAM 역할 생성

  • 다시한번 IAM > 역할 > 역할만들기
  • 맨 아래쯤에 보이는 CodeDeploy 선택 후 다음
  • 그러면 정책이 하나 나옵니다. 나오는 것 클릭 후 다음
  • CodeDeployServiceRole이라고 명명 하고 완료합니다.

3.5 EC2와 역할 연결

  • 아직 EC2를 생성하지 않았다면 생성 과정에 IAM 역할을 설정할 수 있는데 이때 EC_ROLE 을 선택합니다.
  • 만약 생성을 이미 했다면 EC2 > 인스턴스 화면에서 운용중인 인스턴스를 우클릭 하고 > 인스턴스 설정 > IAM 역할/연결 바꾸기 에서 EC_ROLE 을 설정해줍니다.

3.6 S3 버킷 생성

  • S3버킷을 비공개로 생성합니다.

3.7 CodeDeploy 설정

  • AWS CodeDeploy > 애플리케이션 > 애플리케이션 생성
  • 애플리케이션 이름과 그룹을 입력
  • 애플리케이션 이름은 3.1.3에 입력한 이름과 동일
  • 배포 유형은 ‘현재위치배포’
  • ‘블루/그린 배포’ 유형은 새인스턴스로 교체하는 방식인듯 합니다.
  • 환경 구성에서 태그 값을 통해 Amazon EC2 인스턴스를 선택
  • 배포구성은 ‘CodeDeployDefault.oneAtTime’ - 한번에 모두 배포
  • 맨 아래쪽 서비스 역할은 3.4 에서 생성한 CodeDeployServiceRole 을 찾아 선택합니다.

3.8 .travis.yml 설정 추가

  • 아래 내용을 추가합니다.

3.8.1 S3에 배포하고 EC2 배포하는 경우 .travis.yml 추가내용

  • 아래는 추가내용입니다. script 부분은 원래있던 내용과 합쳐야합니다.
deploy:
- provider: s3
  access_key_id: $AWS_ACCESS_KEY
  secret_access_key: $AWS_SECRET_KEY
  local_dir: dpl_cd_upload
  skip_cleanup: true
  on: &2
    repo: 깃헙아이디/레포명
  bucket: 버킷이름
  region: 서버리전
- provider: codedeploy
  access_key_id: $AWS_ACCESS_KEY
  secret_access_key: $AWS_SECRET_KEY
  bucket: 버킷이름
  key: latest.zip
  bundle_type: zip
  application: CodeDeploy에 등록하는 어플리케이션이름 
  deployment_group: CodeDeploy에 등록하는 어플리케이션 그룹이름 
  region: 서버리전
  on: *2

script:
  - zip -r latest *
  - mkdir -p dpl_cd_upload
  - mv latest.zip dpl_cd_upload/latest.zip

3.8.2 EC2에 바로 배포하는 경우 .travis.yml 추가내용

deploy:
  - provider: codedeploy
    access_key_id: $AWS_ACCESS_KEY
    secret_access_key: $AWS_SECRET_KEY
    application: django_example
    deployment_group: django_example
    region: ap-northeast-2

3.9 travis 환경변수 설정

  • travis가 AWS에 접속할 수 있게 환경 변수를 설정해야합니다.
  • travis_user 생성시 다운로드 받은 csv파일에 Access key ID, Secret access key값이 있습니다.
  • travis > github 프로젝트 > Settings > Enviroment Variables
  • 아래와 같이 Name과 Value 값을 입력합니다.
    • AWS_ACCESS_KEY : Access key ID
    • AWS_SECRET_KEY : Secret access key

3.10 appspec.yml 파일 추가

  • 프로젝트 내에(개발소스 내에) appspec.yml 파일을 추가하고 아래의 소스를 입력합니다.
  • 아래 항목중 destination은 배포코드가 위치할 경로 입니다.(예: /home/django-home)
version: 0.0
os: linux
files:
  - source: ./
    destination: EC2에위치할경로

3.11 EC2 인스턴스에 CodeDeploy Agent 설치하기

  • 아래 코드는 Ubuntu 기준입니다.
  • 리전명은 변경해서 입력해주어야합니다.
sudo apt-get update
sudo apt-get install python-pip
sudo apt-get install ruby2.0
sudo apt-get install wget
cd /home/ubuntu
wget https://aws-codedeploy-리전명.s3.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto

  • 완료!

마치며