만자의 개발일지

[AWS] CodeDeploy appspec.yml 파헤치기 본문

AWS

[AWS] CodeDeploy appspec.yml 파헤치기

박만자 2022. 1. 4. 21:42

AWS에서 CodeDeploy를 접하면 가장 난관인게 바로 이 appspec.yml 파일을 구성하는 것이다.

나한테만 해당되는 이야기일 수도 있다.

아무튼 오늘은 이 appspec.yml의 구조에 대해 살펴보려고한다.

예시로 AWS Document에 있는 appspec.yml 예시 파일을 참고하도록 하겠다.


그전에 CodeDeploy의 LifeCycle Event Hook에 대한 이해가 필요하다. 

아래 이미지는 CodeDeploy의 Event LifeCycle이다.

위와 같은 순서대로 Event들이 실행된다. 이 순서는 CodeDeploy에서 이미 정해 놓은 순서이고, 각각을 Event Hook 이라고 한다.

일부 Event Hook은 사용자가 직접 스크립트파일을 생성하여 사용할 수 있고, 일부는 이미 예약되어 있는 Event Hook이라 사용할 수 없다.

위 그림에서 회색으로 되있는 Event Hook 들은 스크립팅 할 수 없다.

 

위 Event들을 하나씩 순서대로 알아보자.

  1. Start
    • lifecycle의 첫 번째 이벤트로, CodeDeploy 에이전트를 자동으로 실행하고 인스턴스 배포가 시작된다.
  2. ApplicationStop
    • 이전 프로그램을 중지하는 스크립트를 실행하는 단계이다.
    • 예를 들어 커머스 웹 어플리케이션을 운영하고 있는데 새 버전(v.1)을 배포할 경우 이 이벤트를 통해 구 버전(v.0)을 사용하지 않도록 설정하고 새 버전(v.1)을 수신하도록 인스턴스를 준비할 수 있다.
  3. DownloadBundle
    • 이 이벤트 동안 CodeDeploy에이전트는 새 버전을 인스턴스로 가져온다.(ex CodeBuild에서 패키징된 zip 파일)
  4. BeforeInstall
    • 이 이벤트를 통해 구버전의 설치 구성을 저장하고, 파일을 복호화하고, 현재 버전의 백업을 만들 수 있다.
  5. Install
    • DownloadBundle을 통해 가져온 Bundle의 압축을 해제하고 appspec.yml에 정의된대로 파일을 지정한 경로로 복사한다.
  6. AfterInstall
    • 이 이벤트를 통해 프로그램이 시작되기 전에 프로그램의 구성을 변경할 수 있다.
  7. ApplicationStart
    • 이름에서 알 수 있듯이 어플리케이션을 구 버전(v.0) 대신 새 버전(v.1)로 설정한다.
  8. ValidateService
    • 이 이벤트를 통해 배포가 성공했는지 확인할 수 있는 검증 로직을 실행할 수 있다.
  9. End
    • lifecycle의 마지막 이벤트로, 인스턴스의 배포 성공유무를 중앙 서비스에 알린다.
version: 0.0
os: linux
files:
  - source: /index.html
    destination: /var/www/html
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies.sh
      timeout: 300
      runas: root
  AfterInstall:
    - location: scripts/change_permissions.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: scripts/start_server.sh
    - location: scripts/create_test_db.sh
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server.sh
      timeout: 300
      runas: root

 

위는 AWS Document에 있는 appspec.yml 파일의 예제이다. 이해를 돋구기 위에 예제에서 살짝 수정했다.

https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file.html

 

위에서 부터 차근차근 살펴보자

version: 0.0
os: linux
files:
  - source: /index.html
    destination: /var/www/html

보시다시피 버전이 0.0이고 os(운영체제)가 linux인것을 볼 수 있다. 여기까지는 고정이다.

밑에 files를 살펴보자

source 가 index.html 로 되있고 destination(목적지)가 /var/www/html로 되있다. 말그대로 서버의 destination 경로(var/www/html)에  source 파일(index.html)을 배포하겠다는 얘기이다. 만약에 디렉토리 전부를 서버에 올리고 싶으면 

source 부분을 아래와 같이 바꿔주면된다.

files:
  - source: /
    destination: /var/www/html

그 다음 아까 위에서 설명했던 Event Hook에 대해 살펴보자.

hooks:
  BeforeInstall:
    - location: scripts/install_dependencies.sh
      timeout: 300
      runas: root
  AfterInstall:
    - location: scripts/change_permissions.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: scripts/start_server.sh
    - location: scripts/create_test_db.sh
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server.sh
      timeout: 300
      runas: root

 

일단 기본적인 Event Hook의 구조는 아래와 같다.

hooks:
   deployment-lifecycle-event-name:
     - location: script-location
       timeout: timeout-in-seconds
       runas: user-name

location을 보면 script-location이라고 적혀있는데, 위 예제처럼 스크립트파일의 경로를 지정해주면 된다.

location의 경우 event hook의 필수 옵션(Required)이고 빼먹으면 안된다.

반대로 timeout과 runas의 경우 Optional 이라고 나와있다. 써도되고 안써도 무방하다는 얘기이다.

timeout은 기본값으로 한시간(3600s)이고 사용자가 직접 지정해줄 수 있다.

해당 스크립트 실행 시간이 timeout으로 지정한 시간을 넘어갈 경우 실패(fail)로 간주한다.

마지막으로 runas 옵션은 해당 스크립트를 실행할 사용자를 설정(가장(?))한다.

 

더 자세한 내용이 궁금하다면 아래 공식문서를 참고하면된다.

https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html

 

 

참고

 

 

Comments