티스토리 뷰

프로그래밍 공부/AWS

AWS : Ruby on Rails ↔ AWS RDS 서버 연동 (PostgreSQL 기반)

마음 따뜻한 개발자, 나른한 하루 2020. 1. 15. 23:33

해당 글은 https://blog.naver.com/kbs4674/221420109694 로 부터 게시글이 이전되었습니다.

 

 좌 : A서버 / 우 : B서버

서버는 다르더라도 두 서버의 DB는 하나의 외부 DB(RDS)를 공유하고 있기 때문에 보여지는 DB가 같음.

(즉, A서버에서 DB 데이터를 생성하면, B서버에서도 같은 결과가 보여짐.)

 

 시작 전 유의사항(종합) 

1. AWS 계정이 이미 있다는 가정 하에 설명합니다.

2. PostgreSQL v9.5.15 사용을 기반으로 설명하겠습니다.

3. Ruby on Rails 및 AWS의 기본지식을 가지고 시작하시는게 좋을겁니다.

4. 레일즈 환경은 Production Mode를 중점으로 설명하겠습니다.

5. Figaro Gem을 활용합니다. 자세한 설명은 생략합니다.

 ※ 참고 : Figaro Gem [클릭]

6. Window OS 기준으로 설명합니다.


그동안 Ruby on Rails에서는 데이터 보관에 있어서 로컬서버에 저장하는 방식으로 이용되어왔습니다.

 

Ruby on Rails 프로젝트 내에 있는 DB (db/development.sqlite3)

 이번 시간에는 해당 DB를 로컬저장 방식이 아닌 AWS를 이용한 RDS 저장방식을 사용해보겠습니다.

 

 

  • AWS RDS 소개

 

앞서 말했지만, RDS는 AWS에서 사용자의 DB를 전문적으로 관리해주는 서비스입니다.

 

▲ RDS 이점

[참고 : https://www.slideshare.net/awskorea/amazon-rds-aws]

 

RDS를 사용함으로서 위와같이 사용자의 관리부담을 줄여줍니다.

기존의 사용자의 운영방식과 AWS EC2 및 RDS를 사용함으로서 사용자가 얼마나 관리를 덜 해낼 수 있는지 위 그림과같이 설명을 해줍니다.

개인적으로 저는 RDS의 강점을 손 꼽으라 하면 사전에 DB 관련 패키지를 설치를 안해도 된다는 점, DB 관리 자동화 이 2가지를 손에 꼽고 싶네요.

이제 본격적으로 다음 챕터에서 RDS 연동법에 대해 설명을 이어나가겠습니다.

 

 

 Chapter 1  AWS:RDS 서비스 셋팅

 시작 전 참고 

1) AWS 계정이 이미 있다는 가정 하에 설명합니다.

2) PostgreSQL v9.5 DB 사용을 기반으로 설명하겠습니다.

3) Ruby on Rails 및 AWS의 기본지식을 가지고 시작하시는게 좋을겁니다.

 

1. AWS 로그인 및 RDS 서비스로 이동합니다.

 

2. RDS 페이지에 접속하셨다면,  데이터베이스 생성  버튼을 클릭합니다.

 

3. 사용하고자 하는 DB를 선택합니다.

 참고 1  해당 예시에서는 PostgreSQL 을 선택하겠습니다.

 참고 2  하단에 RDS 프리 티어에 적용되는 옵션만 사용 체크 옵션은 무시해도 됩니다.

 

그리고  다음 단계  버튼을 눌러주세요.

 

4. 어떤 목적으로 사용하실건지 선택을 해주세요.

그리고 이어서  다음 단계 

 

5. 자신의 환경을 고려해서 DB 환경을 셋팅해주세요.

 

설정을 다 하셨다면, 이제 최종적으로  데이터베이스 생성   버튼을 클릭해서 RDS를 생성합니다.

 

6. RDS가 생성되는데 약 3~5분의 시간이 소요됩니다.

RDS가 생성될 동안, PostgreSQL 인바운드 규칙을 수정하겠습니다.

 

1) RDS Dashboard에 보시면 방금 전 생성시킨 자신의 RDS가 보이는데, 보안그룹의 명칭(링크)을 클릭해서 보안그룹 설정으로 이동합니다.

 

2) 보안그룹 설정 페이지에 가셔서 RDS 보안그룹(VPC)을 체크 후, 작업 메뉴에서 인바운드 규칙 편집 을 클릭합니다. 

 

3) 인바운드 규칙편집이 된 유형이 하나 보이는데, PostgreSQL 인바운드의 소스를 '위치무관' 으로 설정 후,  저장  버튼을 눌러줍니다.

