본문 바로가기
프로젝트/스프링 부트와 AWS로 혼자 구현하는 웹 서비스_실습

스프링부트와 AWS로 혼자 구현하는 웹 서비스 16_AWS

by dudung__ 2023. 8. 26.

08.ec2 서버에 프로젝트를 배포

 

08_01 ec2에 프로젝트 clone 받기 

=> 깃에서 클론을 받아오기 때문에, 블로그 초반에 하지 않았던 깃 공유를 해서 깃에 프로젝트를 올렸음
 
 
푸티로 접속해서 작업을 진행함
 
 
- git 다운 
$ sudo yum -y install git

 
- git 버전 확인 
$ git --version

 
- git clone으로 프로젝트를 저장할 디렉터리 생성
$ mkdir ~/app && mkdir ~/app/step1
$ ls -R ~/app

=> 디렉터리들이 잘 만들어 진것을 확인할 수 있음
 
~ 는 사용자 홈디렉터리를 의미함
cd ~ => 해당 사용자의 홈디렉터리로 이동 

 
 
- git 클론을 진행 
$ cd app/step1/
$ pwd

=> 만든 디렉터리로 이동해서 
 
 

git에서url을 복사해서 클론 작업을 진행해줌
 
 

=> 오타가 난건가해서 여러번 시도를 해봤는데, 계속 똑같은 오류가 보이길래 찾아봤더니 
 
 
2021.9월 이후에 비밀번호 대신에 개인  token으로 접속을 해야한다고 한다 
 
토큰을 만들러 가자
 
github 로그인 => 프로필 클릭 => setting => developer settings => persional access key => token
 

=> 이런 화면이 보이는데, generate 해주면 됨
 

=> 성공적으로 생성함(체크가 엄청 많을텐데, 블로그에서도 잘 모르겠으면 다 체크하라고 해서 일단 다 체크하고 만듬)
 

=> 토큰을 사용해서 로그인하니 잘 받아짐
 
 

=> 내용들이 잘 들어와있음
 
- 테스트 진행
 

 ./gradlew test
 
권한 오류가 떠서 sudo로 하면 될줄 알았더니 안됐다
책을 확인해보니 
실행 권한을 추가해주라해서, 추가해준후에 다시 test를 돌렸더니
 

==> 성공적으로 진행된것을 볼 수 있었음
 
 

08_02 배포 스크립트 만들기 

배포 => 작성한 코드를 실제 서버에 반영하는것
책에서 의미하는 배포
- git clone / git pull을 통해 새 버전의 프로젝트를 받음
- gradle  / maven 을 통해 프로젝트 테스트와 빌드
- EC2 서버에서 해당 프로젝트를 실행 / 재실행
 
쉘 스크립트를 작성하는 과정이다
국비 교육과정에서 쉘 스크립트를 짜는 법을 배워서 괜찮을것 같았다
애초에 vi(m)은 맨날 쓰는 중이기도 하고 ㅎㅎ
모른다고 해도 따라치기만 하면 되서 삽입i/a/o/O 키만 알고 있으면 크게 문제는 없을 것 같다 
i : 커서 왼쪽에 삽입(작성)
a : 커서 오른쪽에 삽입(작성) 
o : 커서 아래쪽에 줄 삽입 후 작성
O : 커서 위쪽에 줄 삽입 후 작성

 

 

- 쉘 스크립트 파일 생성 

$ sudo vi ~/app/step1/deploy.sh

 

==> 여기다가 작성


#!/bin/bash


REPOSITORY=/home/ec2-user/app/step1/springboot
PROJECT_NAME=springboot-webservice-dev

cd $REPOSITORY/$PROJECT_NAME/

echo "> Git Pull"
git pull


echo "> 프로젝트 Build 시작"
./gradlew build

echo "> step1 디렉토리로 이동"
cd $REPOSITOYRY


echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)



echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
        echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
        echo "> kill -15 $CURRENT_PID"
        kill -15 $CURRENT_PID
        sleep 5
