- Travis CI와 AWS CodeDeploy와 연동하여 django 프로젝트를 푸시 후 자동 배포 하는 프로세스에 관하여 정리합니다.
1. Travis CI와 Github 연동
- CI 란? - https://ko.wikipedia.org/wiki/%EC%A7%80%EC%86%8D%EC%A0%81_%ED%86%B5%ED%95%A9
- Travis CI - CI를 서비스하는 회사이며, github과 연동이 손쉽게 되고, github의 public repository의 경우는 무료로 서비스를 받을 수 있습니다.
- 무료 사이트는 ‘org’ 임을 유의해야합니다.
- 무료 - https://travis-ci.org/
- 유료 - https://travis-ci.com
- 홈페이지 우측 상단에
Sign in with Github
버튼을 클릭 하면 github 계정으로 로그인 되며 github에 public repository를 연동할 수 있게됩니다.
- 처음 로그인 하면 profile화면으로 바로 이동하며 우측에 있는
Sync account
버튼으로 github repository를 동기화 할 수 있고, - 아래쪽에 프로젝트 목록이 나오며, 프로젝트옆 슬라이드 버튼으로 CI를 연동시킬지 여부를 결정할 수 있습니다.
- 프로필에서 프로젝트를 연동시키고, 해당 프로젝트 내에
.travis.yml
travis 설정파일이 있으면, 코드가 푸시가 되면 Travis CI가 Testing을 자동으로 실행해줍니다.
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 에서 어플리케이션 등록시 어플리케이션 이름
- 서버리전 : (EC2처음 부여밭는 서브도메인 맨 앞과 같습니다. )
{
"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
- AWS_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
- 완료!
마치며
- 작업을 하며 블로그 및 레퍼런스를 참조하였습니다.
-
이래저래 삽질을 하면서 일단 기록에 의미를 두고자 스크린샷은 첨부하지 못했습니다.
- 참조링크