Post

(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.