본문 바로가기
Spring Boot (프로젝트)

[스프링 부트] EC2 인스턴스에 스프링부트, MySQL, S3, 도커 연결(아마존 리눅스 2)

by Hoozy 2023. 4. 16.

이 게시글에서는 도커를 사용하지 않고, 스프링부트 프로젝트 빌드 jar 파일을 EC2 인스턴스에서 배포하고, EC2 인스턴스와 MySQL WORKNEBCH를 연결하는 것, 또는 도커 컨테이너와 네트워크를 통해 연결하는 것을 알아보겠습니다.

1. 도커 사용하지 않고 빌드 jar 파일을 활용한 배포.

  1. 스프링부트 프로젝트를 로컬(컴퓨터)에서 빌드.
  2. 위에서 빌드한 jar 파일을 scp 프로그램으로 EC2 인스턴스에 옮기기.
    • scp 프로그램 : Secure file Copy Program의 약자로, 말그대로 파일을 보안 전송하기 위한 프로그램이다.
    • 이 게시글에서는 window 전용 scp 프로그램 중 하나인 winscp를 사용한다.
  3. 위 jar 파일을 jar 파일 배포 명령어로 배포.
  4. EC2 인스턴스에 MySQL 설치.
  5. MySQL WORKBENCH 에 접속 후 커넥션을 생성. -> EC2 인스턴스의 SSH로 접근.
  6. 위의 커넥션에 스프링부트 프로젝트에서 사용해야 할 테이블들을 생성. -> 기존 커넥션 복사.
  7. nohup java -jar .jar & 명령어로 배포.
    • 맨 앞에 nohup : 선택이며, 현재 배포를 중지하지 말라는 뜻.
    • 맨 뒤에 & : 선택이며, 백그라운드로 돌리라는 뜻.
    • 위의 두 개는 비슷해보이지만 nohup은 EC2 인스턴스에서 로그아웃으로 세션이 종료되어도 멈추지 말라는 뜻이고, &는 말그대로 백그라운드로만 돌린다는 뜻(로그아웃하면 중지)이다.

PuTTY

  • 가상 단말기 프로그램으로, 윈도우같은 개인 PC 운영체제에서도 서버로 접속할 수 있도록 물리적인 단말장비가 아닌 논리적인 가상 단말기를 제공한다.
  • 다양한 접속 방법을 제공한다. (SSH, Rlogin 등)
  • EC2 인스턴스에 접속하는 방법 (SSH)

1. https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 에서 맨위 64비트 또는 32비트에 맞춰서 MSI를 다운로드하고 설치한다.

2. 만약 EC2 인스턴스를 생성할 때 키페어를 .pem으로 생성하면, PuTTY를 접속하기 위해선 .ppk 키로 바꿔야 한다.

  • .ppk로 처음부터 만들었으면 아래 단계는 넘기고 3번으로 가면 된다.
  • .pem 을 .ppk 로 변환하는 법.
    1. PuTTYGen을 실행한다. (위의 msi 패키지를 설치하면 설치되어있다.)
    2. - 만약 PuTTY만 설치했으면, PuTTY를 다운받은 링크에서 PuTTYGen을 설치할 수 있다.
    3. Load 클릭 후 EC2 인스턴스에서 생성한(연결되어 있는 키 페어) .pem 파일을 선택한다. (오른쪽에서 파일 조건을 All files 로 해야한다.) -> 나머지 옵션은 냅두고, Load만 한다.
    4. 위의 .pem 키페어를 선택 후 Save private key를 클릭하고 이름을 맘대로 정하고 저장하면 .ppk 파일이 생긴다.

3. PuTTY를 실행 후 Host Name에는 EC2 인스턴스의 공적 IP (또는 탄력적 IP)이나 SSH 클라이언트의 ec2-user@퍼블릭 DNS를 입력한다.

  • 퍼블릭 DNS : EC2 인스턴스의 정보에서 확인 가능하고, 편하게는 인스턴스의 연결 - SSH 클라이언트 맨 아래에 예시에서 ssh -i "~~.pem" 을 제외한 뒤에 복사하면 된다.
  • 퍼블릭 DNS 방법을 추천한다. -> 공적 IP로 접속하면 유저 이름인 ec2-user를 접속할 때마다 입력해야 한다.

  • 위의 이미지처럼 SSH - Auth - Credentials 에서 맨위 private key file 에 위에서 생성한 .ppk를 추가한다.

  • 이후 위의 이미지처럼 Saved Sessions 에 원하는 이름을 적고, save를 클릭 후 open을 클릭하고 EC2 인스턴스에 접속되면 성공이다.