fi


echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -t $REPOSITORY/ | grep jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &


- 생성한 스크립트에 실행 권한 추가 

chomd +x ./deloy.sh

$ ll
total 4
-rwxr-xr-x 1 ec2-user ec2-user 753 Aug 24 10:26 deploy.sh
drwxrwxr-x 4 ec2-user ec2-user  51 Aug 23 17:28 springboot

 

-스크립트 실행

$ ./deploy.sh

 

=> 빌드가 성공했다고 뜨지만, jar name에는 아무것도없고 마지막 저렇게 뜬 후에 무한 로딩 중이다

홈디에 생성되는 nohup.out에 모든 에러 정보가 나와있다고해서, 그걸 보고 JAR Name이 안뜨는 이유를 봤더니

=> 환경변수에 오타가 있는걸 발견하고 다시 돌림

 

=> 이름이 잘 뜸 => 하지만 

??? 

==> 구글링해봄

 


**

springiboto 2.5.0이상 버전 부터 gradle로 빌드할 때 jar 파일이 두개가 생성되는데 

=> 얘네 둘이다 기본.jar 파일 / plain.jar파일


1. 앱이름.jar  -> bootJar Task로 생성된것
2. 앱이름-plain.jar -> build Task로 생성된것

 

첫번째 jar는 해당 프로젝트에 필요한 모든 의존성이 같이 추가된것으로 MANIFEST.MF까지 모두 정상적인 형태로 나온다.

하지만, plain.jar는 의존성을 제외하고 딱 프로젝트에 있는 자원들만 jar로 만든것으로 spring 관련 의존성이 빠져 MANIFEST.MF에 Main메소드의 위치가 나오지 않는다.


==> 라는 정보를 발견함

 

그래서 책에 나온대로 스크립트문 속의 명령문을 직접 써봄 

=> 출력되는 순서가 다른것을 볼 수 있음

 

 

ls -tr

-r : 순서를 거꾸로 출력함

 

tail : 끝에서 (숫자)만큼 출력함 

 

grep  ~ : ~를 포함하고 있는 것만 출력

 

책에서 쓰인 명령어가

=> springboot라는 디렉터리 -> jar을 포함하는 것만 -> 거꾸로 출력 -> 끝에서 1개 

라는 뜻인데, 책에서 나온대로 치면 plain즉 의존성이 포함되지 않은 파일을 출력하게 됨 

 

사용하는 버전이 바뀌면서,생성되는 파일의 개수 달라져서 기본에 써놓았던 방법이 정상작동 되지 않은것이였음

그래서 쉘 스크립트를 짤때 r을 제외하고, 끝에 .jar기본 파일이 위치할 수 있게 함

=> 책에 있는것처럼 화면이 나옴 

 

 => 잘 도는듯 보이지만,

=> 실은 실패한 

==> 다음 글에서 마저 다뤄보기로함 

 

 

 

 

 

 

 

 

*********

+.+ 호스트 명 바꾸기(다시 시도)

 

1. => 책에 나온 방법 
$ sudo vi /etc/sysconfig/network

 

=> 여기서 부터 아마존 공식 문서에 나온 방법들 

 

2.

$ sudo vi /etc/hosts

 

3.
$ sudo vi /etc/cloud/cloud.cfg

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/set-hostname.html

 

Amazon Linux 인스턴스에서 호스트 이름 변경 - Amazon Elastic Compute Cloud

Amazon Linux 인스턴스에서 호스트 이름 변경 프라이빗 VPC에서 인스턴스를 시작하는 경우 Amazon EC2에서 게스트 OS 호스트 이름을 할당합니다. Amazon EC2에서 할당하는 호스트 이름의 유형은 서브넷 설

docs.aws.amazon.com

===========> 여기까지 했을때는 적용이 안됐는데 

 

4.

$ sudo hostnamectl set-hostname springboot.webserver

 

=> 이 명령어를 쓰니까 성공적으로 잘 적용된것을 볼 수 있었음