본문 바로가기
개발

EC2 인스턴스에 React + SpringBoot + MySQL 연동

by ^..^v 2023. 3. 29.
728x90
반응형

EC2 인스턴스 두 개를 생성해, 첫번째 인스턴스에는 리액트 앱과 스프링부트 REST API 서버를 배포하고, 두번째 인스턴스에는 MySQL 서버를 배포합니다.

 

VPC 생성

VPC 서비스 페이지에서 [VPC 생성] 버튼을 클릭합니다.

 

생성할 리소스로 VPC만을 선택하고,  VPC 이름으로 BoardVPC를 CIDR로 10.0.0.0/16을 입력합니다.

 

 

서브넷 생성

리액트 앱과 스프링부트 앱을 실행할 퍼블릭 서브넷과 MySQL 서버를 실행할 프라이빗 서브넷을 각각 생성합니다.

서브넷 화면에서 [서브넷 생성] 버튼을 클릭합니다. 

 

서브넷 설정 화면에서 서브넷 이름, 가용영역, CIDR블록을 각각 입력, 선택합니다. 

PublicSubnet은 서울 리전(ap-northeast-2)의 첫번째 가용영역(ap-northeast-2a)에, 10.0.10.x 네트워크를, PrivateSubnet은 서울 리전의 세번째 가용영역(ap-northeast-2c)에 10.0.30.x 네트워크를 설정합니다. 

 

 

인터넷 게이트웨이 생성

외부와의 연동을 위해 인터넷게이트웨이를 생성합니다.

인터넷 게이트웨이 화면에서 [인터넷 게이트웨이 생성] 버튼을 클릭하고, 인터넷 게이트웨이 이름으로 BoardIGW를 입력합니다. 

 

 

생성한 인터넷 게이트웨이를 BoardVPC와 연결합니다.

 

 

 

라우팅 테이블 생성

PublicRT 이름의 라우팅 테이블과 PrivateRT 이름의 라우팅 테이블을 각각 생성합니다. 

 

 

 

PublicRT 라우팅 테이블에 인터넷 게이트웨이(BoardIGW)로 라우팅을 추가합니다. 

 

 

PublicRT 라우팅 테이블을 PublicSubnet 서브넷으로,  PrivateRT 라우팅 테이블을 PrivateSubnet 서브넷으로 각각 연결합니다.

 

 

 

 

 

VPC의 Resource map으로 VPC, 서브넷, 라우팅 테이블, 인터넷 게이트웨이의 연결 관계를 확인합니다.

 

 

애플리케이션 전용 EC2 인스턴스 생성

PublicSubnet 서브넷에 리액트 및 스프링부트 애플리케이션을 실행할 EC2 인스턴스를 생성합니다. 

SSH 접속에 사용할 키 페어를 생성합니다. (이전에 생성한 키 페어가 있는 경우, 동일한 키 페어를 선택하여 사용할 수 있습니다.)

 

BoardVPC, PublicSubnet 서브넷, 퍼블릭 IP 자동 할당 활성화를 선택하고, AppServerSG 이름의 보안 그룹을 생성합니다. 22(SSH), 80(HTTP), 8080(HTTP 개발) 포트로 접속할 수 있도록 인바운드 보안 그룹 규칙을 추가합니다.

 

나머지 설정을 그대로 유지한 상태에서 [인스턴스 시작] 버튼을 클릭해 인스턴스를 생성합니다. 

 

 

데이터베이스 전용 EC2 인스턴스 생성

PrivateSubnet 서브넷에 MySQL 서버를 실행할 EC2 인스턴스를 생성합니다. 

 

인스턴스 이름으로 DBServer를 입력합니다. 

 

BoardVPC, PrivateSubnet 서브넷, 퍼블릭 IP 자동 할당 활성화를 선택하고, DBServerSG 이름의 보안 그룹을 생성합니다. 22(SSH), 3306(MySQL/Aurora) 포트로 접속할 수 있도록 인바운드 보안 그룹 규칙을 추가합니다.

 

 

나머지 설정을 그대로 유지하고, [인스턴스 시작] 버튼을 클릭해 인스턴스를 생성합니다.

 

 

애플리케이션 서버 설정

AppServer 인스턴스의 퍼블릭 주소를 확인하고, SSH 클라이언트 프로그램을 이용해서 접속합니다. 

 

작업 디렉터리를 만들고 JDK, nginx를 설치합니다. 

### 작업 디렉터리 생성 및 이동
$ cd
$ mkdir board
$ cd board

### JDK 설치
$ wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
$ sudo rpm -ivh jdk-17_linux-x64_bin.rpm
$ sudo alternatives --config java

### JDK 설치 확인
$ java -version
java version "17.0.6" 2023-01-17 LTS
Java(TM) SE Runtime Environment (build 17.0.6+9-LTS-190)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.6+9-LTS-190, mixed mode, sharing)

