Infra/CI&CD

Travis CI 배포 자동화 (3) - Travis CI, AWS S3, CodeDeploy 연동

DuL2 2022. 8. 21. 17:41

이전 글 읽으러 가기


Travis CI, AWS S3, CodeDeploy 연동

 

 이번 글에서는 사용자를 만들었지만 역할을 만들어 보겠습니다. IAM 에서 사용자와 역할은 어떤 차이가 있을까요?

 

역할 사용자
- AWS 서비스에만 할당할 수 있는 권한
- EC2, CodeDeploy, SQS 등
- AWS 서비스 외에 사용할 수 있는 권한
- 로컬PC, IDC 서버 등

 

역할 만들기

다시 AWS IAM으로 돌아와 `역할 만들기` 해보겠습니다. 다음 사진의 역할 만들기를 클릭해주세요.

 

 

지금 만들 권한은 AWS 내부에서 EC2가 S3에 대한 접근을 하는 것이므로 역할을 만들 것입니다. AWS 서비스를 설정해주고, EC2에서 사용하므로 다음과 같이 설정하고 다음으로 넘겨주세요!

정책은 EC2가 CodeDeploy에 대한 권한들을 모아놓은 `AmazonEC2RoleforAWSCodeDeploy`정책을 사용하겠습니다. 

역할 이름을 설정하고 맞는 정책을 선택했는지 확인해주세요!

 

역할 생성 클릭!

 

EC2 역할 설정하기

이제는 EC2 화면으로 이동하여 현재 사용하고 있는 인스턴스의 역할을 바꾸겠습니다. 인스턴스를 선택하여 `보안 > IAM 역할 수정`을 눌러 방금 만든 역할로 수정해주겠습니다.

 

역할 수정!

역할을 수정하고 인스턴스에 역할이 적용되기 위해서는 재부팅을 해야합니다. 인스턴스 재부팅을 시작해주세요.

 

CodeDeploy 에이전트 설치

재부팅이 완료되었다면 CodeDeploy의 요청을 받을 수 있게 에이전트를 설치해야 합니다. EC2에 접속하여 다음 명령어를 입력해줍시다.

 

주의사항!
재부팅을 하게 되면 기존에 설정했던 포트포워딩 설정이 다 풀리므로 확인해보시기 바랍니다. 따로 재부팅이 될 때마다 포트포워딩을 자동으로 세팅해주는 글도 작성하여 공유하고 저도 공부를 해야할 것 같습니다.

또한, 기존에 서비스가 동작중이라면 종료하고 재부팅을 해야하지 않을까 싶습니다.

 

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

다운로드가 성공하면 다음과 같은 메세지가 콘솔에 출력됩니다.

./install 을 실행하기 위해 권한을 주도록 하겠습니다.

chmod +x ./install

install 파일을 싱행하여 설치를 진행합니다.

sudo ./install auto

 설치가 끝나면 Agent의 실행을 확인해 봅시다.

sudo service codedeploy-agent status

agent 실행 여부

 

 

CodeDeploy를 위한 권한 생성

 이번에는 CodeDeploy를 위한 권한을 생성해봅시다. EC2가 CodeDeploy 접근할때 권한이 필요했듯  CodeDeploy가 EC2에 접근하려면  똑같이 권한이 필요합니다. 이번에도 AWS 내부의 서비스를 이용하므로 IAM 역할을 만들어 줍니다. 

 

 위에서 봤던 역할 만들기 창입니다. 이번에는 다른 AWS 서비스에서 CodeDeploy를 찾아 다음으로 넘어갑시다.

CodeDeploy는 권한이 하나뿐이라 선택없이 그냥 넘어가면 됩니다. 편하죠?

 익숙한 화면입니다. 역할 이름을 정하고 `역할 생성`을 클릭하면 될 듯 싶습니다.

CodeDeploy 생성

AWS에는 세 가지의 배포 서비스가 있고 그 중 하나가 CodeDeploy입니다. 책의 소개된 서비스를 간략하게 적어 놓겠습니다.

 

  • Code Commit
    • 깃허브와 같은 코드 저장소 역할
    • 프라이빗 기능 지원, but github는 프라이빗 기능을 무료 지원하기 때문에 잘 사용되지 않음.
  • Code Build
    • Travis CI와 같은 빌드용 서비스
    • 멀티 모듈을 배포해야 하는 경우 사용해 볼만하다고 함. but 규모있는 서비스에서는 대부분 젠킨스/팀시티 등을 이용해서 이 서비스도 거의 사용할 일 없음.
  • CodeDeploy
    • AWS 배포 서비스
    • 위의 서비스들은 대체재 존재, but CodeDeploy는 대체재 존재 X
    • 오토 스케일링 그룹 배포, 블루 그린 배포, 롤링 배포, EC2 단독 배포 등 많은 기능 지원

 

