저번주에는 기본적인
Cloud 운영 환경에 대한 구성들을 배워 보았다.
이번 공부에서는 3티어 아키텍처 형태로 배포하는 방법을
배울 것이고, 저번주에 EC2에 서버를 배포해보는 것까지 해봤었다.

image

그 중에서도 우리는 EC2 인스턴스에
우리가 만든 Spring 프로젝트를 build하여
서버에 배포해보는 것까지 진행 했었다.

오늘은 클라이언트(S3) 측과 데이터베이스(RDS) 측을 알아보자


클라이언트 배포

우선 클라이언트의 프로젝트를 build하는 방법이
여러가지가 있는 것 같다. (java와 마찬가지로)

그 중 터미널의 node를 이용해 build하는 작업을 진행해보자
(참고로 MacOS를 사용중)


1. 프로젝트 build

먼저 nvm 설치를 진행해주자.

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash

공식 사이트에 있는 최신 버젼을 설치해주면 될 것 같다.
만약, wget을 찾을 수 없다는 알람이 뜬다면

brew install wget

wget을 패키지 관리자인 homebrew로 설치하면 된다.

짤막한 지식과 검색을 통한 지식으로 정리를 해보자면
NVM은 Node Version Manager로 Node.js의 버전을 관리해주는 도구이다.
Node.js는 브라우저 내에서 말고도 다른 환경에서도 JavaScript를 실행 시킬 수 있게
도와주는 실행창, 실행 환경이라고한다. (크롬의 js해석 엔진인 V8 엔진을 이용)

그럼 이제 nvm 설치가 완료되었다면

nvm --version

명령어로 설치가 되었는지 확인해주자.

이제 nvm이 설치되었으니 node.js 설치를 할 수 있다.
해당 사이트에서 버전 확인이 가능하다.

원하는 버전을 설치해줘도 되지만.. 16버전을 이용했을 때
오류가 없었기에

nvm install 16

이라고 입력해주면 16버전이 설치된다.

최신 버전을 설치하고 싶을 경우

nvm install --lts

를 입력해주면 최신버전이 설치가 된다.

만약 설치를 여러개 하였을 때, 버젼을 변경해서 사용하고 싶을 경우
먼저 버전을 확인하고 싶으면

nvm list

명령어로 현재 설치된 버전이 확인된다.

그리고 버전을 변경하고 싶을 경우

nvm use 16

과 같은 식으로 현재 설치된 버전 중 선택해서 nvm use를 사용하면 변경된다.


이제 실제로 클라이언트를 AWS를 이용해 배포해보자
우선 터미널로 우리가 만든 클라이언트 폴더에 접속한다.

이동완료후 클라이언트 의존성 모듈을 설치해야한다.

npm install

npm은 Node Package Manager로 Node.js로 만들어진
프로그램을 쉽게 설치 혹은 여러기능들을 해주는 것이라 이해하면 쉬울 것 같다.

설치가 완료되었으면

npm -v

명령어로 설치된 버전을 확인할 수 있다.


이제 이 패키지 매니저로 우리는 build 명령을 실행할 것 인데
이전에 우리는 처음에 보았던 이그림을 볼 필요가 있다.

image

현재 클라이언트와 서버가 연결되기 위해서는
build하기 전에 EC2의 주소를 이용해 환경변수로 설정해
연결을 해준 후 build를 진행해야 우리의 EC2 인스턴스와 연결되는 것 같다.

아직 클라이언트 측의 구성이 정확히 어떻게 되어있는지 이해가 가진 않았다.
하지만 React에서 환경 변수를 사용할 경우 .env파일을 이용해
보안과 유지보수에 용이하게 사용하는 것 같다. (ENV? - 출처: carmack-kim님 블로그)

우선 코드스테이츠 측에서 배포용으로 만들어준
클라이언트 프로그램에 .env파일에 EC2 경로를 추가해줘야한다.

image

