본문 바로가기
Dev/AWS

Travis CI,CodeDeploy,S3,Nginx로 EC2에 무중단 배포하기(2) - Travis CI,S3,CodeDeploy 연동

by ssyoni 2022. 4. 6.
반응형

CodeDeploy를 생성하고 S3로부터 받은 파일을 EC2 서버로 배포하는 과정을 정리하였습니다.

설명하기에 앞서 요약을 해보자면 EC2와 CodeDeploy 서비스가 서로 소통(?)할 수 있게 각각 서비스에 대한 권한을 가진 '역할'을 하나씩 생성해서 부여합니다. 그다음 CodeDeploy 애플리케이션을 생성하고 프로젝트에 appspec.yml 설정 파일로 S3에서 받은 파일을 EC2로 배포하는 설정을 추가해주면 됩니다. 

 

 

EC2에 IAM역할 생성

CodeDeploy는 S3 버킷에 있는 파일을 EC2 서버에 배포하는 역할을 합니다. 이전 포스팅에서 IAM 사용자 추가를 통해 외부 서비스인 Travis CI가 CodeDeploy에 배포 요청을 할 수 있는 접근 권한을 생성하였습니다. 

이번에는 CodeDeploy가 EC2에 배포할 파일을 전송해야 하기 때문에 EC2에게 CodeDeploy에게서 파일을 받을 수 있도록 IAM '역할'을 생성해 주어야 합니다. 

더보기

AWS IAM 사용자 vs 역할 

- 사용자 : 외부 서비스에 권한을 주는 것

- 역할 : AWS 내부 서비스 간의 권한을 허용하는 것 

 

1. IAM 역할 생성 

IAM > 역할 > 역할생성 페이지에서 역할을 생성해줍니다. 이 역할은 AmazonEC2RoleForAWSCodeDeploy 권한을 가집니다. 

 

 

2. EC2 서비스에 역할 등록 

EC2 > 인스턴스 > IAM 역할 연결/바꾸기 페이지에서 방금 생성한 역할을 선택해줍니다.

**생성 후 인스턴스를 꼭 재부팅 해 주어야만 역할이 정상적으로 적용됩니다. 

 

 

3. EC2에 CodeDeploy Agent 설치 

EC2 인스턴스 서버에서 CodeDeploy를 사용하려면 CodeDeploy 에이전트를 설치해야 합니다. 

EC2에 접속해서 아래의 명령어를 입력하여 CodeDeploy 에이전트 설치 파일을 내려받습니다. 

aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2

 

내려받은 install 파일에 실행 권한을 추가해주고 install 파일로 설치를 진행합니다. (참고로 ruby언어가 설치되지 않은 상태에서는 에러가 발생합니다.)

chmod +x ./install
sudo ./install auto

 

설치가 완료되면 에이전트의 실행 상태를 조회합니다. 

sudo service codedeploy-agent status

→ The AWS CodeDeploy agent is running as PID xxx

 

 

CodeDeploy를 위한 권한 생성 

위에서 CodeDeploy를 통한 배포를 받을 수 있게 EC2를 대상으로 역할을 생성하여 부여하였습니다. 

이번에는 반대로 CodeDeploy가 EC2에 접근할 수 있는 권한을 가진 역할을 생성합니다. 

 

1.CodeDeploy 역할 생성

IAM > 역할 > 역할생성

 

2. CodeDeploy 생성 

CodeDeploy > 애플리케이션 > 애플리케이션 생성으로 이동합니다. 

 

 

CodeDeploy 애플리케이션을 생성하고 배포 그룹을 생성해줍니다. 

서비스 역할에는 위에서 생성한 CodeDeploy 역할을 선택해줍니다. 

 

EC2를 하나만 사용하기 때문에 배포 유형은 현재 위치로 선택합니다.

 

마지막으로 배포 설정과 로드밸런서를 설정해줍니다. 배포 설정은 서버의 개수에 따라 모든 서버에 배포할지, 부분적으로 배포할지 등을 설정하는 것입니다. 현재는 하나의 EC2서버만 사용하고 있기 때문에 한 번에 배포하는 CodeDeployDefault.AllAtOnce 옵션을 선택해주었습니다. 

 

 

Travis CI, S3, CodeDeploy 연동

EC2서버에 Travis CI에서 S3로 전달받은 zip 파일을 저장하고 압축을 풀어줄 디렉토리를 먼저 생성해주겠습니다. 

mkdir ~/app/step2 && mkdir ~/app/step2/zip

 

1. appspec.yml 설정 파일 생성

앞서 Travis CI 연동 작업 시 .travis.yml 설정 파일을 생성해주었던 것처럼 프로젝트에 AWS CodeDeploy 설정 파일인 appsepc.yml을 생성해줍니다. 

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/app/step4/zip
    overwrite: yes

EC2에서 생성한 디렉토리를 대상으로 배포하며 기존의 파일을 덮어 씌우는 설정입니다. 

 

 

2. .travis.yml 설정 파일에 CodeDeploy 내용 추가 

Travis CI에서 CodeDeploy에 배포 요청을 하기 위한 내용을 추가해줍니다. 

deploy:
  - provider: s3
    access_key_id: $AWS_ACCESS_KEY
    secret_access_key: $AWS_SECRET_KEY
    bucket: do-you-wanna-quit-build
    region: ap-northeast-2
    skip_cleanup: true
    acl: private
    local_dir: deploy
    wait-until-deployed: true

### AWS CodeDeploy 내용 추가 ###
  - provider: codedeploy
    access_key_id: $AWS_ACCESS_KEY
    secret_access_key: $AWS_SECRET_KEY
    bucket: do-you-wanna-quit-build
    key: miniproject.zip					# 빌드 파일 압축해서 전달 
    bundle_type: zip						# 압축 확장자 
    application: miniproject				# CodeDeploy 애프리케이션 이름 
    deployment_group: miniproject-group		# CodeDeploy 배포 그룹
    region: ap-northeast-2
    wait-until-deployed: true

설정 파일의 deploy 부분에 codedeploy 내용을 추가해주었습니다. 액세스 키와 아이디는 Travis CI 세팅에서 설정했던 변수를 그대로 사용합니다.

 

마지막으로 프로젝트를 PUSH 해주면 Travis CI가 시작되고 빌드한 jar파일을 CodeDeploy를 통해 배포 작업이 이루어집니다. 

 

CodeDeploy 배포 성공

EC2에서 배포한 폴더로 이동한 다음 파일 압축이 잘 풀린 것을 확인해주면 됩니다.

 

이로 써 Travis CI, S3, CodeDeploy 연동 완료!

 

 

 

 

 

반응형

댓글