이러면 일단 인바운드 규칙 설정은 끝났습니다.

 

7. 이제 AWS상의 RDS 설정은 모두 끝났습니다. 이어서  Chapter 2  에서 Ruby on Rails 프로젝트를 건들여보는 작업을 하겠습니다.

 

 

 Chapter 2  Ruby on Rails 프로젝트 작업

 시작 전 참고 

1.  Chapter 1  의 과정이 이미 마쳐져 있어야 합니다.

2. 레일즈 환경은 Production Mode를 중점으로 설명하겠습니다.

3. Figaro Gem을 활용합니다. 자세한 설명은 생략합니다.

 ※ 참고 : Figaro Gem [클릭]

 

1.  config  디렉터리에서  application.yml  파일을 만들어낸 후, 다음 내용을 입력합니다.

## config/application.yml
 
## PostgreSQL
DB_NAME: "※※※※※※" # PostgreSQL DB 테이블 이름 (아무렇게 지어도 됩니다.)
RDS_End_Point: "×××××.×××××.ap-northeast-2.rds.amazonaws.com"
RDS_MASTER_NAME: "×××××" # RDS 계정
RDS_PASSWORD: "××××××××××" # RDS 마스터 암호

 참고 

1) DB_NAME : 데이터베이스 이름을 입력하는 곳입니다. 예시적으로 저는 DB_NAME을 likelion이라고 함으로서,

production Mode에서는 데이터베이스 이름을 likelion_production 이라고 명칭을 지을 예정입니다.

2) RDS_End_Point :  Chapter1  으로 잠시 돌아가서, 생성된 RDS 작업이 다 끝났을 경우, 엔드포인트 주소가 보여질겁니다.

해당 주소를 host 큰 따옴표 안에 적어주세요.

 

2. Git Push를 방지하고자  .gitignore  파일에  application.yml  파일을 push 목록에서 제외합니다.

1)  .gitignore  적용 전 Git 캐시을 삭제합니다.

git rm -r --cached .

 

2)  .gitignore  파일이 없을 경우 레일즈 프로젝트의 상단에 생성해주세요. (Gemfile, Gemfile.lock 파일이 있는 위치)

 

3)  .gitignore  파일에 다음 내용을 추가합니다.

## .gitignore
 
config/application.yml

 

2.  config/database.yml  에 접속합니다.

 

3.  database.yml  파일에서 다음과 같이 내용을 수정해주세요.

* 아래 코드는 연습용 예시입니다. 기호에 맞게 수정하셔도 됩니다.

## config/database.yml
 
default: &default
  adapter: postgresql
  host: <%= ENV["RDS_End_Point"] %>
  port: 5432
  encoding: utf8
  sslmode: allow  
  pool: 5
  username: <%= ENV["RDS_MASTER_NAME"] %>
  password: <%= ENV["RDS_PASSWORD"] %>
 
development:
  <<: *default
  database: <%= ENV["DB_NAME"] %>_<%= Rails.env %>
 
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: <%= ENV["DB_NAME"] %>_<%= Rails.env %>
 
production:
  <<: *default
  database: <%= ENV["DB_NAME"] %>_<%= Rails.env %>

 참고1  Rails_env 변수는 해당 Rails 프로젝트의 서버 환경이 무엇이냐에 따라 이름이 달리 보여집니다. (development, test, production)

 참고2  서버 환경에 따라 생성되는 데이터베이스 이름이 다릅니다. (예 : Production 모드에서는 DB 이름은 (DB이름)_Production)

 

4. 이제 거의 다왔습니다..

마지막 과정으로  Chapter 3  에서 Rails 프로젝트와 AWS:RDS 서비스와 연동을 해보겠습니다.

 

 

 Chapter 3   Ruby on Rails 프로젝트와 AWS:RDS 서비스 연동 하기

1. 이제 모든 준비는 끝났습니다.

PostgreSQL 사용을 지원하는 pg Gem을  설치 전, pg Gem을 지원하는 패키지를 설치해야 합니다.

 

터미널에 아래 명령어를 입력해주세요.

1) 운영체제 : 리눅스(Linux)인 경우

sudo su
yum install -y postgresql95 postgresql95-server postgresql95-libs postgresql95-contrib postgresql95-devel
exit
bundle install

 

2) 운영체제 : 우분투(Ubuntu)인 경우

sudo apt-get update
sudo apt-get -y install libpq-dev
sudo apt-get -y install postgresql postgresql-contrib

 

2. 이제 본격적으로 PostgreSQL 을 쓰기위해  Gemfile  로 이동 후, Gem을 설치해주세요.

## Gemfile
 
... (내용 생략) ...
 
gem 'pg'

그리고 Gem을 설치합니다.

