Codepipeline(CodeDeploy) 구축 시, Codecommit(Github)에 start.sh, stop.sh를 두었다.
# 파일구조
java
ㄴ application.java
ㄴ ...
scripts
ㄴ start.sh
ㄴ stop.sh
appspec.yml
# appspec.yml
version: 0.0
os: linux
files:
- source: /
destination: /data/api
overwrite: yes
file_exists_behavior: OVERWRITE
hooks:
ApplicationStop:
- location: ./scripts/stop.sh
timeout: 180
runas: root
ApplicationStart:
- location: ./scripts/start.sh
timeout: 180
runas: root
이렇게 스크립트를 구축하고, CodeDeploy를 최초에 돌렸을 때 성공하였다. 하지만, 이후에 Stop.sh 스크립트를 변경하면, 변경된대로 실행이 되지않고 지속적으로 오류가 발생하였다. 아래 사진과 같은 오류가 지속적으로 발생했다.
https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html
위 가이드의 ApplicationStop 부분을 보면 오류가 발생한 이유를 알 수 있다. 관련하여 아래와 같이 서술되어 있다.
- 이 배포 수명 주기 이벤트는 애플리케이션 수정이 다운로드되기 전에도 발생합니다. 이 이벤트에 대해서는 애플리케이션을 안전하게 종료하거나 배포 준비 중에 현재 설치된 패키지를 제거하도록 스크립트를 지정할 수 있습니다. 이 배포 수명 주기 이벤트에 사용된 AppSpec 파일 및 스크립트는 이전에 성공적으로 배포된 애플리케이션 수정 버전에서 가져온 것입니다.
- 마지막으로 성공적으로 배포된 애플리케이션 수정 버전의 위치를 확인하기 위해 CodeDeploy 에이전트는 deployment-group-id_last_successful_install 파일에 나열된 위치를 조회합니다. 이 파일의 위치는 다음과 같습니다.
- Amazon Linux, Ubuntu Server 및 RHEL Amazon EC2의 /opt/codedeploy-agent/deployment-root/deployment-instructions 폴더
- Windows Server Amazon EC2 인스턴스에 대한 C:\ProgramData\Amazon\CodeDeploy\deployment-instructions 폴더.
결론적으로 이야기 하자면, ApplicationStop 부분은 애플리케이션 수정이 다운로드 되기 전에 발생한다. 따라서 이전에 최초로 성공했었던 ApplicationStop Script를 실행하게 된다.
그래서 지속적으로 codecommit (github)와 같은 코드저장소에서 application stop script를 변경하더라도 적용이 되지 않았다.
배포될 서버의 /opt/codedeploy-agent/deployment-root/deployment-instructions 부분에 성공했던 codedeploy id를 삭제한 후, 다시 배포를 진행한다.
아예 영향을 받지 않는 위치에 script 파일을 둬서, 수정하도록 한다.
/opt/codedeploy-agent/deployment-root/scripts 라는 디렉토리를 만들고, stop.sh와 start.sh를 두고, 스크립트를 변경하고 싶은 경우, stop.sh 파일을 서버에 들어가 수동으로 변경한다.
또한 appspec.yml 파일을 아래와 같이 설정하여
hooks:
ApplicationStop:
- location: ../../../scripts/stop.sh
timeout: 180
runas: root
혹시라도 1번 방식을 채택하였는데 이전의 성공했던 codedeploy id를 재사용할 상황이 생길수도 있을것이라고 판단하였기에, 필자의 경우는 2번 방식을 사용하였다.