본문 바로가기

Infra/aws

Github Action과 AWS Code Deploy를 이용한 배포 파이프라인 자동화하기 (Step 2)

 

Step1 에서 이어지는 내용입니다. 

 

https://june0423.tistory.com/18

 

Github Action과 AWS Code Deploy를 이용한 배포 파이프라인 자동화하기 (Step 1)

회사에서 매번 앱 런칭 할 때 마다 매번 새로운 서버를 올리는데 배포 파이프라인을 자동화하지 않아서 자잘한 변경사항이 있어도 모든 과정을 수동으로 다 업데이트해야하는 귀찮음이 있어서

june0423.tistory.com

이제 Step 1 에서 빌드한 결과물을 CodeDeploy를 이용해 EC2에 배포하는 단계입니다. 

 

1. Appspec 파일 생성 

appspec 파일이란? : CodeDeploy에서 배포를 관리하는 데 사용 하는 파일 (yml, json 택1), 파일에 정의된 일련의 수명 주기 이벤트 hook으로 각 배포를 관리하는데 사용한다. 

 

 

개발환경에서 프로젝트의 루트에 appspec.yml 이라는 파일을 생성합니다. (파일이름은 항상 appspec.yml(or .json) 이어야합니다.)

 

해당 프로젝트에서 사용한 appspec.yml은 다음과 같습니다

#appspec.yml

version: 0.0
os: linux 

files:
  - source: / # 인스턴스에 복사할 source 디렉터리 or 파일
    destination: /opt/testapp # 인스턴스의 destination 경로
    overwrite: yes # overwrite 여부

permissions: # pemission 설정 destination 파일에 owner,group,mode를 지정한다. 
  - object: /opt/testapp/
    owner: ubuntu
    group: ubuntu
    mode: 755

hooks: # 각 라이프 사이클에 실행할 동작
  AfterInstall:
    - location: deploy.sh # location에 설정한 파일을 afterInstall event에서 실행한다.
      timeout: 300
      runas: ubuntu

라이프 사이클 hook 의 공식문서 : https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html

 

AppSpec 'hooks' section - AWS CodeDeploy

The Start, DownloadBundle, Install, BlockTraffic, AllowTraffic, and End events in the deployment cannot be scripted, which is why they appear in gray in this diagram. However, you can edit the 'files' section of the AppSpec file to specify what's installed

docs.aws.amazon.com

 

2. Hook에서 실행하는 명령 스크립트 파일 생성 

 

deploy.sh

 

cd /opt/testapp
docker-compose up --build -d

이 프로젝트에서는 afterinstall event 에서 docker-compose로 컨테이너를 올리는 작업을 실행했다.

 

여기서 몇가지 주의할 점 (내가 배포 실패를 경험 했던 점들)

- hook에서 timeout 을 너무 낮게 설정하면 애플리케이션이 구동되기 전에 timeout이 발생해서 배포가 실패할 수 있다.

- 프로젝트 경로에 dockerfile, docker-compose.yaml이 있는 경우 appspec의 location에서 설정해준 경로로 이동하여 실행한다.

- 컨테이너를 올리는 경우 background로 실행한다. (foreground로 실행할 시 timeout까지 응답을 할 수 없어 배포가 실패할 수 있다.)

 

3. github에 push : github action에서 master branch에 push 되면 배포 파이프라인이 동작하도록 설정했으므로 push 를 하면 모든 과정이 실행된다. 

 

4. 배포 결과 확인

CodeDeploy 콘솔에서 배포 결과들을 확인할 수 있고, 각 단계들 어디서 실패했는지 상태를 확인할 수 있다. 배포 실패시 인스턴스에서 로그를 확인하면 대부분의 실패 이유를 알 수 있으니 로그를 잘 확인하면서 배포하도록하자. 

 

여기까지가 가장 간단한 CD 과정이었다. 어렵다면 어렵고 쉽다면 쉬운거 같은데 회사에서는 오케스트레이션 도구로 ECS를 사용하고 있으니 다음에는 github action + AWS codedeploy + AWS ECS 로 CD 작업을 연습해보고자 한다.