bundle install

위 과정까지가 본격적인 PostgreSQL 기반 설치였습니다.

 

3. 우선 SQLite 때와는 다르게 데이터베이스를 따로 생성해줘야 하는 과정이 필요합니다. 데이터베이스를 생성을 해줍니다.

rake db:create RAILS_ENV=production

 

4. Ruby on Rails 프로젝트의 터미널에 다음 명령어를 입력해주세요.

rake db:migrate RAILS_ENV=production

그럼 DB가 RDS서버로 넘어가는게 확인이 됩니다.

 

5. Seed를 쓰길 원하신다면 Seed 역시 평소와 같은 명령어를 쓰면 됩니다.

rake db:seed RAILS_ENV=production

 

6.기존의 방법으로 DB를 삭제(Drop)할 경우, 에러메세지가 뜨는게 확인이 될겁니다.

Drop을 하고 싶으시면 위 터미널 안내와 같이, 

rake db:drop RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1

위 명령어를 입력하시면 됩니다.

 참고1  drop을 하실 땐, 레일즈 서버를 끄고 작업을 하셔야 합니다.

(한 명 이상의 타 유저가 DB를 열람하고 있는 상태일 경우 drop이 금지됩니다.)

 

 참고2  drop을 하게 되면 데이터베이스 자체가 날라가게 됩니다. 이 점 유의바랍니다.

 

 

 보안강화 Tip  허용된 IP만 RDS에 접근 할 수 있게

 실습 전 참고   호스트 서버를 AWS EC2를 쓴다는 가정하에 설명합니다.

 

저희가  Chapter 3  을 해내면서 DB의 접근권한을 위치에 무관하게 어디서든 접근할 수 있게 허용을 했었는데 실제 서비스를 운영하실 때에 있어 이 방법은 위험한 방법입니다. 보안을 위해 안전한 방법을 소개하겠습니다.

 

1. 자신의 AWS EC2에 고정 IP(AWS Elastic IP)를 설정해주세요.

 참고자료  AWS Elastic IP(탄력적 IP) 설정법 [클릭]

 

2. RDS 인바운드 설정을 하기위해 보안그룹 설정창으로 이동해주세요.

(보안그룹 설정은 EC2 대시보드에서 좌측메뉴에 '보안 그룹' 이라고 있습니다. 혹은 RDS 대시보드를 통해 가셔도 됩니다.)

 

3. 인바운드 규칙을 재설정합니다.

PostgreSQL 허용범위를 '사용자 지정'으로 설정하고, EC2에 적용된 Elastic IP 주소를 등록해주세요.

 참고  나중에 HeidiSQL 프로그램으로 접속을 원할 시 나의 IP 주소를 추가해줘서 접속해주셔야 합니다.

 

 

 부록  온라인으로 PostgreSQL DB서버 접근

 실습 전 참고  Window OS 기준으로 설명합니다.

https://www.heidisql.com/download.php "

1. 위 사이트에 접속해서 HeidiSQL 프로그램을 다운로드 및 설치를 합니다.

 

2. HeidiSQL 프로그램을 실행합니다.

 

3. 로그인을 진행합니다.

 참고  호스트명은 RDS 엔드포인트 주소, 사용자/암호는 RDS 마스터 계정입니다.

 

4. 로그인을 하면 RDS의 PostgreSQL의 DB열람을 확인하실 수 있습니다.

 

 

  • 자료 참고

1. RDS AZ 가용영역 개념 [클릭]

2. RDS PostgreSQL DB 접속하기 [클릭]

3. RDS 설정 개념 설명 [클릭]

댓글
  • 프로필사진 갤선생 안녕하세요. 블로그 잘 보고 있습니다.
    하나 궁금한게 있는데요.. 사용 중인 서비스에서 rake db:drop을 해버렸으면 데이터가 다 날라가잖아요?
    다시 복구할 방법은 없나요?

    그리고 로컬 환경에서 rake db:drop을 했고 그걸 배포한 것도 아닌데 상용 중인 서비스의 db가 영향을 받을 수 있나요:?
    2020.08.27 23:12 신고
  • 프로필사진 마음 따뜻한 개발자, 나른한 하루 1. 백업을 두지 않는 한, 아쉽게도 복구할 방법은 없습니다.. (레일즈 프레임워크가 자체적으로 백업을 하진 않아서요..)
    2. Production Environment와 DB 연동된 상태에서 RAILS_ENV=production rake db:migrate 만 입력하지 않으면 본 서비스에는 영향이 없습니다.
    2020.09.05 13:23 신고
댓글쓰기 폼
공지사항
Total
54,001
Today
29
Yesterday
104
링크
«   2020/11   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
글 보관함