* 글 작성에 앞서, 이 글의 목적은 숙달자의 정보전달이 아니라 초심자의 기록 남기기에 가깝다. 이해가 부족한 상태에서 경험의 과정을 적으니, 미숙한 점이 많이 있을 것이므로 양해 부탁드린다. 또, 미숙함에 대한 지적은 대환영이지만 기본적으로 이 포스팅은 대부분 일방적인 기록 남기기에 가까우니 피드백이 적을 수 있다. 다만 필자뿐 아니라 같은 글을 보는 다른 독자들을 위해 또 하나의 필자가 되어 부연설명을 해 주신다면 감사할 따름이다.


Rails 애플리케이션은 기본적으로 sqlite를 데이터베이스로 사용한다. 따라서 다른 데이터베이스를 사용하기 위해서는 추가적인 설정이 필요하다.

먼저 MySQL을 사용하기 위해 로컬에 MySQL을 설치하고, Amazon RDS에도 MySQL 인스턴스를 생성해보자. 그리고 Rails의 데이터베이스 설정파일 수정을 통해 데이터베이스 설정을 바꿔보자.


작업환경: macOS Sierra


1. 로컬에 MySQL 설치


Homebrew를 이용해서 설치하자.

$ brew install mysql

$ brew info mysql

MySQL 설치 완료

무작정 $ mysql -uroot 명령어를 실행하면 아래와 같은 에러를 내뿜는다.

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

info를 확인하여 실행하기 전에 데이터베이스 설치작업을 마무리해주는 과정을 확인하여야 한다.



$ mysql_secure_installation


비밀번호 강도 설정과, 초기 비밀번호설정, anonymous 유저 삭제 등의 과정을 진행하게 된다.



$ mysql -u root -p

설치 작업이 완료되었다.



$ gem install mysql -- --with-mysql-config=mysql_config 파일 위치

$ rbenv rehash


2. Amazon RDS에 MySQL 인스턴스 만들기


개발/테스트 용도로 선택해야 free 티어의 데이터베이스 생성이 가능하다.


DB Instance Class에 가장 작은 t2.micro로 만들어야 왼쪽에 free tier로 설정된다.


인스턴스의 이름과 데이터베이스의 마스터 이름과 비밀번호를 설정하자.


Database 이름을 설정하고 나머지는 그냥 그대로 넘어가자


인스턴스가 생성되었다. Endpoint 주소를 통해 이후 접근해 보도록 하자.



3. Rails 애플리케이션과 Amazon RDS 연동하기


지난 글에서 생성해서 사용했던 Rails 애플리케이션인 myFirstRailsApplication을 활용하겠다.

해당 애플리케이션 디렉토리 안의 config/database.yml 파일을 수정하자.


Gemfile에 mysql2 젬을 추가해주자.


$ vi Gemfile

...

gem 'mysql2'

...


터미널에서 Amazon RDS에 원격으로 접속해서 development 데이터베이스를 생성하자.

test와 production 데이터베이스도 같이 생성해주자.


$ mysql -h 데이터베이스의 Endpoint 주소 -u root -p

> CREATE DATABASE development DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

> CREATE DATABASE test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

> CREATE DATABASE production DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;


* 데이터베이스의 character set을 utf-8로 설정하지 않고 기본 설정으로 생성하게 되면 latin1으로 초기값이 설정되어 한글 문자열이 있는 데이터를 insert할 때에 다음과 같은 오류를 발생시킨다.

rake aborted!

ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect string value: (입력 데이터)

참고http://develop.sunshiny.co.kr/385


  2016.12.30 추가

  ssh를 통해 원격접속하여 my.cnf 파일을 수정하여 utf8 설정을 할 수 없기에 대신 AWS RDS에서는 Parameter Group이라는 형태로 설정 할 수 있다.



4. 테스트


이 테스트 단계는 내 pc의 개발단계의 애플리케이션과 Amazon RDS를 연동하는 과정이다. 테스트 과정에서 사용된 예는 '퍼펙트 루비 온 레일즈, 제이펍'을 참고하였다.

이제 데이터베이스 설정은 끝냈으니 rails 애플리케이션에서 모델을 생성해보자.