### nginx 설치 및 확인
$ sudo yum install nginx
$ sudo service nginx start
$ nginx -v
nginx version: nginx/1.22.1

 

웹 브라우저를 이용해 nginx 서버 동작을 확인합니다. 

 

 

데이터베이스 서버 설정

DBServer 인스턴스의 퍼블릭 주소를 확인하고, SSH 클라이언트 프로그램을 이용해서 접속합니다. 

 

해당 인스턴스는 PrivateSubnet 서브넷에 속해 있어 외부에서 접근이 불가능하므로, 프로그램 설치 및 초기 데이터 설정을 위해 라우팅 테이블을 PublicRT로 변경합니다. (모든 설정이 종료되면 PrivateRT로 다시 변경합니다.)

 

SSH 접속 후 mysql을 설치합니다. 

$ sudo yum update -y
$ sudo yum localinstall -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
$ sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
$ sudo yum install -y mysql-community-server
$ sudo systemctl enable mysqld
$ sudo systemctl start mysqld
$ mysql --version

 

패스워드 및 외부 접속이 가능하도록 설정합니다.

### 패스워드 확인
$ sudo grep 'temporary.*root@localhost' /var/log/mysqld.log | tail -n 1 | sed 's/.*root@localhost: //'
zRDoyM9H*otW				⇐ 복사

### MySQL 접속
$ mysql -u root -p
Enter password: zRDoyM9H*otW		⇐ 붙여넣기

### 패스워드 복잡도 규칙 완화
mysql> set global validate_password_policy=LOW;
Query OK, 0 rows affected (0.00 sec)

### root 패스워드를 p@ssw0rd로 변경
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'p@ssw0rd';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

### root 사용자로 외부에서 접근을 허용
mysql> GRANT ALL privileges ON *.* TO root@'%' IDENTIFIED BY 'p@ssw0rd';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

### MySQL 접속 종료
mysql> exit
Bye

 

 

스키마 생성 및 초기 데이터 설정

MySQL Workbench에 연결을 추가하고, springbootdb 스키마 생성 후 데이터를 임포트합니다. 

 

 

애플리케이션 수정

배포 환경에 맞춰서 애플리케이션 설정을 변경합니다. 

### 리액트 애플리케이션의 .env 파일
# AppServer 인스턴스의 퍼블릭 IP 주소로 변경
REACT_APP_REST_API_SERVER_ADDRESS=3.34.53.224:8080

 

 

### 스프링부트 애플리케이션의 application.properties 파일
# DB 연결 정보를 DBServer 인스턴스의 프라이빗 IP 주소로 변경
spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.hikari.jdbc-url=jdbc:log4jdbc:mysql://10.0.30.149:3306/springbootdb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Seoul
spring.datasource.hikari.username=root
spring.datasource.hikari.password=p@ssw0rd
spring.datasource.hikari.connection-test-query=select 1

mybatis.configuration.map-underscore-to-camel-case=true
application.upload-path=/home/ec2-user/board/upload/
spring.mvc.pathmatch.matching-strategy=ant-path-matcher

 

 

애플리케이션 배포

리액트 및 스프링부트 코드를 AppServer 인스턴스에 배포합니다. 

 

리액트

C:\aws\board-react\build 디렉터리를 /home/ec2-user 디렉터리 아래로 업로드합니다.



배포 파일을 웹 루트 디렉터리로 이동하고, 배포 파일을 삭제합니다. 

$ cd						⇐ 홈 디렉터리로 이동
$ sudo mv ./build/* /usr/share/nginx/html/	⇐ 배포 파일을 웹 루트 디렉터리로 이동
$ rm -rf build					⇐ 배포 파일 삭제

 

스프링부트 

C:\aws\board-springboot\build\libs 디렉터리 아래의 board-springboot-0.0.1-SNAPSHOT.jar 파일을 /home/ec2-user/board 디렉터리 아래로 업로드합니다.

 

업로드한 디렉터리에서 java 명령으로 애플리케이션을 실행합니다. 

$ java -jar board-springboot-0.0.1-SNAPSHOT.jar

 

브라우저로 서비스 실행 여부를 확인합니다. 

 

라우팅 테이블 변경

환경 설정을 위해서 변경했던 PrivateSubnet 서브넷의 라우팅 테이블을 PublicRT에서 PrivateRT으로 다시 변경합니다.

 

DBServerSG 보안그룹 인바운드 규칙 변경

AppServer 인스턴스에서만 DBServer 인스턴스의 3306 포트로 접근할 수 있도록 DBServerSG 보안그룹의 인바운 규칙을 변경합니다. 

 

 

리소스 정리

테스트 후 생성한 EC2 인스턴스와 VPC를 모두 삭제합니다. 

728x90
반응형

댓글