스프링부트 프로젝트 빌드하기(윈도우)

  1. 프로젝트 root 폴더에 dockerfile 생성 후 작성.
// dockerfile 생성 후 아래 작성.
FROM openjdk:17 // 자신의 jdk 버전
COPY build/libs/*.jar app.jar // build/libs 내 jar 파일 -> 빌드된 jar 파일을 app.jar로 복사
ENTRYPOINT ["java", "-jar", "app.jar"] // 배포할 때 명령어 : java -jar app.jar
  1. 스프링부트 프로젝트 폴더의 절대 경로를 복사.
  2. cmd(터미널) 실행. -> 관리자로 실행.
  3. cmd에서 폴더 경로로 이동 -> cd 명령어 사용.
    • 폴더가 D 드라이브에 있을 때
      • D: 명령어로 D 드라이브로 이동 후 cd 절대경로 를 사용해 폴더로 이동.
    • 폴더가 C 드라이브에 있을 때
      • cd 절대경로로 폴더 이동.
  4. 이동 후에 gradlew build 명령어로 빌드 실행
  5. 위의 폴더 내에 build/libs 폴더에 프로젝트명-0.0.1-SNAPSHOT.jar 이 생성되어 있다. -> jar 파일이 빌드 파일.

Winscp

  • scp 프로그램 중 하나이다.

사용법

  1. Winscp 설치 -> https://winscp.net/eng/download.php
  2. winscp 실행 후 파일 프로토콜은 scp, 호스트 이름은 공적 ip, 사용자 이름은 ec2-user를 입력한다.

  1. 고급을 클릭 후 환경 - SCP/SHELL - 쉘을 sudo su - (관리자 권한 부여)

  1. ssh - 인증 - 개인키 파일에 아까 생성한 .ppk 입력 후 확인 - 저장누르고 이름 맘대로 적은 후 로그인.
  2. 접속 후에 위에서 빌드한 jar 파일 폴더에 들어가서, .jar 파일을 EC2 인스턴스의 원하는 폴더에 옮긴다.

MySQL 연결

  • MySQL을 연결하기 전에 인스턴스에 MySQL을 설치하고, root로 접속해서 비밀번호를 원하는 비밀번호로 바꾸고 MySQL WORKBENCH에서 인스턴스의 IP(+ PORT)와 연결해줘야 한다.

1. MySQL 설치하기

# 관리자 권한
sudo su 

# yum 업데이트
sudo yum update

# mysql 설치
sudo yum install mysql

#  mysql 실행
systemctl start mysqld

2. MySQL 접속하기

# root 계정으로 접속하기
mysql -r root -p

Enter Password: 처음엔 그냥 엔터 -> 비밀번호가 없기 때문에.

# 만약 그냥 엔터 후에 에러가 나오면 -> 아래처럼 root 비밀번호 초기화
ERROR ~~ : (using password: NO(or YES)) -> NO 는 비밀번호를 안쳐서 생긴 오류, YES는 비밀번호를 쳤는데 틀려서 생긴 오류.

# mysql 끄기
systemctl stop mysqld

# 안전모드 진입
systemctl set-encironment MYSQLD_OPTS="--skip-grant-tables"

# root 로그인 -> 비밀번호 없이
mysql -u root

# 비밀번호 변경
update mysql.user set authentication_string = PASSWORD('변경비밀번호')
where User = 'root' and Host = 'localhost';

# 권한 저장
flush privileges;

# mysql 시작
systemctl start mysqld;

# mysql 접속
mysql -u root -p

위에서 변경한 비밀번호 입력.

3. MySQL 워크밴치와 연결하기

  1. 아래 이미지에서 + 버튼(커넥션 생성) 누르기.

2. GIT을 활용한 jar 배포

  • EC2 인스턴스에서 GIT CLONE 을 통해 프로젝트를 pull 한 후 ./gradlew build 명령어를 통해 빌드 후 배포하는 방법이다. (MySQL 은 1번 방법과 동일함.
# git 설치
yum install git

# git clone -> 현재 폴더에 clone이 편하므로 폴더 이동 후 명령어 입력
# 주소는 https 주소 복사
git clone https://github.com/~~~ 
# 위 명령어를 실행하면 현재 폴더에 repository 폴더가 생성되어있다.

# 이 프로젝트에는 보통 application.yml이 없기 때문에 따로 생성해줘야 한다. -> 보안 문제

# scp 프로그램으로 파일을 옮기는게 마음이 편하지만, 아래는 생성하는 법

# resources 폴더로 이동
cd 폴더/src/main/resources

# application.yml 생성
touch application.yml

# yml 편집 -> vi 명령어는 'i' 로 편집 시작, 'ctrl+c' 로 편집 끝, ':wq" 로 저장 후 나옴. 만 알아도 충분하다. 
vi application.yml

# 다시 프로젝트 폴더로 돌아오기
cd ../../.. 

# 프로젝트 빌드
./gradlew build

# 빌드 한 jar 파일 배포 -> nohup, & 는 옵션
java -jar buuild/libs/~~~.jar 

# mysql 연결은 1번과 같다.

3. 도커를 사용하여 스프링부트 프로젝트와 MySQL 컨테이너를 활용한 배포.

  • 도커 컨테이너 안에 스프링부트 프로젝트 빌드 jar의 이미지를 넣고, 또 다른 컨테이너에 mysql 이미지 넣고, 도커 네트워크로 두 컨테이너를 연결한 후 EC2 인스턴스에서 백그라운드와 무중단 서버로 배포하는 것이 목적이다.

1. 프로젝트 빌드 파일 도커 이미지 만들고 EC2 인스턴스에서 이미지 pull 하기

  • 아래 게시글에서 프로젝트를 빌드하기 전에 아래 2번의 호스트포트, 퍼블릭 ip, root의 비밀번호를 application.yml에 설정해야 한다. 이후에 마지막 라인인 배포 빼고 이미지 pull 까지만 하고 아래 2번으로 가기.
// application.yml 변경
// 아래 설정을 제외하고는 같다.

spring:
    datasource:
        url: jdbc:mysql://[퍼블릭 ip]:[호스트 포트]/[스키마 이름]? // 이후에는 똑같음
        username: root
        password: [아래에서 설정할 root의 비밀번호]

2. 컨테이너 내부 mysql과 mysql 워크벤치 연결

  1. mysql 컨테이너를 생성
# mysql 이미지 pull -> 태그 없으면 최신버전
docker pull mysql;

# 네트워크 생성
docker network create [네트워크 이름]

# mysql 컨테이너 생성 -> 끝에 mysql은 mysql 이미지명
docker run -p [호스트 포트]:3306 --name [컨테이너 이름] --network [위의 네트워크 이름] -e MYSQL_ROOT_PASSWORD=[root의 비밀번호 설정] -d mysql
  • 아래 이미지 처럼 커넥션 이름에 아무이름 적고, hostname에 인스턴스 퍼블릭 ip, 포트에 위에서 정한 호스트 포트를 적고 ok를 누르면 비밀번호 입력하라는 칸이 나온다. 이때 위에서 정한 root의 비밀번호을 넣고 확인하면 연결이 된다.
  • 이후에 원래의 데이터베이스를 복사하거나 테이블을 생성한다.

  1. mysql 컨테이너에 접속 후 mysql 로그인 하고, 연결확인.
# 컨테이너 접속
docker exec -it [mysql 컨테이너 이름]

# mysql 접속
mysql -u root -p

# 이후 비밀번호는 위에서 root의 비밀번호 입력

# 로그인 되었으면 워크벤치의 스키마가 있는지 확인
show databases;

# 위 명령어 이후에 워크벤치에서 생성하거나 복사한 스키마 있으면 연결 성공.

3. 프로젝트 컨테이너 생성하고 mysql과 연결

  • 프로젝트 컨테이너 생성
# 생성한 이미지명(도커허브의 repository 명과 동일한 이름)으로 컨테이너 생성
docker run -p [프로젝트 포트]:[프로젝트 포트] --name [컨테이너 이름] --network [위의 네트워크 이름] -d 이미지명

만약 퍼블릭 ip로 접속했을 때 500에러가 뜨면 application.yml 설정을 1번에서 예시에 맞춰서 다시 해보시면 됩니다.

참고 자료

https://dololak.tistory.com/24
https://velog.io/@dhk22/Springboot-MySQL-Docker-%EB%8F%84%EC%BB%A4%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1

댓글