ElasticBeanstalk로 쉽게 Rails 환경 구축

"Iwate Developers Advent Calendar 2014"의 18일째를 담당합니다.
치이 키트의 manager입니다! !

AWS는 편리합니다만, EC2라든지 RDS라든지 시큐리티 그룹의 설정이라든지 그 외 여러가지 환경 구축하기에는 귀찮게 많지 않을까요?

그럴 때는 ElasticBeanstalk을 사용하는 것이 좋습니다!
최근 사용하기 시작했습니다만, 꽤 편리하다고 생각했습니다.
이번에는 ElasticBeanstalk를 사용하여 Rails 환경을 구축하고 싶습니다.

ElasticBeanstalk이란?





AWS에서 제공하는 Paas입니다.
AWS판의 Heroku라고 생각해 주시면 좋겠습니다.
내부적으로는 EC2, RDS 등의 AWS의 기존 서비스가 사용됩니다.

이번에는 AWS의 구성은 ELB+EC2의 구성으로 환경을 만듭니다.

awsebcli 설치



AWS Management Console 화면에서도 설정할 수 있지만,
커맨드 라인으로 설정 할 수있는 것이 편리하네요!

이번에는 awsebcli를 사용하여 ElasticBeanstalk를 사용합니다.

pyenv 설치



rbenv의 파이썬 버전입니다.
파이썬 버전 관리를 해줍니다.
$ brew install pyenv
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ pyenv install 2.7.8
$ pyenv global 2.7.8

pyenv 설치



pyenv에서 python 설치가 끝나면 pip 명령을 사용할 수 있으므로,
pip로 awsebcli를 설치합니다.
$ pip install awsebcli
$ pyenv rehash

Rails 프로젝트 준비



프로젝트 만들기


$ rails new myapp
$ cd myapp/
$ bundle install
$ git init
$ git add --all
$ git commit -m "init"

myapp 시작


$ rails s

브라우저에 다음 URL을 입력하고 화면이 표시되면 OK입니다.

http://localhost:3000



Scaffold로 사용자 관리 화면 만들기


$ rails generate scaffold User name:string score:integer
$ rake db:migrate
$ vim config/routes.rb


#以下を追加します
   root 'users#index'

$ rails s

간단합니다.



마지막으로 git 커밋하자.


$ git add --all
$ git commit -m "add scaffold user"


ElasticBeanstalk 프로젝트 초기화



먼저 지역이 들리므로 8) 도쿄를 선택합시다!
$ eb init

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-southeast-1 : Asia Pacific (Singapore)
7) ap-southeast-2 : Asia Pacific (Sydney)
8) ap-northeast-1 : Asia Pacific (Tokyo)
9) sa-east-1 : South America (Sao Paulo)

(default is 3): 8


다음에 액세스 키, 비밀 키가 들리므로,
IAM 사용자로 eb용 사용자를 만들고 액세스 키와 비밀 키를 가져옵니다.
You have not yet set up your credentials or your credentials are incorrect 
You must provide your credentials.
(aws-access-id): XXXXXXXXXXXX
(aws-secret-key): XXXXXXXXXXXXXX

나머지는 대부분 기본적으로 괜찮지만,
keypair는 EC2의 화면에서 준비해 두는 것이 좋을지도 모릅니다.
Enter Application Name
(default is "myapp"): 
Application myapp has been created.

It appears you are using Ruby. Is this correct?
(y/n): y

Select a platform version.
1) Ruby 2.1 (Puma)
2) Ruby 2.1 (Passenger Standalone)
3) Ruby 2.0 (Puma)
4) Ruby 2.0 (Passenger Standalone)
5) Ruby 1.9.3
(default is 1): 1
Do you want to set up SSH for your instances?
(y/n): y

Select a keypair.
1) html5_iwate
2) [ Create new KeyPair ]
(default is 7): 1

마지막으로 .gitignore에 추가 된 행이 있으므로,
커밋하자.
$ git add --all
$ git commit -m "Add Elastic Beanstalk files to .gitignore"

Elastic Beanstalk 환경 만들기



DNS는 여유가 없는 경우가 있으므로,
이번에는 「myapp-dev2」로 했습니다!
--sample에서 샘플 화면을 표시합니다.

