RubyonRails & Elastic Beanstalk

RubyonRails AWS Elastic Beanstalk setting

ahntae
UFOfactory org

--

안녕하세요. UFOfactory에 근무하는 개발자입니다.

UFOfactory는 최근 더 다양한 언어와 플랫폼으로 웹서비스를 구현하고 있지만 초기에는 Wordpress와 RubyonRails를 주로 다루었습니다.

그리고 각각을 우리가 서버를 운영하면서 서버 세팅도 하고 관리도 하면서 웹서비스들을 관리해왔는데요. 서버 관리를 집중해서 하기엔 해야할 것들이 너무 많았기에 최근엔 주요 호스팅업체의 호스팅을 이용하는 쪽으로 개발된 서비스들을 올리고 있습니다.

RubyonRails에 적합한 호스팅 업체를 찾기가 어려워 자체 서버에 올려 관리하였는데, AWS의 Elastic Beanstalk에서 RubyonRails 호스팅을 지원하여 해당 Elastic Beanstalk을 이용하고 있습니다.

RubyonRails의 AWS Elastic Beanstalk 세팅 방법을 하단에 작성해보았습니다.

저는 mac을 쓰기 때문에 mac을 사용하는 유저를 기반으로 AWS Elastic Beanstalk 레일즈 세팅 방법을 작성하겠습니다.

이미 되어 있다고 가정된 것 
1. mac에 RubyonRails가 세팅 되어 있다.
2. aws에 계정이 있다.
3. git repogitory를 쓰고 있다.

할 것
1. S3 bucket setting
2. beanstalk setting
3. RDS setting
4. awsebcli

구성은 S3 + Beanstalk + RDS + IAM

S3를 이용해서 RubyonRails에 올라가는 이미지를 S3에 올리고

RDS를 사용해서 RubyonRails DB를 연결할 것입니다.

위와 같이 세팅 되면 해킹을 당하거나와 같은 어떤 서버 문제가 생길경우에도 Elastic Beanstalk 서버를 재생성하면 쉽게 복구되는 구성을 갖출 수 있습니다.

S3

  1. aws에 로그인 해서 s3를 클릭합니다.
  2. “create bucket” 버튼을 눌러 원하는 이름과 지역을 선택합니다.
  3. 해당 버킷안에 나중에 레일즈 uploads파일이 올라갈 uploads 폴더를 생성해줍니다.
  4. 생성하고 나면 우측 Properties 버튼을 클릭해서 Permissions, Static Web hosting 부분을 변경해줍니다.
  5. Properties 부분은 “Add bucket policy” 버튼을 클릭하면 팝업이 뜨는데 aws policy generator 를 이용해서 http://awspolicygen.s3.amazonaws.com/policygen.html 이 주소입니다. 아래와 유사한게 작성된 내용을 적어줍니다.
version, Id, Sid 등은 각자 다를 것 같습니다

5. Static Web hosting부분은 “enabled website hosting”을 체크해줍니다.

IAM

각 aws 서비스의 접근 권한을 관리해주는 IAM입니다.

  1. users에서 유저를 생성해줍니다.
  2. 생성하면 Access Key ID 와 Secret Access Key가 생성됩니다.
  3. users에서 해당 유저를 선택후 Permissions에서 “Attach Policy”버튼을 클릭합니다.
  4. 3가지 policy를 선택합니다. AmazonS3FullAccess, AmazonRDSFullAccess, AWSElasticBeanstalkFullAccess

Beanstalk

Elasctic beastalk 서비스를 선택하고 “Create New Applicaiton”을 클릭합니다.

  1. 이름을 입력하고 create web server를 선택합니다.
  2. platform은 ruby를 선택해줍니다.
  3. environment type은 Load balancing, auto scaling을 선택하면 해당 기능이 적용되고 single instance를 클릭하면 위기능이 적용되지 않습니다. 둘 중 원하는 것을 클릭합니다.
  4. next, next를 클릭하면 Create an RDS DB Instance with this environment 부분이 나오는데 RDS를 만들 것임으로 체크해줍니다.
  5. configuration details 부분에서는 instance type은 “t2.micro” 제일 작은 사양을 선택할 것인데 원하시는 사양을 선택해주세요. “next”
  6. next를 하다보면 RDS configuration이 나옵니다. 기본값으로 비싼 RDS가 설정되어 있으니 선택하여 db.t2.small로 선택해주세요. 이 부분도 원하시는 사양에 맞게 선택해주시면 됩니다. db에 접속할 username과 password를 적어줍니다.
  7. launch를 클릭하면 생성

RDS

