[AWS] EC2와 RDS. 연동하기

채록·2021년 5월 6일
3

AWS&Docker

목록 보기
1/12
post-thumbnail

새로 시작한 JELLOgram을 AWS의 EC2 서버로 AWS의 RDS에 배포해보자! 그러기 위해서 AWS의 EC2, RDS 무엇인지에 대해 알아보고자 한다.

요약 : EC2, RDS, S3
EC2 : AWS의 가상 server
RDS : AWS 가상 DB
+) S3 : AWS의 가상 Storage




AWS

Amazon Web Services의 줄임말.
아마존(Amazon)에서 제공하는 클라우드 서비스로, 네트워킹을 기반으로 가상 컴퓨터와 스토리지, 네트워크 인프라 등 다양한 서비스를 제공하고 있다. => 클라우딩 컴퓨팅 서비스!

출처: https://goddaehee.tistory.com/174 [갓대희의 작은공간]


1. 클라우딩 컴퓨팅?


2. EC2

Elastic Compute Cloud의 줄임말. AWS에서 가장 먼저 제공된 서비스이다.
아마존닷컴의 클라우드 컴퓨팅 플랫폼 아마존 웹 서비스의 중앙부를 이루며, 사용자가 가상 컴퓨터를 임대 받아 그 위에 자신만의 컴퓨터 애플리케이션들을 실행할 수 있게 한다.


즉, 다양한 OS 버전의 가상서버를 제공하는 아마존의 웹 서비스이다.


- EC2 region

현재 AWS는 여러 나라에 데이터 센터를 구축하였으며 총 20여개의 센터가 세워져 있다. 사용자는 특정 region을 선택에 어느 지역의 테이터 센터를 사용할 것인지 선택해야 한다.


기본적으로 "오하이오"가 선택되어 있다. 주의해야 할 것은 내가 위치한 곳과 가까운 region을 선택해야 최적의 속도로 통신할 수 있다.


- EC2 instance

EC2 서비스를 사용하는 "컴퓨터"의 갯수를 의미한다. instance가 2개라면 AWS의 EC2 서비스를 통해 두대의 컴퓨터 서비스 분량을 사용중이란 뜻이다.

참고로 무료등급인 프리티어의 경우 1년동안만 무료로 이용 가능한 instance들이 있다. 30GB 메모리를 무료로 제공하는데 1년 후 자동으로 결제 되니 결제를 원하지 않으면 꼭! 해제해야 한다.

- EC2 보안

AWS의 EC2는 프라이빗 키와 퍼블릭 키로 구성된 키 페어 형태로 보안을 구성한다.
키 페어를 사용하여 인스턴스 로그인 정보를 보호한다. (AWS는 퍼블릭 키를 저장하고 사용자는 프라이빗 키를 안전한 장소에 보관하는 방식) 이에 따라 프라이빗 키 번호를 가진 유저는 접근이 가능하다.

3. RDS

Relational Database Service의 줄임말.
아마존 관계형 데이터베이스 서비스(Amazon Relational Database Service) 또는 아마존 RDS(Amazon RDS)는 아마존 웹 서비스(AWS)가 서비스하는 분산 관계형 데이터베이스이다.

출처 : https://devjjo.tistory.com/31

🔥 RDS 사용 vs EC2에 DB 생성

  • EC2는 내가 직접 리눅스 위에 사용하려는 DB(oracle, mysql, postgresql등)를 설치하고 그 위에 서비스하는 것
  • RDS는 EC2와 함께 사용하며 아마존에서 DB의 설정, 운영, 백업 등의 기능을 편하게 이용할 수 있게 해주는 EC2와 분리된 DB전용서버이다.

비용적인 면에서는 RDS 사용시 추가 비용이 발생하기 때문에 개발자로써는 EC2를 이용해 DB를 설치하는 것이 권장된다고 한다!. 그러나 아직은 실습 단계이므로 EC2와 RDS를 따로 지정하여 RDS가 제공하는 DB 최적화 기능을 누려보고자 한다.



4. S3

Simple Storage Service 의 줄임말.
아마존 S3는 아마존 웹 서비스에서 제공하는 온라인 스토리지 웹 서비스로 흔히 bucket이라 불린다.


S3의 bucket은 무한개의 객체를 저장할 수 있으므로 이후의 확장과 축소에 대해 고려하지 않아도 무관하다.


- S3 기본 개념 : 객체, 버킷, 표준스토리지, RRS