내 EC2 인스턴스의 퍼블릭 IPv4 DNS를 입력해주면 된다.
환경 변수 설정이 끝났으면 이제 npm을 이용해 build를 진행해주면된다.

npm run build

를 입력해주면 build가 되어질 것이고

image

Compiled successfully가 콘솔에 확인된다면
정상적으로 완료되었을 것이고 build 폴더가 생겼을 것이다.

이제 클라이언트 프로그램이 build가 되었으니
AWS의 S3 버킷에 올리기만하면 된다.


2. build 파일 업로드

여기서 버킷은 만들어져있다고 가정하고

image

만들어진 버킷을 보면 여러가지 확인과 설정을 할 수 있다.
객체에는 우리가 build한 파일을 업로드해주면된다.

image


3. 정적 웹사이트 호스팅 및 정책 설정확인

속성에서 정적 웹 사이트 호스팅 편집이 가능하다.

image

활성화를 눌러준 후 여러 설정을 할 수 있다.

image

그리고 변경 저장을하면 엔드포인트를 확인할 수 있다.
해당 엔드포인트로 접속 시 우리가 빌드한 html을 확인할 수 있다.
하지만 만약 퍼블릭 엑세스 활성화를 하지 않았다면

403 Forbidden 화면을 보게 될 것이다.
아래에서 설정해보자


4. 퍼블릭 엑세스 활성화

권한 텝에서 먼저

image

모든 퍼블릭 엑세스 차단 체크박스를 해제하고
변경 사항을 저장해준다.

그리고 버킷 정책에서
편집 -> 정책 생성기를 눌러

image

정책에 대한 내용을 적어준다.
해당 부분은 추후에 어떤 정책인지에 대한 내용은
어드벤스한 공부가 필요해보인다..

우선 위와 같이 입력 완료 후
하단에 Add Statement를 눌러주면 Json 형태로 객체가 하나 나온다.
해당 코드 값을 복사해 정책 코드란에다가 붙여 넣어주면 된다.

image

그리고 변경 사항 저장을 눌러주면
해당 버킷에 대한 정책이 적용되어 퍼블릭 엑세스가 가능해진다.
아마 어디서든 접근이 가능하게 만들어진 것 같다.

우선 이렇게 클라이언트에 배포를 하고 정책을 설정에 권한 부여를
할 수 있다는 흐름만 이해해야할 것 같다.

이제 정상적으로 엔드포인트에 접속하면 우리가 만든 화면을 볼 수 있다.
여기서 알아둬야할 점은 클라이언트 S3에 설정이 끝났을 뿐
EC2에서는 S3의 엔드포인트를 config.domain에 설정해줘야한다.
설정해보기전에 RDS먼저 셋팅을 진행해보자


데이터베이스 연결

이제 RDS 인스턴스를 생성하고 연결해보자

image

상단에서 RDS를 검색하여 데이터베이스 생성을 눌러준다.


image

사용하려는 데이터베이스의 엔진을 선택 !
나는 MySQL을 사용


image

템플릿은 프리티어로 설정했다. 프리티어로 설정하면
MySQL의 db.t2.micro 인스턴스는 750시간이 무료사용 가능한 것 같다.
참고 - AWS 프리티어


image

여기서 이제 우리가 기억해야하는 부분이 나왔다.

✅ 마스터 사용자 이름과 마스터 암호는
나중에 DB에 접근할때 꼭 필요한 값이니 기억해두거나
어딘가에 저장해두자 !


image

위에서 얘기했던 무료로 사용하기 위해 해당 옵션으로 설정


image

퍼블릭 엑세스는 허용으로 해준다.


image

그리고 데이터 베이스를 사용하기 위한
포트번호를 설정해둔다. 기본값은 3306이고
13306으로 변경해서 사용하려고 변경했다.


image

추가 구성을 눌러
데이터 베이스의 이름을 설정해줄 수 있다.
이름을 지정한대로 후에 조회할때
해당 데이터 베이스 이름으로 조회가 된다. (test라고 지정했다고 가정하자)