$ rails generate model book isbn:string title:string price:integer publish:string published:date cd:boolean

$ rake db:migrate


위에서 데이터베이스가 생성되어있지 않으면 rake 명령시에 위와 같이 데이터베이스를 찾을수 없다며 에러를 표시한다.

항상 데이터베이스를 먼저 생성해주자.



다시 데이터베이스에 원격접속하여 테이블이 생성되었는지 확인해보자.


$ mysql -h 데이터베이스의 Endpoint 주소 -u root -p

> use development;

> desc books;



책에 관한 테이블을 만들었으니 데이터를 입력해보자. fixture 파일을 이용하여 데이터를 입력하자.

데이터: https://github.com/Jpub/RubyonRails4/blob/master/test/fixtures/books.yml

위의 yml 파일을 '/test/fixtures/books.yml'에 덮어씌우자.

그리고 다음과 같은 명령을 수행한다.

$ rake db:fixtures:load FIXTURES=books

아무런 에러가 표시되지 않는다면 정상적으로 수행된 것이다.

MySQL에서 확인해보자.

> SELECT * FROM books;



이제 이 모델을 이용한 간단한 컨트롤러를 만들고 배포해보자.


$ rails generate controller books


이제 컨트롤러에 다음과 같은 코드를 입력하여 데이터베이스에 저장되어있는 책 목록을 화면에 출력해보자.


controllers/books_controller.rb

class BooksController < ApplicationController
  def list
    @books = Book.all
  end
end

views/books/list.html.erb

<table border="1">
  <tr>
    <th>ISBN 코드</th><th>이름</th><th>가격</th>
    <th>출판사</th><th>출간일</th><th>CD-ROM</th>
  </tr>
  <% @books.each do |book| %>
  <tr>
    <td><%= book.isbn %></td>
    <td><%= book.title %></td>
    <td><%= book.price %></td>
    <td><%= book.publish %></td>
    <td><%= book.published %></td>
    <td><%= book.cd %></td>
  </tr>
  <% end %>
</table>

라우트 경로를 설정해주자.


$ vi config/routes.rb

...

get 'books/list'

...


서버 데몬을 실행하고 정상적으로 작동하는지 확인하자.

$ rails s


그리고 아래 주소로 접속해보자.

http://localhost:3000/books/list/


5. 배포하기


이제 배포하여 확인해보자.

$ git add .

$ git commit -m "books controller, view and route"

$ eb deploy

$ eb open