객체(Object)
S3에 데이터가 저장되는 기본 단위로써 파일과 메타데이터로 이루어져있다. 객체 하나의 크기는 1Byte부터 5TB까지 허용되며 메타데이터는 MIME 형식으로 파일 확장자를 통해 자동으로 설정되며 사용자 임의로도 지정 가능하다.

버킷(Bucket)
S3에서 생성할 수 있는 최상위 디렉토리의 개념으로 이름은 S3 리전 중에서 유일해야 한다. 계정별로 100개까지 생성 가능하며 버킷에 저장할 수 있는 객체수와 용량은 무제한이다.

표준스토리지
S3 서비스 수준 계약으로 객체에 대해 99.999999999%의 내구성을 보장하며 99.99%의 가용성을 제공한다. 하지만 높은 내구성을 보장해야 하는 만큼 비용이 높으므로 유실되면 안되는 원본 데이터, 민감정보, 개인정보 등의 중요한 데이터를 저장하는 것이 알맞다.

RRS(Reduced Redundancy Storage)
표준 스토리지보다 저렴한 비용으로 데이터를 저장할 수 있다. RRS 옵션은 여러 시설 전반에 다양한 디바이스에 객체를 저장하며 일반 디스크 드라이브의 400배에 달하는 내구성을 제공하나 표준 스토리지 만큼 많이 객체를 복제하지는 않으므로 원본을 복제한 데이터나 가공한 데이터(예를 들어 썸네일 같은)의 저장에 알맞다.

출처: https://usefultoknow.tistory.com/entry/Amazon-S3란-무엇일까 [UsefulToKnow]


---------------------------


<EC2>

Step 1. EC2에 새 instance 생성하기

프리티어 서비스를 사용중이다.
따라서 프리티어에서 사용 가능한 Ubuntu Server 18.04 LTS (HV<), SSD Volume Type 64bit를 사용한다.

CPU 유형으로는 프리티어 등급에서 사용 가능한 t2.micro를 선택한다.

t2.micro

  • t는 instance family를 나타낸다. (t 외에도 M, C, 등이 있다)
  • t2의 2는 인스턴스의 세대를 나타낸다.
  • micro 는 인스턴스의 크기를 나타낸다.


    마이크로(T)
  • 인스턴스 크기별 기본 수준의 CPU 성능 제공
  • 간헐적으로 높은 성능이 필요할 때 유휴시간에 모아 놓은 크레딧을 기반으
    로 버스팅하여 높은 성능을 제공
  • 적용사례 : 개발환경, 소규모 웹, 마이크로 서비스

🔥 서브넷에 배치되는 EC2

EC2의 새 instance를 생성할때 서브넷을 사용하도록 한다.

VPC

Virtual Private Cloud의 줄임말.
사용자의 AWS계정 전용 가상 네트워크 이다. (vpc와 서브넷으로 구성된 가상 네트워크를 제공한다.)

  • VPC환경을 사용하면 IP주소를 기반으로 한 논리적인 네트워크 환경을 구축할 수 있다.
  • 방화벽 같은 접근제어 정책을 설정할 수 있다.

