✔️ EC2 Ubuntu 20.04 LTS
local에서 만든 프로젝트를 가상 서버에 배포하기 위해 ec2 환경을 생성했다.
다만, 매번 배포 파일을 만들기 위해 xxx.jar 파일을 만들어야 했다.
=> 이를 위해 CI/CD Jenkins 환경을 구축하게 되었다.
Freestyle project, Pipeline 등 아이템을 여러 번 새로 만들어 봤지만 빌드 실행할 때 공통적으로 문제가 발생한 곳이 있다. (build 실행을 70번 정도 한 것 같다.)
./gradlew build
or ./gradlew clean bootJar
./gradlew
: 새로운 환경에서 프로젝트를 설정할 때 java나 gradle을 설치하지 않고 바로 빌드할 수 있게 해주는 역할을 한다.
이 명령어가 실행되는 순간 서버가 터지는 (멈추는 상황이 발생했다.) 😅
아니 도대체 무엇이 문제인거지?
혹시 aws ec2 프리티어 이기 때문에 무엇인가 문제가 있는 걸까? 라고 구글링을 하던 순간
를 읽게 되었다. (https://okky.kr/articles/884329)
나와 같이, github 웹 훅과 Jenkins를 이용하여 CI/CD 구축을 성공적으로 마치고 jar를 실행하면 EC2 서버가 먹통이 되어버린 상황이였다.
그리고.... (키보드 입력도 안먹히고 외부접속도 안된다. 강제종료 - 재시작밖에 할 수 없는 상황이었다.)
라고 하시는데 나도 몇 일동안 계속 이런 상황을 만났었다. 😱
Jenkins Build에서 java -jar
명령어 입력시 EC2가 정지되어 배포가 되지 않는 문제!!!!
AWS EC2 재부팅하면 EC2는 정상화되지만, jar 재실행시 계속 멈추는 상황
Jenkins에서 배포 자동화를 시도할 때만 EC2가 멈추는 문제가 발생!
직접 ubuntu 터미널에 접속해서 쉘 스크립트를 동작시키면 정상 배포가 완료된다.
✔️ 현재 새로운 환경 jenkins에서 jar 재실행하다 발생한 오류 화면
왜 안될까? 아니 구글링해보니 프리 티어 메모리가 1GB였다...
리눅스에서 메모리 상태 확인하는 명령어 : free -h
아 그렇구나, 이 상태에서 Jenkins 환경에서 스프링 부트를 띄우니 ec2가 멈춘 것이다.
메모리를 늘리거나, 젠킨스와 스프링 부트를 분리시켜야 한다. (Docker를 이용하면 될 것 같다.)
또 다른 방법으로, 리눅스는 하드디스크를 가상 메모리로 전환시켜 사용할 수 있다고 한다. (스와핑, Swapping)
✔️ AWS에서 메모리의 양에 따라 스왑 메모리 크기를 권장한다.
물리적 RAM의 양 | 권장 스왑 공간 |
---|---|
RAM 2GB 이하 | RAM 용량의 2배(최소 32MB) |
RAM 2GB 초과, 32GB 미만 | 4GB + (RAM - 2GB) |
RAM 32GB 이상 | RAM 용량의 1배 |
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16
권장사항에 의하면 스왑 공간 크기는 RAM 용량의 2배를 권장했으므로
2GB 증설시켜야 한다. (128MB x 16 = 2.048MB)
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo swapon -s
$ sudo vi /etc/fstab
/etc/fstab
파일을 편집하여 부팅 시 스왑 파일을 활성화
/swapfile swap swap defaults 0 0
$ free -h
이전 memory 1gb일 때는 3시간 정도 기다렸는데, 오류가 발생함
이제는 2분안에 성공한 결과를 볼 수 있다.
참고
1기가에 젠킨스면 헤비하네요 ㅎㄷㄷ