AWS EC2 user data + docker compose로 서버 start시마다 앱 자동배포 해보기

Jung Wish·2024년 3월 23일
0

오늘의_코딩

목록 보기
10/11

요즘 AWS DVA-C02 공인 시험을 치르기 위해서 AWS 공부를 하는 동시에 이제 실질적인 경험을 쌓기 위해 틈나는대로 바로 활용가능한 내용을 적용해보는 중이다.

그중에서 EC2 user data(사용자 데이터)를 통해 EC2가 부팅될때마다 특정 스크립트가 실행하는 기능을 활용해 dev용으로 사용하고 있는 API를 자동으로 배포해보도록 하겠다.

TL;DR

  • EC2 사용자 데이터는 EC2를 생성할 때부터 만들 수 있다.
  • EC2 인스턴스의 사용자 스크립트 수정은 인스턴스가 중지된 상태에서 가능하다.
  • EC2 사용자 데이터에 작성된 스크립트는 root 권한으로 실행된다.
  • 사용자 데이터와 docker compose를 활용해 매번 EC2 접속할때마다 배포해주는 번거로움을 줄일 수 있고/해당 설정을 재활용 할 수 있기 때문에 초기 Install 할 앱들과 설정등을 설정해두면 유용하다.
    • 사용자 데이터에 docker, docker-compose, 배포할 내용등을 사전에 다운로드 받고 설정할 수 있게 해두면, 나머지 자동실행은 docker compose에서 알아서 해준다!

일단, 먼저 기존 EC2에 docker로 띄워놓은 dev 서버를 확인해보면 다음과 같이 3개의 container가 실행된다.

나는 사전에 docker-compose.prod.yaml 파일을 작성해두었기 때문에 스크립트를 다소 간편?하게 다음과 같이 /home/ubuntu 위치에 start-script.sh를 작성해주었다. 사실 이 부분을 그냥 사용자 데이터에 그대로 넣어도 된다. 다만 cd 파트는 /home/ubuntu/{docker compose 파일이 위치한 경로}로 바꾸어주면 된다.

그리고 나서 인스턴스를 중지하고

사용자 데이터 편집을 눌러

  • 사용자 데이터에 방금 만들었던 shell script 파일을 실행할 수 있도록 편집해주었다.

그런데 3개의 컨테이너가 실행되어야 하는데 1개만 시작되고 있었다.(미처 캡쳐하진 못했습니다..) 뭘까? 싶어서 일단 로그를 보기로 헀다.

docker compose log containerID 로 실행되지 않은 나머지 두 개의 컨테이너의 로그를 살펴봤는데 놀랍게도 오류가 없었다. 그런데 왜 exit이 되는것인지 궁금해서 시작되었던 1개의 container 설정과 다른 container 들의 설정을 비교해봤는데 restart: always 속성이 눈에 띄었다.

그리고 나머지 두 컨테이너에도 docker daemon이 시작될때마다 container가 실행될 수 있게 옵션을 주었더니! 의도한대로 잘 배포가 된 것을 확인할 수 있었다!

그래서 왜 그런것인가에 대해 생각해봤는데, 생각해보면 당연하다. 컴퓨터를 종료하면 모든 실행되고있는 앱들이 종료될 것이고 여기에는 docker daemon도 포함된다.

사실 그래서 내가 작성한 스크립트는 사실 크게 영향이 없었을게(으악!) docker compose up -d 자체는 실행이 되었겠지만(sudo systemctl enable docker 영향) -> 도커 데몬이 실질적으로 실행되기 전이라 컨테이너가 유지 되지 않고 종료되었을 것이다. (부팅 로그 분석을 해보고 싶었는데 결국 해당 내용을 못찾았다...그래서 이 부분은 뇌피셜 및 내 생각이다.)

docker를 설치할때부터 아마 daemon이 자동 실행되게끔 설정을 해준거 같은데 ec2가 부팅될때마다 docker가 실행되었기 때문에 기존에 종료되었던 restart 설정이 always인 container가 자동으로 다시 시작된것이다.

그러니까 사실 사용자 데이터에는 docker install/daemon을 실행해주는 코드/system start up시 사용 가능하게 해주는 코드가 필요한 것이고 -> 이후 배포 코드 및 docker-compose.yaml file을 다운로드 및 실행 해주는 코드를 작성하는 것이 바람직하다. -> 다시 말해 초기 설정을 하는 부분만 유의미할 것 같다는 것이 나의 결론이다.

실질적으로 자동 컨테이너 실행을 가능하게 해주는 것은 docker compose이며 docker-compose.yml에 restart:"always" 옵션을 주고, docker compose up -d 를 한번만 돌려도 알아서 docker가 실행될때마다 컨테이너를 자동으로 실행해준다.

profile
Frontend Developer, 올라운더가 되고싶은 잡부 개발자, ISTP, 겉촉속바 인간, 블로그 주제 찾아다니는 사람

0개의 댓글