deploy에 오류가 발생한다면 데이터베이스의 Security Group이 현재 개발중인 pc의 ip만 접근 가능하도록 설정 되어있기 때문에 ec2 인스턴스가 migrate시에 데이터베이스에 접근하지 못해 발생하는 것이다. 필자는 Security Group의 Inbound를 모든 곳에서 접근할 수 있도록 모두 열어버렸다. 보안상 이렇게 하지 않는것이 좋을것이나 동시에 두개의 ip를 적용하는 방법을 몰라 일단 이렇게 설정해 둔다. :(

데이터베이스의 Security Group도 EC2 콘솔에서 설정을 바꾼다. EC2 - Security Group에서 현재 사용중인 데이터베이스의 그룹을 찾아 변경해주자.


/books/list 경로로 들어가서 확인해 보자.

배포(production) 환경에 있는 데이터베이스에는 현재 어떠한 값도 들어있지 않기 때문에 아래와 같이 페이지가 비어있게 된다.

직접 데이터베이스에 들어가 테이블이 생성되었는지 확인하고 임의로 데이터를 넣어보고 확인해보자.

> use production

INSERT INTO books (isbn, title, price, publish, published, cd) VALUES('978-4-7741-5878-5', '안드로이드 개발자를 위한 자바', 33600, '제이펍', '2013-08-20', false);



정확히 들어간 것을 확인할 수 있다.

* 글 작성에 앞서, 이 글의 목적은 숙달자의 정보전달이 아니라 초심자의 기록 남기기에 가깝다. 이해가 부족한 상태에서 경험의 과정을 적으니, 미숙한 점이 많이 있을 것이므로 양해 부탁드린다. 또, 미숙함에 대한 지적은 대환영이지만 기본적으로 이 포스팅은 대부분 일방적인 기록 남기기에 가까우니 피드백이 적을 수 있다. 다만 필자뿐 아니라 같은 글을 보는 다른 독자들을 위해 또 하나의 필자가 되어 부연설명을 해 주신다면 감사할 따름이다.


작업 환경: macOS Sierra

0. Python 설치하기

터미널에서 Elastic Beanstalk 서비스를 cui 형태로 사용할 수 있게 하는 EB cli 설치를 위해 Python을 먼저 설치한다. 아마도 이 클라이언트가 Python을 통해 실행되는듯 하다.

$ brew install python

$ python -V

$ sudo pip install --upgrade pip

$ pip -V


1. EB cli 설치하기

AWS의 Elastic Beanstalk의 애플리케이션을 생성하기위해 EB cli를 설치하자.

$ sudo pip install awsebcli


2. git 생성하기

배포하길 원하는 앱에 대한 git을 생성하자.

지난 Ruby on Rails 설치때 만든 myFirstRailsApplication을 배포하겠다.

$ cd myFirstRailsApplication

$ git init

$ git add .

$ git commit -m "default rails project"


3. EB 생성하기

$ eb init

이 명령어를 실행하면 몇가지 입력을 받는다.

첫번째로는 EC2 인스턴스가 생성될 서버의 위치를 결정한다. 기본값으로 US West (Oregon)을 설정되어있다. 한국 서버를 이용하길 원하므로 10번을 선택해주자.

다음으로는 access-id와 secret-key를 입력받는데, AWS 계정 설정에서 IAM을 생성하여 얻을 수 있다.


그 외에 application name과 프로젝트 타입, 버전, ssh 설정 유무를 묻는다. 적절하게 설정하자.


4. 배포하기

$ eb create rails-beanstalk

위 명령어를 실행하면 자동으로 AWS의 Elastic Beanstalk에 기존에 설정한 이름으로 application이 생성되며 rails-beanstalk란 이름으로 environment가 생성된다. 이와 함께 자동으로 ec2 인스턴스를 생성해준다.


생성이 완료되면 다음 명령을 통해 애플리케이션에 접근해보자.

$ eb open


아래 명령어를 통해 오류의 원인을 확인하자.

$ eb logs

production environment 환경을 위한 secret_key_base에 대한 설정이 필요함을 로그로 확인 할 수 있다.

$ eb setenv SECRET_KEY_BASE=임의의 키 입력

$ eb open


그리고 다시 웹서버에 접속하면 웹 컨테이너는 정확하게 작동하나, rails 애플리케이션을 처음 실행할때 만나는 페이지가 아니라 페이지 없음을 띄워준다.

현재 애플리케이션에 생성된 컨트롤러가 존재하지 않으므로 어떠한 페이지도 띄워주지 않는 것이다.

컨트롤러를 생성하여 접속해보자.

$ rails generate controller WelcomPage welcome

$ vi app/views/welcome_page/welcome.html.erb

<h1>WelcomePage#welcome</h1>

<p>Find me in app/views/welcome_page/welcome.html.erb</p>

<p>This is my first Rails application on Elastic Beanstalk!</p>

$ config/routes.rb

Rails.application.routes.draw do

  get "welcome_page/welcome"

  root "welcome_page#welcome"


end

$ git add .

$ git commit -m "welcome page controller, view and route"

$ eb deploy

$ eb open


이제 root 페이지가 설정되어 원하는 화면이 표시됨을 확인 할 수 있다.



* 사용하고 난 후에 ec2 인스턴스를 정지시키자. 한 달 750시간을 초과하면 1년 무료의 기간이라 하더라도 요금이 부과된다. 특히 여러개의 인스턴스를 생성하는 경우 부과된다. 필자는 그것도 모르고 한 달동안 여러개의 인스턴스를 켜 두었다가 15000원 가량의 요금이 부과되었다. 다행이 환불 받을수 있었지만 이것 때문에 그날 밤에 잠을 못이뤘다.


참고자료

1. http://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/create_deploy_Ruby_rails.html

* 글 작성에 앞서, 이 글의 목적은 숙달자의 정보전달이 아니라 초심자의 기록 남기기에 가깝다. 이해가 부족한 상태에서 경험의 과정을 적으니, 미숙한 점이 많이 있을 것이므로 양해 부탁드린다. 또, 미숙함에 대한 지적은 대환영이지만 기본적으로 이 포스팅은 대부분 일방적인 기록 남기기에 가까우니 피드백이 적을 수 있다. 다만 필자뿐 아니라 같은 글을 보는 다른 독자들을 위해 또 하나의 필자가 되어 부연설명을 해 주신다면 감사할 따름이다.


0. Homebrew 설치하기

루비 버전 관리자인 rbenv를 설치하기 위해 맥의 패키지 관리자인 Homebrew를 먼저 설치한다. Redhat 계열의 패키지 관리자인 yum이나 Debian 계열의 패키지 관리자인 apt-get과 비슷한 역할을 한다 보면 된다.


아래 홈페이지에서 터미널에 입력할 명령어를 확인하자.

Homebrew 홈페이지: http://brew.sh/index_ko.html


1. rbenv 설치하기

아래 명령을 터미널에서 수행하자

$ brew update

$ brew install rbenv ruby-build


다음과 같은 화면이 나타날 것이다.



2. ruby 설치하기

기본적으로 맥에는 ruby가 설치되어 있다.

$ ruby -v

위 명령어를 수행하면 2.0.0p648 버전이 설치되어 있음을 알 수 있다.

rbenv를 이용하여 최신 안정버전을 설치해 보겠다.


$ rbenv install -l

$ rbenv install 2.3.1

$ rbenv rehash

위 명령어를 실행하면 설치 가능한 버전 목록이 표시된다. 현재 가장 최신 안정버전인 2.3.1을 설치한다.

새로 루비를 설치하거나 루비 젬을 설치하면 반드시 rbenv rehash를 해주자. 새로운 환경을 재설정 하는 옵션이다.



$ rbenv versions

위의 명령어를 실행하면 현재 시스템에 설치된 루비 버전 목록이 표시된다.

현재 system 버전과 사용자가 설치한 2.3.1 버전이 표시된다. 앞의 * 기호가 현재 활성화된 루비 버전을 의미한다.

$ rbenv global 2.3.1

$ ruby -v

루비 버전을 2.3.1로 활성화 시킨다. 허나 이 상태에서 ruby -v를 실행해보아도 system의 구 버전이 남아있게 된다.


이 문제는 환경변수에 rbenv가 추가되어 있지 않아 발생한다.

.bash_profile에 환경변수에 추가하는 export 명령어를 추가하여 터미널 수행시 추가될 수 있게 설정을 바꿔주자.

$ vi .bash_profile

맥의 초기 상태에서는 .bash_profile이 없기 때문에 새로운 파일을 생성한다. vi에서 다음과 같은 내용을 추가하고 저장하자.

export PATH="$HOME/.rbenv/bin:$PATH"

eval "$(rbenv init -)"


그리고 다시 루비 버전을 확인하면 정상적으로 새로운 버전이 적용되는 것을 확인 할 수 있다.


(http://seonhokim.net/2013/10/30/mac-os-x-%EC%97%90%EC%84%9C-path-%EC%84%B8%ED%8C%85-%EB%B0%A9%EB%B2%95/)

(http://stackoverflow.com/questions/10940736/rbenv-not-changing-ruby-version)


루비 젬을 관리하는 젬 관리자인 bundler를 설치하자.


$ gem install bundler

$ rbenv rehash


3. rails 설치하기


$ gem install rails

$ rbenv rehash

$ rails -v



4. rails 앱 만들어 테스트 하기

원하는 폴더에 rails 앱을 만들어보자.

필자는 documents 경로 아래에 myFirstRailsApplication이라는 앱을 만들었다.

$ cd documents

$ rails new myFirstRailsApplication


생성된 rails 앱의 폴더로 들어가서 작동여부를 확인해보자.

$ cd myFirstRailsApplication

$ rails server -d

$ curl http://localhost:3000


Safari를 통해 위의 경로로 접속하면 실제로 앱이 실행 됨을 확인할 수 있다.



참고자료

1. https://www.gitbook.com/book/rorlab/railsguidebook/details

+ Recent posts