퍼블릭 IP 자동 할당
이를 활성화 하면 동적으로 공인 IP주소가 할당된다. (EC2 instance가 재시작 될때마다 자동으로 변경된다.

고정된 IP주소를 사용하려면 elastic IP 설정 을 하면 가능하다.

종료방식 : 중지

  • 중지 : EC2 instance shot-down 시 OS가 정지되어 OS이미지가 고정되고, 재 시작시 같은 상태로 시작된다.
  • 종료 : OS를 정지하는것과 동시에 EC2 instance가 삭제된다.
  • 종료방지 기능 활성화 : ON 해준다.

프리티어 이므로.. 추가요금 발생하는 옵션은 선택하지 않는다.


Step 2. Storage 추가

- EBS

Elastic Block Storage의 줄임말.
EC2 instance 에 직접 붙혀서 사용하는 볼륨형 스토리지이다.

기본 8GB로 설정! (더 높으면 과금된다)


- 태그 추가하기

EC2 resource tag를 지정해서 비용을 관리하거나 IAM정책 권한을 제어할 수 있다. => 용도에 따라 태그를 지정한다!

간단하게 지정한다.
키 = Chyun
(태그)값 = 1st_project


보안 그룹 구성

EC2에서는HTTP와 HTTPS에서도 접근이 가능하게 해야한다. 이를 위해서 규칙을 추가해준다.
기본적으로 모든 IP주소에서 SSH에 접근이 가능하도록 설정되어 있다.

SSH ?
Secure Shell Protocol의 줄임말. 즉 네트워크 프로토콜 중 하나로 컴퓨터와 컴퓨터가 인터넷과 같은 Public Network를 통해 서로 통신을 할 때 보안적으로 안전하게 통신을 하기 위해 사용하는 프로토콜.

때문에 EC2에서 port 번호 8000으로 웹 서버를 돌렸을때 API호출이되게 하려면 port 번호 8000으로 어떤 IP에서든 접속이 가능하도록 설정을 해주어야 한다 => 규칙을 추가한다!

  • 규칙 추가
  • Port 범위 : 8000
  • 소스 : 위치 무관

Step 3. 새 키페어 생성, Instance 시작

새로운 instance를 만들었다면 키페어를 생성해 주어야 한다.

이후에 키페어 다운로드할때 첫 생성시에만 가능한 것이므로 경로를 기억해둔다!!
이제 instance 시작하면 생성 완료 (pending 시간이 조금 걸린다)


pem 권한 설정

다운로드 받은 pem file을 들어가 권한을 변경해주어야 한다. => 그래야 SSH 접속이 가능하다!

이 과정은 터미널에서 진행한다

> chmod 400 Chyun.pem
> ssh -i Chyun.pem ubuntu@'공인IP주소'

공인IP주소는 시작된 EC2 isntance 내역에서 확인 가능하다.
위 명령어를 입력하면 EC2 server에 접속완료.

---------------------------


<RDS>

Step 1. 파라미터 그룹 생성

파라미터 그룹 ?
하나 이상의 DB인스턴스에 적용되는 엔진 구성값의 컨테이너. AWS RDS는 파라미터 그룹 설정을 통하여 네트워크 접속 프로토콜을 사용할 수 있도록 한다.


DB 인스턴스를 파라미터 그룹과 연결하여 DB 엔진 구성을 관리하는데 파라미터 그룹을 지정하지 않고 DB 인스턴스를 만드는 경우 DB 인스턴스에서는 기본 DB 파라미터 그룹을 사용한다. 여기엔 인스턴스의 엔진, 컴퓨팅 클래스 및 할당된 스토리지에 따른 데이터베이스 엔진 기본값과 Amazon RDS 시스템 기본값이 들어 있다.


DB종류에 따라 파라미터 그룹 패밀리를 설정할 수 있다. => mysql 5.7로 선택
그룹이름project-seoul이라고 지정 (region이 서울이라....)


파라미터 그룹 커스텀

문자열 표기 방식에 대한 설정을 지정한다.

  • character_set~~ 항목들 : 모두 utf8mb4로 지정한다.
  • collation_connection : utf8mb4_general_ci 로 지정

변경사항 저장


Step 2. DB 생성

표준 생성으로 진행한다.
엔진 옵션은 우리가 사용한 MySQL로 진행.
버전은 기본으로 설정되어 있는 MySQL 5.7.26으로 진행.
등급은 프리티어로 진행 (한달동안 720시간 무료!)
DB 인스턴스 식별자 : wecode project

참고 !! 추가적인 DB
하나의 RDBMS 시스템 안에 여러개의 DB를 구축할 수 있다. DB 하나 추가한다고 새로운 DB인스턴스를 만들진 말자.
=> 그러나 이럴 경우 720시간이 두배로 닳는다.. 어쨋든 과금 포인트! 안쓰는건 중지하자.

자격 증명 설정
마스터 사용자 이름 : root
비밀번호 : 내 로컬DB에 비밀번호 지정한 것 처럼 비밀번호 지정해준다 => 똑같게 X (보안상)

DB 인스턴스 크기
프리티어이기때문에 자동으로 설정됨

스토리지 설정
범용(SSD)
할당 : 20GB
! 자동조정 활성화 XXXX

VPC
기본값으로 설정하되 퍼블릭 엑세스 가능은 활성화 한다.

VPC 보안그룹
기존것이 없을 경우 새로 생성한다.

가용 영역
내 region의 a ver 을 선택한다.

DB port
3306 : MySQL의 기본 통신 port값.

DB 인증
암호 인증 : 접속 시 비밀번호를 입력해서 접근한다.

DB 옵션
초기 DB 이름 설정 후 아까 만든 파라미터 그룹으로 지정해준다.

삭제 방지
꼭 활성화 해준다.


Step 3. 터미널에서 RDS로 접근하기

퍼블릭 엑세스 허용 확인 / 엔드포인트 주소 확인 / 보안그룹 설정 확인

보안 그룹 설정
기본값으로 전체가 아닌 내가 생성한 위치에서만 허용되어 있다. 따라서 설정을 변경해 준다.
Inbound = 들어오는 통신
Outbound = 나가는 통신


물론 Inbound는 특정 지어서 허용해주는것이 좋다 (보안상!) 그러나 어디서든 접속 가능하게 해주기 위해 이를 변경해준다.

  • 인바운드 규칙 편집 : 소스-위치무관후 규칙저장


    => 전 세계 어디서나 접속 가능해졌다!

RDS DB 목록

전에 만든 sweethome DB가 있음


Step 4. 로컬 DB내용을 RDS로 옮기기 (dump)

지금부터 DB를 채우는 것이 아니라 이미 로컬 DB에 있는 내용을 배포하기 위해 옮길때!
이에 대한 내용은 이 글을 참고한다.

RDS DB이름 : jellogram_ver1


- dump 전 RDS의 DB에 table 없음 확인


- 로컬DB dump 뜨기

---------------------------


<EC2와 RDS 연동하기>

Step 1. 가상환경 설치 (miniconda)

나의 MacOS환경에서와 마찬가지로 서버는 모두 가상환경에서 가동한다. 때문에 Ubuntu환경으로 세팅된 EC2에도 miniconda를 설치해준다.

이후 가상환경을 활성화한다.

source .bashrc

그리고 나서 apt-get 명령어로 package들을 update&upgrade 해준다

sudo apt-get update
sudo apt-get upgrade

이후 mysqlclient설치 전 gcc를 먼저 설치해준다. 그래야 에러가 나지 않는다!

gcc ?

이후 mysqlclient도 설치

sudo apt-get install gcc
sudo apt-get install libmysqlclient-dev

이제 세팅은 끝! 프로젝트를 위한 가상환경을 생성해준다

conda create -n new_project python=3.9

Step 2. repo가져오기

git clone #repo주소

🔥 해당 Repo의 requirements.txt를 확인하고 필요한 Package들을 모두 설치한다.

pip install -r requirements.txt

Step 3. settings.py 수정하기

  1. settings.py에 EC2의 퍼블릭IP정보를 입력한다.
  2. my_settings.py에 mysql 설정과 secret key정보를 입력한다.
#settings.py
ALLOWED_HOSTS = ['*', '퍼블릭IP', '퍼블릭IP:8000']

#my_settings.py
HOST : rds_mysql의 host wnth
PASSWORD : mysql의 서버접속 비번 (EC2용)

RDS HOST ?
RDS의 데이터베이스-인스턴스에서 엔드포인트를 확인한다!!


Step 4. runserver

postman을 활용해 endpoint가 잘 구현되는지 확인한다.

# 로그인 API 확인


🔥 EC2 vs gunicorn

django에서 manage.py runserver단일스레드로 동작한다. 때문에 개발 및 테스트에서는 적당하지만 request가 많은 운영환경에서는 적합하지 않다. 때문에 멀티스레드를 지원하는 web-application인 gunicorn을 설치해 배포하도록!

---------------------------


Step 1. gunicorn install

gunicorn ?
web-application server가 있고 여기서 django web-application을 가동해 준다.

pip install gunicorn

이후 SSH세션이 끊어져도 계속해서 서버를 가동해주기 위해 nohub을 이용해 background에서도 gunicorn이 가동도되록 한다.


Step 2. nohup 세팅, runserver

# nohub 사용없이 gunicorn에서 server 가동
gunicorn --bind=0.0.0.0:8000 jellogram_rds.wsgi

# nohub으로 background에서 계속 runserver
nohup gunicorn --bind=0.0.0.0:8000 jellogram_rds.wsgi &

# ps -ef | grep python
제대로 server가 실행되고 있는지 확인하는 명령어

# kill 포트번호
해당 포트번호의 server가동을 중지한다.
  • wsgi : django의 web-application을 지정해 주는 역활
  • & : background로 동작하는 명령어

---------------------------


끝!

확인과정

  • ssh -i 명령어로 EC2 server에 접속
  • EC2 server 내 가상환경 활성화 jello
  • runserver로 확인 ...1
  • pip install gunicorn으로 gunicorn 설치
  • nohup 명령어로 background에서 gunicorn 실행
  • postman으로 통신 확인 완료!

체크할 것

  • EC2 only vs EC2+RDS
profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글