개요
AWS의 EC2 환경에서 자바 환경설정 및 jar 빌드 및 배포까지
한 번에 아우르는 쉘 스크립트를 작성해보자.
스크립트 작성
1. deploy.sh
#!/bin/bash
# 1. source env variable
source "$(find . -name 'var.sh' 2>/dev/null)"
echo "1. env variable setting complete"
# 2. cron delete
touch cron_delete
crontab cron_delete
rm -rf cron_delete
echo "2. cron delete complete"
# 3. server checking
if [[ -n "${PROJECT_PID}" ]]
then
# 프로젝트가 동작하고 있는 경우 프로세스 KILL
echo "3. project kill complete (${PROJECT_PID})"
kill -KILL "${PROJECT_PID}"
else
# 최초 배포
# 3-1 apt update
sudo apt-get update 1>/dev/null
echo "3-1 apt update complete"
# 3-2 jdk install
sudo apt-get install -y openjdk-11-jdk 1>/dev/null
echo "3-2 jdk install complete"
# 3-3 timezone setting
sudo timedatectl set-timezone $(timedatectl list-timezones | grep -i 'seoul')
echo "3-3 timezone setting complete"
fi
# 4. project folder delete
rm -rf "${HOME}/${PROJECT_NAME}"
echo "4. project folder delete complete"
# 5. git clone
git clone https://github.com/${GITHUB_ID}/${PROJECT_NAME}.git
sleep 5
echo "5. git clone complete [${PROJECT_NAME}.git]"
# 6. gradlew +x
chmod u+x "${HOME}/${PROJECT_NAME}/gradlew"
echo "6. gradlew u+x complete"
# 7. project build
cd "${HOME}/${PROJECT_NAME}"
bash gradlew build
echo "7. gradlew build complete"
# 8. start jar
if [[ ! -d "${LOG_PATH}" ]]
then
mkdir "${LOG_PATH}"
fi
nohup java -jar "${JAR_PATH}" 1>"${LOG_PATH}/log.out" 2>"${LOG_PATH}/err.out" &
echo "8. start server complete"
# 9. Check Web Page
STATUS=$(curl -s -o /dev/null -w "%{http_code}" ${SERVER_IP})
if [[ ! "${STATUS}" -eq 200 ]]
then
echo -e "\n================== WARNING =================="
echo "page status code is not 200"
echo -e "================== ==================\n"
fi
echo "9. web page check complete"
# 10. cron registration
touch "${HOME}/crontab_new"
echo "* * * * * ${HOME}/check-and-restart.sh" 1>${HOME}/crontab_new
crontab "${HOME}/crontab_new"
rm -rf "${HOME}/crontab_new"
echo "10. cron registration complete"
2. var.sh
#!/bin/bash
GITHUB_ID="codingspecialist"
PROJECT_NAME="aws-test"
PROJECT_VERSION="demo-0.0.1-SNAPSHOT"
JAR_FILE="${PROJECT_VERSION}.jar"
PROJECT_PID="$(pgrep -f ${JAR_FILE})"
JAR_PATH="${HOME}/${PROJECT_NAME}/build/libs/${JAR_FILE}"
LOG_PATH="${HOME}/server_log"
SERVER_IP="http://13.125.254.51:8080/"
export GITHUB_ID
export PROJECT_NAME
export PROJECT_VERSION
export JAR_FILE
export PROJECT_PID
export SERVER_IP
3. check-and-restart.sh
#!/bin/bash
source "${HOME}/var.sh"
if [[ ! -n "${PROJECT_PID}" ]]
then
nohup java -jar "${JAR_PATH}" 1>"${HOME}/server_log/log.out" 2>"${HOME}/server_log/err.out" &
fi
cron 등록하기
- cron 등록 스크립트를
deploy.sh
파일에 추가하자.
1. deploy.sh
# 1. env variable setting
..
# 2. cron delete
..
# 3. server checking
..
# 4. project folder delete
..
# 5. git clone
..
# 6. gradlew +x
..
# 7. build
..
# 8. start jar
..
# 9. cron registration
touch "${HOME}/crontab_new"
echo "* * * * * ${HOME}/check-and-restart.sh" 1>"${HOME}/crontab_new"
crontab "${HOME}/crontab_new"
rm -rf "${HOME}/crontab_new"
echo "9. cron registration complete"
2. check-and-restart.sh
var.sh
에서 선언한 환경 변수가 필요하므로 source를 통하여 가져오기
check-and-restart.sh
#!/bin/bash
source "${HOME}/var.sh"
if [[ ! -n "${PROJECT_PID}" ]]
then
nohup java -jar -Dspring.profiles.active=prod "${JAR_PATH}" 1>"${HOME}/server_log/log.out" 2>"${HOME}/server_log/err.log" &
fi
EC2에 배포하기
위 빌드 스크립트를 압축한 후 깃허브 레포지토리에 업로드 -> EC2 가상 머신에서 git pull -> 스크립트 실행 -> 자동 배포 끗!
1. build 스크립트 압축
- 새로운 EC2 환경에서 해당 스크립트 파일들을 압축 푼 후 바로 빌드가 가능할 수 있도록 이전에 작성해둔 스크립트 파일들을
tar
명령어를 이용하여 압축
tar -c
: 압축 생성tar -v
: 압축 로그 화면에 출력tar -f {압축파일명}
: 압축 파일 이름 지정tar -x
: 압축 해제
tar 테스트용 파일 생성
mkdir tar_test
touch a.txt; touch b.txt
파일 압축
tar -cvf test_tar.tar a.txt b.txt
파일 압축해제
tar -xvf test_tar.tar
빌드 스크립트 압축하기
tar -cvf deploy.tar check-and-restart.sh deploy.sh var.sh
2. 새로운 EC2 생성
aws-v2-last
- 인스턴스 유형
t2.micro
선택
- 키페어
- 기존 키 페어 선택
awslearner_keypar
- 기존 키 페어 선택
- 네트워크 설정
- 기존 네트워크 보안 그룹 선택
launch-wizard-1
- 기존 네트워크 보안 그룹 선택
- 보안 그룹에
8080
포트 허용
3. deploy.tar 압축 해제
- 위에서 생성한 머신으로 SSH 접속
- 내 프라이빗 레포에 있는 aws-v2 프로젝트 clone
- deploy.tar 압축 해제
프로젝트 clone
git clone https://github.com/JaehyoJJAng/AWS-Deploy-EasyupClass.git
파일 압축해제
tar -xvf deploy.tar
스크립트에 실행 권한 부여
chmod 700 deploy.sh check-and-restart.sh
4. 프로젝트 빌드
- 위에서 압축 푼
deploy.sh
실행 - 에러 없이 정상적으로 build 되는지 확인
bash ./deploy.sh
1. env variable setting complete
2. cron delete complete
3. project kill complete (6456)
Cloning into 'aws-v2'...
remote: Enumerating objects: 37, done.
remote: Counting objects: 100% (37/37), done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 37 (delta 4), reused 35 (delta 2), pack-reused 0
Unpacking objects: 100% (37/37), 61.46 KiB | 5.12 MiB/s, done.
5. git clone complete
6. gradlew u+x complete
BUILD SUCCESSFUL in 15s
6 actionable tasks: 6 executed
7. gradlew build complete
8. start server complete
9. cron registration complete
실행 확인
$ netstat -nltp | grep "java"
tcp6 0 0 :::8080 :::* LISTEN 21532/java
tcp6 0 0 127.0.0.1:43947 :::* LISTEN 21127/java
정상적으로 서비스 되고 있음!..