(EC2)Spring수동배포
SpringBoot 프로젝트 수동으로 EC2에 배포하기
EC2 인스턴스 생성(프리티어 기준)
키페어 생성
- 기존 사용하는 키페어가 없다면, 새로 키페어를 생성
- 키페어가 유출되면 정말 큰일이 날 수 있으므로, 관리를 철저하게 해야한다.
네트워크 설정
- ssh 트래픽 허용(단, 보안설정을 통해 아무나 접속할 수 없도록 해야한다.)
0.0.0.0/0
설정은 지양해야한다.
인바운드 규칙 편집
- ssh/protocol:TCP/port:22/source: 허용할 IP
- MySQL/protocol:TCP/port:3306/source: 허용할 IP
- 사용자 지정 TCP/protocol:TCP/port:8080/source: 허용할 IP
EC2 접속
- 키 페어를 생성하고, 받은
pem key
이 있는 라이브러리에서ssh
명령어를 통해EC2 접속
1
ssh -i {키 페어 이름}.pem ubuntu@{인스턴스 아이피}
- 만약 접속이 안되면서
Error: Permission denied (publickey)
이런 에러가 발생하면 pem key 파일의 권한을 변경하고 다시 시도해보자.
1
chmod 400 ./키페어 이름.pem
EC2에 MySQL과 jdk 설치
- 프로젝트에서
MySQL
을 사용했으므로,EC2
에도MySQL
을 설치해 주자. - jdk11버전을 사용했으므로, 똑같이 jdk11을 설치해 주자.
1
2
3
4
sudo apt update
sudo apt upgrade
sudo apt install mysql-server
sudo apt install openjdk-11-jdk
MySQL
설치가 완료되고 접속을하면 초기 설정을 하는데, 강력한 비밀번호 사용(보안엔 좋지만 너무 귀찮다.) 외에 다 yes를 해주면 된다.
EC2 MySQL 유저 생성 및 권한 부여
- MySQL설치를 완료하면, 앞으로 사용할 새로운 유저를 생성하고, 권한을 부여해줘야 한다.
1
2
3
CREATE USER 'userId'@'%' IDENTIFIED BY '비밀번호'; // 유저 생성
GRANT ALL PRIVILEGES ON DB명.* TO userId@'%'; // 모든 원격지에서 접속 권한 추가
FLUSH PRIVILEGES; // 변경된 내용 반영
EC2 MySQL 외부 접속 허용
- MySQL 외부 접속을 허용해줘야 한다.
1
2
3
sudo -i // root계정으로 변경
cd /etc/mysql/my.cnf.d // mysql설정 파일 디렉토리로 이동
vim mysqld.cnf // mysql 설정 파일 vim으로 열기
- 설정 파일을 vim으로 수정
1
2
# bind-address = 127.0.0.1 // 주석처리
# mysqlx-bind-address = 127.0.0.1 // 주석처리
jar 배포
application.yml파일 분리
- local(로컬 설정), dev(배포 설정) 분리
- DB접속 정보등 노출되면 안되는 정보를 감추기 위해 설정 정보 분리
1
2
3
4
5
6
7
8
spring:
datasource:
url: jdbc:mysql://localhost:3306/{DB이름}
driver-class-name: com.mysql.cj.jdbc.Driver
username: ${ACCESS_ID} // 서버에서 jar파일 실행하면서, 값을 넣어주면 된다.
password: ${ACCESS_PASSWORD} // 서버에서 jar파일 실행하면서, 값을 넣어주면 된다.
server:
port: 8080
jar 파일 생성
1
./gradlew bootJar
gradle
프로젝트 기준build
를 통해jar
파일 생성- 만약
gradlew
실행 권한이 없다면chmod +x gradlew
로 권한을 설정해줘야 한다.
jar파일 EC2로 전송
- scp명령어를 통해 EC2로 jar파일 전송
1
scp -i {pem key 파일 절대 경로}/{키페어 이름.pem} {jar파일 절대 경로}/{jar파일} ubuntu@{인스턴스 아이피}:/home/ubuntu
jar 파일 실행
- EC2에 접속하여, 명령어를 통해 jar 파일 실행
1
2
java -jar {jar 파일 이름}.jar --ACCESS_ID={username} --ACCESS_PASSWORD={password} // Foreground에서 실행
nohup java -jar {jar 파일 이름}.jar --ACCESS_ID={username} --ACCESS_PASSWORD={password} 1> /dev/null 2>&1 & // Background에서 실행
&
와nohup
의 차이:&
로 실행하면, 로그아웃으로 세션과 연결이 종료되면 프로그램이 종료되고,nohup
은 로그아웃을 하더라도 프로그램이 종료되지 않는다.1> /dev/null 2>&1 &
: 표준출력1
은/dev/null
파일로 리다이렉션하고, 표준에러2
는 표준출력이 쓰이는 파일에 리다이렉션 하겠다는 뜻/dev/null
: 해당 파일은 항상 비어있으며, 여기로 전송된 데이터는 버려진다. 즉, 표준출력과 표준에러 모두 출력할 필요가 없다는 뜻
백그라운드에서 실행중인 JVM 종료
- jps 명령어를 통해 백그라운드에서 실행중인 JVM 프로세스의 PID를 알아낸 후 kill 명령어를 사용하면 종료시킬 수 있다.
1
2
3
4
5
6
jps // 입력 시 아래와 같이 실행중인 JVM프로세스를 알수있다.
2132 {jar파일 이름}.jar
2860 Jps
kill -9 2132 // 입력하면 실행중인 jar파일을 종료시킬 수 있다.
This post is licensed under CC BY 4.0 by the author.