우리는 배포 서비스 세 가지를 다음 모식도에서 보이는 것들을 이용해 사용하고 있습니다.

배포 자동화의 흐름

 깃허브 > Travis CI > CodeDeploy

 

따라서 AWS 서비스를 깃허브, Travis CI 가 대체하고 CodeDeploy를 통해서 배포를 할 것입니다.

 

CodeDeploy 배포 그룹 생성

애플리케이션을 생성하도록 하겠습니다.

애플리케이션이 생성되면 배포 그룹을 생성합니다.

그룹 이름과 서비스 역할을 설정해줍니다.

배포 유형은 현재 위치로 환경 구성은 Amazon EC2 인스턴스를 체크합니다. EC2에 입력한 태그와 똑같이 일치시켜 매칭되어야만 합니다. 저는 기존 EC2를 이용하여서 태그를 설정 안했기에 따로 설정해주었습니다.

태그 설정법

태그를 설정하게 되면 이렇게 인스턴스 Name에 값이 뜹니다. 원래는 - 로 인스턴스 이름이 없었습니다.

 

배포 설정은 `CodeDeployDefault.AllAtOnce`를 사용, 로드 밸런싱 활성화 체크는 해제합니다.

CodeDeployDefault.AllAtOnce 옵션
`배포 구성`이라는 이 옵션은 여러 개의 서버에 대해서 한번에 배포할지 혹은 나눠서 배포할지를 설정하는 옵션입니다. 현재는 1대 서버를 운용하므로 AllAtOnce 옵션을 사용합니다.

설정이 끝나셨다면 배포 그룹 생성을 해줍니다.

 

Tracis CI, S3, CodeDeploy 연동

EC2에 다음 코드를 입력하여 S3에서 넘겨줄 zip파일을 저장할 디렉토리를 생성합니다.

mkdir ~/app && mkdir ~/app/step2 && mkdir ~/app/step2/zip
# &&은 여러 명령을 연속해서 입력할 수 있게 해줍니다.

CodeDeploy 설정 파일 만들기

 저장소의 맨 바깥쪽에 appspec.yml 파일을 다음과 같이 생성하겠습니다.

version: 0.0 # CodeDeploy 버전(프로젝트 버전 아님!)
os: linux # Linux – Amazon Linux, Ubuntu Server 또는 RHEL 인스턴스 / Windows – Windows Server 인스턴스
files:
  - source: / # CodeDeploy에서 전달해 준 파일 중 destination으로 이동시킬 대상을 정합니다. 루트 경로(/)를 지정하면 전체 파일을 이야기합니다.
    destination: /home/ubuntu/app/step2/zip/ # source에서 지정된 파일을 받을 위치. Jar 실행은 옮긴 파일들로 징행
    overwrite: yes # 기존에 파일이 있으면 덮어쓸지 결정(yes: 덮어쓰겠다)

그 다음 .travis.yml의 deploy 부분에 codedeploy provider를 추가합니다.

... 
deploy: 
... 내부에 추가
  - provider: codedeploy
    access_key_id: $AWS_ACCESS_KEY # Travis repo settings에서 설정된 값
    secret_access_key: $AWS_SECRET_KEY # Travis repo settings에서 설정된 값
    bucket: ldu-springboot-build # S3 버킷 이름
    key: backend_server.zip # 빌드 파일을 압축해서 전달
    bundle_type: zip # 압축 확장자
    application: backend_server # 웹 콘솔에서 등록한 CodeDeploy 애플리케이션
    deployment_group: backend_server-group # 웹 콘솔에서 등록한 CodeDeploy 배포 그룹 이름
    region: ap-northeast-2 # 지역이름
    wait-until-deployed: true
    on:
      all_branches: true

application, deployment_group의 값은 아까 우리가 CodeDeploy 웹 콘솔에서 설정해주었던 값입니다.

EC2에 이동하여 풀기로한 destnation 폴더로 이동해보면 다음과 같이 프로젝트 파일들이 잘 도착한 것을 확인할 수 있습니다.

 

이제 우리는 Travis CI, S3, CodeDeploy를 연동하여 배포 자동화를 할 준비가 마무리 되었습니다!

 

다음 글에서는 마지막으로 배포 자동화 구성을 해보도록 하겠습니다.