이제 모든 설정은 끝났으니
맨 하단에 데이터베이스 생성을 눌러 만들어주자
데이터베이스가 생성이 완료되면

image

엔드 포인트와 설정했던 포트가 확인된다.
이제 우리는 이 데이터베이스로 EC2에서 접근을하면 된다.

접근하기 이전에 정말로 정상적으로 동작되는지 확인해보고 싶다면
터미널로 확인이 가능하다.

이전에 homebrew를 통해 MySQL을 설치했었다.

brew install mysql

MYSQL이 정상적으로 설치가 완료되었다면

mysql -u [마스터 이름] --host [엔드 포인트 주소] -P [포트 번호] -p

이렇게 입력해주면 터미널로 mysql 접속이 된다.

예를 들어 데이터베이스 만들때 생성했던 정보가 아래와 같다고 가정해보자

마스터 이름 : admin
마스터 비밀번호 : 1234
데이터 베이스 엔드포인트 : be-88-mycatlikeschuru.c0nwl8c1futc.ap-northeast-2.rds.amazonaws.com

위와 같다고 가정할 때 아래와 같이 터미널에 명령을 실행시켜주면 된다.

 mysql -u admin --host be-88-mycatlikeschuru.c0nwl8c1futc.ap-northeast-2.rds.amazonaws.com -P 13306 -p

위와 같이 입력하면 비밀번호를 입력라고 나올텐데
우리가 설정했던 마스터 비밀번호 1234를 입력해주면

image

위와 같이 mysql에 접근할 수 있는 것을 확인 할 수 있다.
실제로 show databases;를 입력해서
우리가 데이터베이스를 만들때 추가구성에서 넣었던 이름인
test 데이터베이스가 있는 것을 확인할 수 있다.

이제 정상적으로 데이터베이스가 작동된다는 것도 확인하였고
이제 EC2에서 S3와 RDS를 연결해줘야한다.


클라이언트 - 서버 - DB

위에서 클라이언트와 데이터베이스까지 생성하고 설정까지 끝냈다.

EC2는 생각보다 간단하다.
여태까지 우리가 많이 설정해왔던 방식이고 익숙하기 때문이다.

.yml파일이거나 혹은 .properties파일에 설정해주면된다.
.properties파일로 만들었으니 해당 기준으로 적어본다.

spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.datasource.url=jdbc:mysql://[AWS RDS 엔드포인트]/test?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=[RDS 마스터 이름]
spring.datasource.password=[RDS 마스터 비밀번호]
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
config.domain=[AWS S3 엔드포인트]

위에 처럼 이제 우리가 모두 알 수 있는 정보다

RDS를 만들었기에 엔드포인트를 알 수 있고
마스터 이름과 비밀번호도 우리가 생성했다.

그리고 S3와 연결하기 위해 즉, 클라이언트와 연결하기위해
AWS S3 엔드포인트를 설정해주면 클라이언트에서
API 요청이 오면 이제 정상적으로 EC2 서버에서 작성한 프로그램대로
동작하는 모습을 확인할 수 있을 것이다.



이렇게 아주 기초적인 3티어 아키텍처로
인스턴스를 만들어서 배포를 진행 해보았다.

배포하는 과정에 엄청 공부할게 많구나라고 느꼈다.
지금은 거의 따라하는 수준이지만… 나중에는 실제로 운영을하려면
입맛에 맞게 변경하고 관리를 해야하기 때문에 AWS에 대한
공부가 필요해 보였다.

어제 오늘 이렇게 배포를 해보면서 대략적인 감을 익혔고
같이 페어했던분이랑 너무 재밌게해서
더 오래 기억에 남을 것 같다.

오늘 공부는 여기서 끝 !!


오늘의 커피량: ☕️ ☕️ ☕️
오늘의 점심: 김치찌개, 스팸계란부침, 밥