AWS EC2에 Spring Boot Project 배포하기

zihooy·2023년 6월 22일
0
post-thumbnail

AWS EC2 서버에 Spring Boot로 제작한 웹을 배보해보자.

🏹 AWS 가입 및 EC2 서버 생성

전반적인 흐름은, 이전포스트에서 Linux에 웹을 배포하던 과정과 매우 유사하다.

Amazon EC2

Amazon EC2는 Amazon Web Services(AWS)의 클라우드 컴퓨팅 서비스 중 하나이다. EC2는 Elastic Compute Cloud의 약자로, 가상 서버를 제공하여 사용자가 필요에 따라 확장하거나 축소할 수 있는 유연한 컴퓨팅 환경을 제공한다.

인스턴스

인스턴스란

인스턴스는 Amazon EC2에서 실행되는 가상 서버이다. 하나의 VM이라고 이해해도 무방하다. 원하는 운영체제(OS)를 선택할 수 있으며, 용량, 성능, 스토리지 등을 설정할 수 있다. 인스턴스는 고유한 식별자인 인스턴스 ID를 가지며, IP 주소와 DNS 이름을 할당받아 네트워크에 연결된다.

인스턴스 생성하기

인스턴스를 생성하는 방법은, 아래의 포스트에 잘 나와있으므로 참고하면 좋을 것 같다.
나의 경우에는 AMI 설정 시 Linux(Ubuntu)를 선택하였고, 나머지는 비슷하게 진행하였다.
EC2 인스턴스 생성하는 방법

🏹 AWS EC2 인스턴스에 MySQL 설치

탄력적 IP 주소 설정

탄력적 IP 주소(Elastic IP address)는 Amazon EC2 인스턴스에 고정된 공인 IP 주소를 제공하는 서비스이다. 일반적으로 EC2 인스턴스를 시작할 때에는 임시적으로 할당되는 공인 IP 주소를 사용하게 된다. 그러나 이러한 임시적인 IP 주소는 인스턴스를 중지하거나 다시 시작할 때마다 변경될 수 있다.

탄력적 IP 주소를 사용하면 인스턴스에 고정된 공인 IP 주소를 할당할 수 있다. 이 주소는 인스턴스를 중지하고 다시 시작해도 유지된다.

아래의 포스트를 참고하여 탄력적 IP 주소를 사용해보자.
탄력적 IP 주소 사용 방법

SSH 접속

이제 외부에서 인스턴스에 접속해보자.
인스턴스에 대한 요약 페이지에서, 연결 버튼을 클릭하고, SSH 클라이언트 라는 탭을 들어간다.

pem key 파일이 존재하는 경로에서, AWS 설명에 나와있는대로 pem key의 권한을 바꿔준다.
아래는 예시이다.

chmod 400 {PEM KEY 파일명}

이후에는 ssh로 접속한다.
아래는 예시이다.

ssh -i "{PEM KEY 파일명}" {사용자명}@{인스턴스의 도메인 or IP 주소}

SSH 접속 에러

만약 위 명령어를 실행했는데 에러가 난다면, 2가지를 확인하자.
1. 보안 그룹 확인

인스턴스에 연결된 보안 그룹의 인바운드 규칙을 확인하자.
아래와 같이 22번 포트의 접속을 허용하도록 규칙을 편집해주어야 한다.

2. 인스턴스를 삭제하고 다시 생성한 경우
기존에 접속한 ip의 서버가 달라지면 재접속시 문제가 발생하며 아래와 같은 error 메시지가 나온다.

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.

이 경우에는 아래의 명령어를 입력하면 해결된다. {접속했던 ip 주소} 에는 현재 컴퓨터의 ip 주소, 이전에 접속했던 EC2의 ip 주소, 이전에 접속했던 EC2의 도메인을 입력하여 각각 실행해야 한다.

ssh-keygen -R {접속했던 ip 주소}

MySQL 다운받기

Ubuntu에 MySQL을 다운 받는 과정과 똑같다. 따라서 이전에 작성한 포스트를 참고해도 좋고, 아래의 내용을 참고해도 좋다.

ssh 명령어를 사용하여 AWS EC2 인스턴스의 Ubuntu 터미널에 접속한다.

가상머신으로 직접 들어가거나, 맥북 터미널에서 아래 명령어를 통해 접속할 수 있다.

ssh -i "{PEM KEY 파일명}" {사용자명}@{인스턴스의 도메인 or IP 주소}

MySQL 다운로드

sudo apt-get update
sudo apt-get install mysql-server -y

🏹 MySQL 외부 접속 허용

MySQL 등록

계속해서 Ubuntu 터미널에서 작업한다.

sudo ufw allow mysql

