들어가기 전에..
배포를 하는 중에 워낙 여러 번 막히기도 했고, 그 과정이 모두 기억나지 않는다.
이 글을 쓰는 이유는 순전히 기록용이다.
중간중간에 빠지는 내용도 많을 것이고, 틀린 부분도 많을 것이니 양해 부탁드립니다...
갑자기 배포를 하게 된 이유
팀 프로젝트 USports를 진행 중이다. 프런트엔드 2명과 백엔드 3명이서 진행하는 6주짜리 협업 프로젝트이다.
1주 차는 기획을 했고, 2~4주 차는 개발, 5주 차부터 리팩터링과 오류수정, 프런트-백엔드 통합, 배포 등의 과정이 예정되어 있었다. 그런데 갑자기 배포를 해야만 했다..
기획 과정에서 API 명세서를 만들었다. 그러나 개발하는 도중에 Request, Response가 많이 변경되기도 했고, 현재 API 명세서는 백엔드 개발 상황과 조금씩 차이가 있게 되었다. 이제는 프런트엔드에서도 정확한 API 명세가 필요한 시점이었고, 그 방법으로 개발 서버를 임시로 배포해서 Swagger-ui를 사용할 수 있게 하는 것이 있었다.
실제로 이 방법이 가장 빠른 길인 것 같아서 정말 swagger만 사용할 수 있도록 배포를 시도해 보게 되었다.
AWS EC2
우선 시작은 AWS에서 EC2 인스턴스를 만드는 것이다.
전에 어떤 강의를 따라서 한번 해봤지만, 이 부분도 쉽지는 않았다.
아래 글을 참고해서 인스턴스를 만드는 것까지는 잘 진행했다.
https://velog.io/@jonghyun3668/SpringBoot-%ED%94%84% EB% A1% 9C% EC% A0% 9D% ED% 8A% B8-EC2-%EB% B0% B0% ED% 8F% AC% ED%95%98% EA% B8% B0#3-1-%EA% B9%83-%EC%84% A4% EC% B9%98% ED%95%98% EA% B8% B0
ubuntu console 접속하기
ubuntu console은 Putty를 이용했다.
PuTTY 다운로드
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
putty 윈도우 64비트 installer를 다운로드하고
putty generator를 다운로드하였다.
PuTTY Key Generate
aws로부터 받은 sshKey를 생성하고 다운받은 .pem 파일을 이용해 SSH Key를 생성한다.
Import key -> aws에서 받은 .pem 파일 선택 -> Save private Key
파일을 선택하면 아래와 같이 되는데, 꼭 Save private key로 key를 생성한다.
여기서 .ppk 파일이 생성된다.
PuTTY 실행
- 우선 위의 HostName(or Ip address)에 aws로부터 받은 Elastic IP를 넣는다.
- 좌측에 Connection -> SSH -> Auth -> Credentials -> Private key file for authentication에 위에서 받은 .ppk 파일을 업로드한다.
- Save 하면 위와 같이 MyWebServerHsryu를 저장할 수 있고, 이후부터는 해당 부분을 클릭 -> Load -> Open을 통해 ubuntu console을 열 수 있다.
기본 user는 "ubuntu" 이다.
login as : ubuntu 라고 입력하면 로그인할 수 있다.
Java 설치
Java 설치 전에 apt를 먼저 업데이트해 준다.
sudo apt-get update
Java를 설치하고 버전을 확인한다.
sudo apt-get install openjdk-11-jdk
java -version
.
Git 설치
우선 깃을 설치해 주고
sudo apt-get install git
잘 설치되었는지 확인하기 위해 버전을 확인해 준다.
git --version
깃허브에서 SSH key를 생성한다.
cd ~/.ssh
ssh-keygen -t rsa -C {github 계정 이메일}
위와 같이 id_rsa, id_rsa.pub 가 생성되고,
cat id_rsa.pub
위의 명령어로 key를 확인 후 복사하여
github -> settings -> SSH and GPG keys로 이동하여 New SSH key로 에 해당 값을 붙여 넣기 하여 SSH Key를 생성해 준다.
위의 Key 칸에 붙여 넣기 하면 된다.
이다음에, git clone을 통해 배포하고자 하는 Repository를 ubuntu로 불러오면 된다.
그런데, 그전에 이번 프로젝트는 docker에서 redis, mariaDB를 사용하고, docker-compose.yml로 자동으로 docker image를 생성한다.
그래서 Docker를 먼저 설치해야 한다.
맨 처음에 이 부분을 안 해서 Springboot를 띄우는데 에러가 발생했다.
로컬에서도 Docker가 안 띄워져 있으면 같은 오류가 발생하기 때문에 docker를 설치하고 docker-compose.yml 파일을 실행시켜 이미지를 생성해야 한다.
Docker 설치
1. ubuntu 시스템 패키지 업데이트
sudo apt-get update
2. 필요한 패키지 설치
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
3. Docker 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4. Docker 공식 apt 저장소 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
5. 시스템 패키지 업데이트
sudo apt-get update
6. Docker 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io
7. Docker 실행 상태 확인
sudo systemctl status docker
CentOS docker 설치
AWS EC2 t2.micro 서버가 너무 작아서 문제가 발생해서 Jenkins 서버를 임시로 이용해 보기로 했다.
Jenkins 서버를 이용할 목적으로 ncloud에서 생성한 CentOS 7.8 운영체제에서 docker를 설치하는 방법 링크이다.
https://1mini2.tistory.com/21
docker-compose 설치
1. docker-compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2. 권한 부여
sudo chmod +x /usr/local/bin/docker-compose
3. 심볼릭 링크 설정
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
4. docker-compose 버전 확인 (성공)
docker-compose --version
docker-compose.yml 파일 실행
docker-compose -f docker-compose.yml up -d
실행 중인 이미지 확인
#실행중인 컨테이너 목록
docker ps
#도커 이미지 목록
docker images
Git clone
위에서 ubuntu에 git을 설치했었다.
git clone {projectUrl}
{projectName} 부분에 아래의 Url을 복사해서 넣으면 clone 되어 USports_BE 폴더가 생성된다.
위와 같이 clone이 성공한 것을 볼 수 있다.
build 폴더는 원래는 존재하지 않고, gradlew를 이용하여 빌드를 해야 생긴다.
build 하기 전에, 아래 명령어를 이용해 gradlew 빌드 권한을 부여한다.
chmod +x gradlew
Build
프로젝트 폴더 내에서 아래 명령어를 입력한다.
./gradlew build
Build 하면 USports_BE/build/libs에 아래와 같이 두 개의 파일이 생긴다.
sudo java -jar USports-0.0.1-SNAPSHOT.jar
해당 폴더에서 위의 명령어를 실행하면 Spring Boot Project가 실행된다.
백그라운드에서 실행
sudo nohup java -jar USports-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 &
위의 명령어를 이용하면 백그라운드에서 실행된다.
> /dev/null 은 log를 기록하지 않는다는 뜻이라고 한다.
(추가) /dev/null은 리눅스에서 특수한 파일로 모든 데이터를 버릴 때 이용된다. 즉, 출력을 무시하고자 할 때 사용한다고 한다.
백그라운드에서 실행 중지
pid를 찾아서 kill pid로 중지할 수 있다.
ps -ef | grep USports... //-> PID 찾기
sudo kill -9 {PID} // -> 멈추기
Spring Boot 실행
아래와 같이 ubuntu 서버에서 Spring Boot가 실행된다.
서버 접속
EC2 인스턴스의 퍼블릭 IPv4 DNS에 :8080을 붙여서 접속가능하다.
정상적으로 접속이 되었다면 index 페이지로 이동하거나 아래와 같이 화이트라벨 에러페이지가 뜰 것이다.
Swagger-ui
이제 아래와 같이 Swagger-ui를 이용할 수 있다.
'DevOps > Deploy' 카테고리의 다른 글
[Linux / 배포] 배포 시 사용하는 Shell Script (저장용) (0) | 2024.01.28 |
---|---|
[Linux / ubuntu] AWS Ubuntu 20.04에 swap 메모리 설정하기, Freetier 메모리 부족 현상 해결 (0) | 2024.01.28 |
[Spring / S3] SpringBoot 프로젝트 - S3 이미지 업로드 (4) | 2024.01.21 |
[AWS/S3] Spring boot project 이미지 업로드를 위해 S3 버켓 만들기 (0) | 2024.01.21 |
[AWS/트러블슈팅] EC2 서버 느려짐 문제 (0) | 2023.12.22 |