AWS

CodeDeploy - CodePipeline 만드는 도중 실패 및 설명

묠니르묘묘 2024. 5. 5. 18:09

1. 실패 이유

CodeDeploy 실패 로그

 

스프링부트 프로젝트 최상단에 appspec.yml 파일을 만들지 않아서 Deploy가 실패했다.

appspec.yml은 CodeDeploy에서 배포 관리하는데 사용하는 파일이다.

이 파일에 정의된 일련의 수명 주기(lifecycle) 이벤트 후크로 각 배포를 관리하는데 사용된다.

AWS 공식문서 - CodeDeploy 애플리케이션 사양 (AppSpec) 파일 을 참고하면 좋다.

 

2. appspec.yml 생성

https://www.youtube.com/watch?v=Dofh_X0ta2g

위 규칙대로 정의를 하면 되고, 나는 크게 정의할 필요가 없기에 간단하게 적어본다.

 

스프링부트 프로젝트 최상단 appspec.yml

이렇게 생성 후 Github에 추가하면 자동으로 우리가 만들었던 CodePipeline이 작동한다.

그럼 Source -> Build -> Deploy 가 자동으로 실행하게 된다.

 

3. 성공

CodePipeline

나는 codepipeline의 source를 Github 개인 리포지토리로 연결했기에 수정된 사항을 main에 push하면 자동으로 파이프라인이 동작하게 되어 CI/CD가 자동화되는 것이다. 설정하는 단계에서는 복잡했지만 만들고나면 엄청나게 편하다는 것을 느끼게 된다.

 

4. Code Deploy에 대해서

AWS에서 제공하는 Code Deploy는 3가지 배포 방식을 제공한다.

  • EC2/온프레미스
  • Lambda
  • ECS

 

AWS CodeDeploy 라이프사이클과 'hooks' 섹션 에 나와있는 내용이지만 학습을 위해 간단하게 적어본다.

AppSpec 파일 'hooks' 섹션의 내용은 위에 적었던 3가지 배포 방식(컴퓨팅 플랫폼)에 따라 다르다.

EC2는 인 플레이스(in-place) 배포와 Blue/Green 배포를 선택할 수 있고,

Lambda와 ECS는 Blue/Green 배포만 가능하다.

 

나는 EC2를 사용했기에 간단하게 EC2의 Blue/Green(블루/그린) 배포 이벤트 후크를 설명해본다.

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/lifecycle-event-order-blue-green.png

 

좌측이 원본 인스턴스 환경이고, 우측이 새로 만들어지는 인스턴스이다.

 

배포 단계에서 `Start`, `DownloadBundle`, `Install`, `AllowTraffic` , `BlockTraffic` , `End` 처럼 다이어그램이 회색인 단계는 스크립팅(scripting)이 불가능하다. 하지만 appspec.yml의 'files' 섹션을 편집하여 `Install` 이벤트 중에 설치되는 항목을 지정할 수는 있다.

 

 

ApplicationStop

이 이벤트에 대한 스크립트를 지정하여 애플리케이션을 정상적으로 중지하거나 배포를 준비하기 위해 현재 설치된 패키지를 제거할 수 있음. (인스턴스에 처음 배포할 때는 동작하지 않음)

 

DownloadBundle

신규 생성된 파일(application revision files)을 임시 폴더(위치)로  다운로드

 

BeforeInstall

파일 암호 해독 및 현재 버전의 백업 생성 등의 사전 설치 작업하는 단계

 

Install

임시 폴더에서 최종 대상 폴더로 생성된 파일(revision files)을 복사함

 

AfterInstall

애플리케이션 구성 or 파일 권한 변경과 같은 작업하는 단계

 

ApplicationStart

ApplicationStop 중에 중지된 서비스를 다시 시작함

 

ValidateService

마지막 배포 수명 주기 이벤트로써, 배포가 성공적으로 완료되었는지 확인함

 

BeforeBlockTraffic

로드 밸런서에서 등록이 취소되기 전에 인스턴스에서 작업을 실행할 수 있음.

이 단계에서 실패한 배포의 문제를 해결하려면 실패한 ApplicationStop, BeforeBlockTraffic 또는 AfterBlockTraffic 배포 수명주기 이벤트 문제해결을 참조해야함.

 

BlockTraffic

인터넷 트래픽이 현재 트래픽을 서비스 중인 인스턴스에 액세스하지 못하도록 차단함.

 

AfterBlockTraffic

이 이벤트를 사용하여 해당 로드밸런서에서 인스턴스 등록이 취소된 후 작업을 실행할 수 있음

이 때 실패한 배포의 문제를 해결하려면 이 링크를 참조하면 됨.

 

BeforeAllowTraffic

로드밸런서에 등록되기 전에 인스턴스에서 작업을 실행할 수 있음

 

AllowTraffic

배포 후 인터넷 트래픽이 인스턴스에 액세스할 수 있도록 허용함

 

AfterAllowTraffic

로드 밸런서에 인스턴스가 등록된 후 인스턴스에서 작업을 실행할 수 있음