또한 RDS를 사용하려면
--database를 붙입니다.
$ eb create --sample
Enter Environment Name
(default is myapp-dev): 
Enter DNS CNAME prefix
(default is myapp-dev): myapp-dev2
Environment details for: myapp-dev
  Application name: myapp
  Region: ap-northeast-1
  Deployed Version: None
  Environment ID: e-knj49kgphu
  Platform: 64bit Amazon Linux 2014.09 v1.0.9 running Ruby 2.1 (Puma)
  Tier: WebServer-Standard-1.0
  CNAME: myapp-dev2.elasticbeanstalk.com
  Updated: 2014-12-18 14:02:05.410000+00:00
Printing Status:
INFO: createEnvironment is starting.
INFO: Using elasticbeanstalk-ap-northeast-1-433739316714 as Amazon S3 storage bucket for environment data.
INFO: Created load balancer named: awseb-e-k-AWSEBLoa-13KLV52G3KI44
INFO: Created security group named: awseb-e-knj49kgphu-stack-AWSEBSecurityGroup-XR9M858Y54AI
INFO: Created Auto Scaling launch configuration named: awseb-e-knj49kgphu-stack-AWSEBAutoScalingLaunchConfiguration-1Y0SZJD0YVADE
INFO: Waiting for EC2 instances to launch. This may take a few minutes.
INFO: Created Auto Scaling group named: awseb-e-knj49kgphu-stack-AWSEBAutoScalingGroup-17GB1XU0YEY3L
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:433739316714:scalingPolicy:6e1a8460-521f-45f7-928b-f79d3bbd57d2:autoScalingGroupName/awseb-e-knj49kgphu-stack-AWSEBAutoScalingGroup-17GB1XU0YEY3L:policyName/awseb-e-knj49kgphu-stack-AWSEBAutoScalingScaleUpPolicy-1FPR9I3UMZ4DG
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:433739316714:scalingPolicy:47f83451-d7ae-4c69-9437-5a11088f2250:autoScalingGroupName/awseb-e-knj49kgphu-stack-AWSEBAutoScalingGroup-17GB1XU0YEY3L:policyName/awseb-e-knj49kgphu-stack-AWSEBAutoScalingScaleDownPolicy-QVF31VE0UOR3
INFO: Created CloudWatch alarm named: awseb-e-knj49kgphu-stack-AWSEBCloudwatchAlarmHigh-56M3QY8E2KGY
INFO: Created CloudWatch alarm named: awseb-e-knj49kgphu-stack-AWSEBCloudwatchAlarmLow-MDDKYC14HWPT
INFO: Added EC2 instance 'i-0bd4e012' to Auto Scaling Group 'awseb-e-knj49kgphu-stack-AWSEBAutoScalingGroup-17GB1XU0YEY3L'.

잠시 후 마지막으로 Successfully라고 표시되면 k입니다!
INFO: Application available at myapp-dev2.elasticbeanstalk.com.
INFO: Successfully launched environment: myapp-dev

샘플을 살펴보기



다음 명령을 두드리면 브라우저가 시작됩니다.
eb open myapp-dev



소스 코드 배포


$ eb setenv -e myapp-dev SECRET_KEY_BASE=`bin/rake secret`
$ eb deploy myapp-dev
$ eb open myapp-dev

방금 로컬로 시도한대로 표시되면 완료됩니다.
이제 AWS에 배포할 수 있었습니다.



프로젝트 삭제



AWS는 조금 높기 때문에 놀고 나면 제대로 삭제합시다.
eb terminate myapp-dev 


요약



커맨드 라인으로부터 ElasticBeanstalk로 편하게 환경 구축할 수 있었군요!
이번에는 언급하지 않았지만 기본적으로 auto scaling 설정도되어 있기 때문에 쉽게 스케일에도 대응할 수 있다는 꽤 뛰어난 것입니다.
또한 보안 그룹도 있습니다.

ElasticBeanstalk는 문서가 적은 것이 슬프지만,
이만큼 간단하기 때문에 시도하는 가치는 있다고 생각합니다.

좋은 웹페이지 즐겨찾기