sudo systemctl start mysql // MySQL 실행
sudo systemctl enable mysql // Ubuntu 서버 재시작시 MySQL 자동 재시작

MySQL 외부 접속 허용

계속해서 Ubuntu 터미널에서 작업한다.

cd /etc/mysql/mysql.conf.d
sudo vi mysqld.cnf

아래 화면처럼 bind-address 부분을 0.0.0.0으로 바꿔준다.

mysql을 재시작한다.

sudo systemctl start mysql
sudo systemctl stop mysql

MySQL 실행하기

sudo /usr/bin/mysql -u root -p
// 또는
sudo mysql -u root -p

사용자 확인하는 쿼리

mysql> SELECT User, Host, authentication_string FROM mysql.user;

Table 생성하는 쿼리

mysql> CREATE DATABASE DB01;
mysql> SHOW DATABASES;

접근을 허용할 IP 등록

users 데이터베이스를 사용할 계정 testuser01 생성

주의할 점은, 계정에 접근할 수 있는 ip를 부여할 때, create 단계에서부터 동일하게 ip를 부여해야 한다.

mysql> CREATE USER 'testuser01'@'%' IDENTIFIED BY '1234';
mysql> FLUSH PRIVILEGES;
mysql> SELECT User, Host, authentication_string FROM mysql.user;

접근 허용 IP 등록

❗️위에서 생성한 user에게 부여된 ip와 다르면 에러가 난다❗️

mysql> grant all privileges on *.* to testuser01@'%';
mysql> FLUSH PRIVILEGES;

mysql> SELECT User, Host FROM mysql.user;

아래와 같이 user를 조회했을 때 user와 host가 적용되면 완성 !

Ubuntu 방화벽 오픈

이제 EC2의 보안 규칙을 다음과 같이 설정해서, 외부에서도 3306 포트에 접근할 수 있도록 하자.

TimeZone 설정하기

이제 EC2의 타임존과 MySQL의 타임존을 설정해보자.
Ubuntu 터미널에서 작업한다.

sudo timedatectl set-timezone Asia/Seoul
mysql_tzinfo_to_sql  /usr/share/zoneinfo/Asia/Seoul KST

mysql 터미널에서 작업한다.

sudo mysql -u root -p
set time_zone = 'Asia/Seoul';
SELECT NOW();

위와 같이 SELECT NOW();의 결과 값이 현재 시각과 일치한다면 시간대 설정이 완료된 것이다.

MySQL Workbench에서 접속하기

hostname에는 EC2의 도메인 주소 or 탄력적 IP 주소를, port는 3306을, username에는 생성한 사용자 명을, password에는 사용자 비밀번호를 입력한다.
성공적으로 연결이 되었다면, 아래와 같이 이전에 만든 users 데이타베이스를 확인할 수 있다.

웹 프로젝트의 DB 정보 변경해주기

웹 프로젝트의 DB 역시 AWS EC2에서 설치한 DB로 설정을 변경해야 한다. 나의 경우는 application.yaml을 다음과 같이 변경해주었다.

db:
  driverClassName: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://{AWS EC2 도메인 명 or 탄력적 IP 주소}/users
  user: testuser01
  password: 1234

🏹 AWS EC2 인스턴스에 Java 설치 및 war 파일 실행

Java 설치

이제 Spring Boot의 내장 Tomcat을 실행하기 위한 설정을 해주자.

우선 Java를 설치한다.

sudo apt install default-jdk

Ubuntu 방화벽 오픈

이제 EC2의 보안 규칙을 다음과 같이 설정해서, 외부에서도 80과 8080 포트에 접근할 수 있도록 하자.

로컬 컴퓨터에서 EC2 서버로 war 파일 전송

다음으로는 로컬 컴퓨터에서 웹 프로젝트를 war 파일로 build한 것을 EC2 서버로 전송해주어야 한다.
따라서 로컬 맥북 터미널에서 작업한다.
war 파일 명을 ROOT.war 으로 바꾸어주고, 해당 파일이 있는 경로에서 다음과 같이 scp 명령어를 사용한다.

scp -i "{PEM KEY 명}.pem" "ROOT.war" {사용자명}@{AWS EC2 도메인 명 or 탄력적 IP 주소}:/home/ubuntu

EC2 인스턴스에 정상적으로 전송 되었는지 확인하자.
다시 AWS EC2 인스턴스의 Ubuntu 터미널에 들어가자.

위의 화면처럼 ROOT.war가 존재하는 것을 확인할 수 있다.

war 파일 해제

java -jar ROOT.war

웹 브라우저에서 확인

할당된 ip 주소 혹은 도메인명 : 8080 으로 접속한다.
http://{AWS EC2 도메인 명 or 탄력적 IP 주소}:8080/

profile
thisIsZihooLog

0개의 댓글