[TIL] Cloud 운영 환경 구성 2
코드스테이츠 백엔드 부트캠프 D+108
저번주에는 기본적인
Cloud 운영 환경에 대한 구성들을 배워 보았다.
이번 공부에서는 3티어 아키텍처 형태로 배포하는 방법을
배울 것이고, 저번주에 EC2에 서버를 배포해보는 것까지 해봤었다.
그 중에서도 우리는 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 명령을 실행할 것 인데
이전에 우리는 처음에 보았던 이그림을 볼 필요가 있다.
현재 클라이언트와 서버가 연결되기 위해서는
build하기 전에 EC2의 주소를 이용해 환경변수로 설정해
연결을 해준 후 build를 진행해야 우리의 EC2 인스턴스와 연결되는 것 같다.
아직 클라이언트 측의 구성이 정확히 어떻게 되어있는지 이해가 가진 않았다.
하지만 React에서 환경 변수를 사용할 경우 .env
파일을 이용해
보안과 유지보수에 용이하게 사용하는 것 같다. (ENV? - 출처: carmack-kim님 블로그)
우선 코드스테이츠 측에서 배포용으로 만들어준
클라이언트 프로그램에 .env
파일에 EC2 경로를 추가해줘야한다.
내 EC2 인스턴스의 퍼블릭 IPv4 DNS
를 입력해주면 된다.
환경 변수 설정이 끝났으면 이제 npm
을 이용해 build를 진행해주면된다.
npm run build
를 입력해주면 build가 되어질 것이고
Compiled successfully
가 콘솔에 확인된다면
정상적으로 완료되었을 것이고 build 폴더가 생겼을 것이다.
이제 클라이언트 프로그램이 build가 되었으니
AWS의 S3 버킷에 올리기만하면 된다.
2. build 파일 업로드
여기서 버킷은 만들어져있다고 가정하고
만들어진 버킷을 보면 여러가지 확인과 설정을 할 수 있다.
객체에는 우리가 build한 파일을 업로드해주면된다.
3. 정적 웹사이트 호스팅 및 정책 설정확인
속성에서 정적 웹 사이트 호스팅 편집이 가능하다.
활성화를 눌러준 후 여러 설정을 할 수 있다.
그리고 변경 저장을하면 엔드포인트를 확인할 수 있다.
해당 엔드포인트로 접속 시 우리가 빌드한 html을 확인할 수 있다.
하지만 만약 퍼블릭 엑세스 활성화를 하지 않았다면
403 Forbidden 화면을 보게 될 것이다.
아래에서 설정해보자
4. 퍼블릭 엑세스 활성화
권한 텝에서 먼저
모든 퍼블릭 엑세스 차단 체크박스를 해제하고
변경 사항을 저장해준다.
그리고 버킷 정책에서
편집 -> 정책 생성기를 눌러
정책에 대한 내용을 적어준다.
해당 부분은 추후에 어떤 정책인지에 대한 내용은
어드벤스한 공부가 필요해보인다..
우선 위와 같이 입력 완료 후
하단에 Add Statement를 눌러주면 Json 형태로 객체가 하나 나온다.
해당 코드 값을 복사해 정책 코드란에다가 붙여 넣어주면 된다.
그리고 변경 사항 저장을 눌러주면
해당 버킷에 대한 정책이 적용되어 퍼블릭 엑세스가 가능해진다.
아마 어디서든 접근이 가능하게 만들어진 것 같다.
우선 이렇게 클라이언트에 배포를 하고 정책을 설정에 권한 부여를
할 수 있다는 흐름만 이해해야할 것 같다.
이제 정상적으로 엔드포인트에 접속하면 우리가 만든 화면을 볼 수 있다.
여기서 알아둬야할 점은 클라이언트 S3에 설정이 끝났을 뿐
EC2에서는 S3의 엔드포인트를 config.domain에 설정해줘야한다.
설정해보기전에 RDS먼저 셋팅을 진행해보자
데이터베이스 연결
이제 RDS 인스턴스를 생성하고 연결해보자
상단에서 RDS를 검색하여 데이터베이스 생성을 눌러준다.
사용하려는 데이터베이스의 엔진을 선택 !
나는 MySQL을 사용
템플릿은 프리티어로 설정했다. 프리티어로 설정하면
MySQL의 db.t2.micro 인스턴스는 750시간이 무료사용 가능한 것 같다.
참고 - AWS 프리티어
여기서 이제 우리가 기억해야하는 부분이 나왔다.
✅ 마스터 사용자 이름과 마스터 암호는
나중에 DB에 접근할때 꼭 필요한 값이니 기억해두거나
어딘가에 저장해두자 !
위에서 얘기했던 무료로 사용하기 위해 해당 옵션으로 설정
퍼블릭 엑세스는 허용으로 해준다.
그리고 데이터 베이스를 사용하기 위한
포트번호를 설정해둔다. 기본값은 3306이고
13306으로 변경해서 사용하려고 변경했다.
추가 구성을 눌러
데이터 베이스의 이름을 설정해줄 수 있다.
이름을 지정한대로 후에 조회할때
해당 데이터 베이스 이름으로 조회가 된다. (test라고 지정했다고 가정하자)
이제 모든 설정은 끝났으니
맨 하단에 데이터베이스 생성을 눌러 만들어주자
데이터베이스가 생성이 완료되면
엔드 포인트와 설정했던 포트가 확인된다.
이제 우리는 이 데이터베이스로 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를 입력해주면
위와 같이 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에 대한
공부가 필요해 보였다.
어제 오늘 이렇게 배포를 해보면서 대략적인 감을 익혔고
같이 페어했던분이랑 너무 재밌게해서
더 오래 기억에 남을 것 같다.
오늘 공부는 여기서 끝 !!
오늘의 커피량: ☕️ ☕️ ☕️
오늘의 점심: 김치찌개, 스팸계란부침, 밥