RDS를 클릭해서 instances 중에 방금 생성한 instance를 클릭 하단에 Instance Actions > See Details를 클릭해서 인스턴스 정보를 확인합니다.

  1. 확인할 부분은 dbname, dbuser, endpoint입니다. dbname은 보통 ebdb로 세팅되고 dbuser, dbpassword는 이전에 빈스톡세팅할때 입력한 값을 RubyonRails database setting에 넣을 것입니다. endpoint를 복사합니다.
  2. prameter group 변경 — RDS를 생성하면 기본 파라메터 그룹이 latin 이기때문에 한글을 읽는 우리와는 적절하지 않습니다. Prameter Groups 탭을 클릭하고 Create Parameter Group을 선택합니다.
  3. 아래 부분을 utf8로 변경해줍니다. character_set_client, character_set_connection, character_set_database, character_set_filesystem, character_set_results, character_set_server 그리고 그아래 부분을 utf8_general_ci로 변경해줍니다. collation_connection, collation_server 입니다. Prameter Group 생성완료!
  4. Instance Actions > Modify를 클릭해줍니다.
  5. Database Options 부분에 DB Prameter Group 부분을 방금 생성한 prameter group으로 교체해줍니다.
  6. 그리고 Instance Actions > Reboot을 클릭해 적용합니다.

RubyonRails

터미널에서 아래 명령어를 작성합니다.

  1. rails new applicaiton-name
  2. Gemfile에 gem ‘mysql2’, gem ‘puma’, gem ‘fog’를 추가해 줍니다.
  3. mysql2는 RDS, puma는 Elastic Beanstalk, fog는 S3를 위한 Gem 입니다.
  4. bundle 후 database.yml에 production 부분을 채워 넣습니다. host부분에 endpoint 값을 넣습니다. 뒤에 3306은 삭제하고 port부분에 넣습니다.
  5. fog세팅은 gem ‘carrierwave’를 사용한다는 전제 하에 생성한 uploader.rb파일의 storage :file부분을 storage :fog로 변경합니다. config/initializers/carrierwave.rb를 생성하고 하단의 코드를 넣어줍니다.

awsebcli

맥 터미널에서 Elactic beanstalk으로 쉽게 배포 및 관리를 할 수 있게 해주는 것입니다. pip으로 설치해야합니다.

terminal을 열고

  1. sudo easy_install pip
  2. pip install awscli
  3. aws configure
  4. AWS Access Key ID : IAM에서 생성한 Id를 넣습니다.
  5. AWS Secret Access Key : IAM에서 생성한 key를 넣습니다.
  6. region name : 은 seoul은 ap-northeast-2 이지만 beanstalk이 세팅된 region을 넣어야 합니다
  7. eb init
  8. 9번 ap-northeast-2을 선택합니다.
  9. Select an application to use는 앞에 생성한 beanstalk이름을 선택하고 아마도 My First Elastic Beanstalk Application이름으로 생성되었을 것입니다.
  10. Select a platform version은 로컬에 있는 ruby 버전에 맞게 선택해줍니다.
  11. keypair는 새로 생성하거나 있는 keypair를 사용하면 됩니다. Beanstalk서버에 접근할 수 있는 .pub 키입니다.
  12. eb ssh 를 통해 Beanstalk 서버에 접속하고 RDS접속 정보를 확인해서 db table이 utf8인지 확인 합니다. latin으로 되어 있으면 utf8로 수정해줍니다.
  13. 이제 배포가 남았는데, 배포를 위해선 beanstalk 서버에 .env 값을 넣어주어야 합니다.
  14. eb setenv 명령어를 사용하며 넣어야 할 값은 config/secrets.yml의 production: secret_key_base, fog Gem세팅에서 만든 config/initializers/carrierwave.rb의 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, REGION, DERECTORY 입니다. AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY부분은 좀전에 IAM에서 받은 것을 eb setenv AWS_ACCESS_KEY_ID=a123123123 의 형식으로 beasstalk서버에 넣으면 되고 DERECTORY는 s3생성때에 만든 폴더명을 넣으면 됩니다. RESION은 서울이라면 ap-northeast-2 입니다.
  15. eb deploy 명령으로 배포를 합니다.

위의 과정을 거치면 RubyonRails를 아주 사양이 낮은 것을 사용하고 free tier 를 이용한다면 1만원 미만의 돈이나 무료로 레일즈 호스팅을 할 수 있습니다.

RDS를 t2.small, ec2를 t2.medium(2 cpu, 4Gi mem)를 사용해도 매월 6만원정도 비용이 발생합니다.

위의 세팅이 최적이라고 할 수는 없겠지만 참고를 하실 수 있지 않을까 하고 작성하였습니다.

개인적으로는 원하는 기능, 빠른 개발은 RubyonRails가 적합하다고 보여지는데, AWS Elactic Beanstalk을 이용해서 호스팅 한다면 서버 배포나 관리가 쉬워서 좀 더 개발과 좋은 서비스 기획에 집중 할 수 있지 않을까 생각해봅니다.

감사합니다.

--

--