EC2에서 CodeDeploy를 이용했을 때 appspec.yml
에 대해 자세히 알아보지 않고 사용하다가
해당 글과 같이 나중에 에러 처리하는 데 애를 먹어 다시 한 번 정리 해보려고 합니다.
appspec.yml
파일은 CodeDeploy에서 배포를 관리하는 데 사용하는 YAML 형식 또는 JSON 형식의 파일입니다.appspec.yml
파일은 파일에 정의된 일련의 수명 주기 이벤트 후크로 각 배포를 관리하는 데 사용됩니다.# appspec.yml 예제
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/example
permissions:
- object: /home/ubuntu/example
owner: example
group: ubuntu
hooks:
ApplicationStop:
- location: scripts/stop.sh
runas: root
AfterInstall:
- location: scripts/initialize.sh
runas: root
ApplicationStart:
- location: scripts/start.sh
runas: root
EC2/온프레미스
기준으로 files
, permissions
, hooks
영역으로 나뉘는데 이를 섹션
이라 부릅니다.
CodeDeploy를 이용한 배포에는 인 플레이스(in-place) 배포
와 로드 밸런서를 활용하는블루-그린
배포로 나뉘어지는데 이번 작업은 인 플레이스(in-place) 배포
기준으로 설명하고자 합니다.
이벤트 후크
를 통해 배포 수명 주기에 따라 실행할 하나 이상의 스크립트를 지정해 줄 수 있으며
배포 주기에 따른 실행 순서는 아래와 같습니다.
위 그림에서의 Start
, DownloadBundle
, Install
, End
는 스크립트 실행되는 구간에서 제외 되기에 회색으로 처리 되었습니다.
이벤트 목록
ApplicationStop
: 이 배포 수명 주기 이벤트는 애플리케이션 수정이 다운로드되기 전에도 발생합니다. 이 이벤트에 대해서는 애플리케이션을 안전하게 종료하거나 배포 준비 중에 현재 설치된 패키지를 제거하도록 스크립트를 지정할 수 있습니다. 이 배포 수명 주기 이벤트에 사용되는 AppSpec 파일 및 스크립트는 이전에 성공적으로 배포된 애플리케이션 수정에서 가져옵니다.참고: AppSpec 파일은 인스턴스에 배포하기 전에는 인스턴스에 존재하지 않습니다. 이러한 이유로, 인스턴스에 처음으로 배포할 때는 ApplicationStop 후크가 실행되지 않습니다. 인스턴스에 두 번째로 배포할 때는 ApplicationStop 후크를 사용할 수 있습니다.
DownloadBundle
– 이 배포 수명 주기 이벤트 중 에이전트는 애플리케이션 수정 파일을 다음 임시 위치로 복사합니다.
BeforeInstall
- 파일 암호화 해제 및 현재 버전의 백업 만들기와 같은 사전 설치 작업에 이 배포 수명 주기 이벤트를 사용할 수 있습니다.
Install
- 이 배포 수명 주기 이벤트 중에 CodeDeploy 에이전트는 수정 파일을 임시 위치에서 최종 대상 폴더로 복사합니다.
AfterInstall
- 애플리케이션 구성 또는 파일 권한 변경과 같은 작업에 이 배포 수명 주기 이벤트를 사용할 수 있습니다.
ApplicationStart
- 해당 이벤트 실행 중에 중지된 서비스를 다시 시작하려면 일반적으로 ApplicationStop
이벤트를 사용합니다.
ValidateService
– 마지막 배포 수명 주기 이벤트입니다. 배포가 성공적으로 완료되었는지 확인하는 데 사용됩니다.
이 외에 생략된 로드 밸런서
관련한 이벤트 후크 등은 공식 문서에 자세히 나와있으니 참조하시기 바랍니다.
# files 예시
files:
- source: /
destination: /home/ubuntu/
overwrite: yes
source
: 인스턴스에 복사할 수정된 파일 또는 디렉터리를 시겹ㄹ합니다.
- 해당 경로는 appspec.yml 파일 기준 상대경로
입니다.
destination
: 인스턴스에서 파일이 복사되어야 하는 위치를 식별합니다.
overwrite
: 선택 값으로, 동일한 파일이 있을 경우 덮어쓰기 여부를 작성합니다.
permissions
permissions
섹션은 files
섹션에서 정의한 파일이 인스턴스에 복사된 후 해당 파일에 권한이 어떻게 적용되어야 하는 지를 지정합니다.
permissions
는 EC2/온프레미스에만 사용되므로 AWS Lamda/ECS 배포는 resources 섹션 을 참조할 수 있습니다.
permissions:
- object: /home/ubuntu/
owner: bvoat
group: ubuntu
...
object(필수)
- 문자열을 사용하여 대상을 지정합니다.
pattern(선택)
- 권한을 적용할 패턴을 지정합니다.
- 따옴표("")가 있는 문자열을 사용하여 pattern을 지정합니다.
- 지정하지 않거나 특수 문자"**"
를 사용하여 지정하면 권한이 type에 따라 일치하는 모든 파일에 적용됩니다.
owner(선택)
- object의 소유자 이름입니다.
- 문자열을 사용하여 owner를 지정합니다.
- 지정하지 않으면 원본 파일에 적용된 기존의 모든 소유자가 복사 작업 후에도 아무것도 변경되지 않습니다.
group(선택)
- object의 그룹 이름입니다.
- 문자열을 사용하여 group을 지정합니다.
- 지정하지 않으면 원본 파일에 적용된 기존의 모든 소유자가 복사 작업 후에도 아무것도 변경되지 않습니다.
hooks
hooks:
deployment-lifecycle-event-name:
- location: script-location
timeout: timeout-in-seconds
runas: user-name
deployment-lifecycle-event-name(필수)
:location(필수)
/home/ubuntu
디렉토리에 해당합니다.timeout(선택)
runas(선택)
sudo service codedeploy-agent status
로 확인 가능하며root
입니다.