ElasticBeanstalkでらくらくRails環境構築


「Iwate Developers Advent Calendar 2014」の18日目を担当します。
チイキットのmanagerです！！

AWSって便利ですが、EC2とかRDSとかセキュリティグループの設定とかその他いろいろ環境構築するには面倒くさいこと多くないでしょうか？

そんなときはElasticBeanstalkを使うのをオススメします！
最近使い初めましたが、かなり便利だと思いました。
今回はElasticBeanstalkを使ってRails環境の構築をしてみたいと思います。

## ElasticBeanstalkとは？

![elastic_beanstalk.png](https://qiita-image-store.s3.amazonaws.com/0/19316/8772658b-fd31-8d31-5377-02e587c9168f.png "elastic_beanstalk.png")


AWSが提供するPaasになります。
AWS版のHerokuと思って頂ければと思います。
内部的にはEC2、RDS等のAWSの既存サービスが使われます。

今回はAWS上の構成はELB+EC2の構成で環境を作ります。

## awsebcliのインストール
AWSマネジメントコンソール画面からも設定はできますが、
コマンドラインで設定出来たほうが便利ですよね！

今回はawsebcliを使ってElasticBeanstalkを使っていきます。

### pyenvのインストール
rbenvのpython版です。
pythonのバージョン管理をしてくれます。

```
$ 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


![スクリーンショット 2014-12-18 22.46.18.png](https://qiita-image-store.s3.amazonaws.com/0/19316/ef6aa8c4-d0ca-745e-912b-d76cd8478cf6.png "スクリーンショット 2014-12-18 22.46.18.png")

### Scaffoldでユーザ管理画面を作る

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


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

$ rails s
```

シンプルですね

![スクリーンショット 2014-12-19 0.36.18.png](https://qiita-image-store.s3.amazonaws.com/0/19316/785df566-9627-2c7c-b423-7d5939a7332f.png "スクリーンショット 2014-12-19 0.36.18.png")

## 最後にgitコミットしておきましょう

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

```


## ElasticBeanstalkのプロジェクト初期化

最初にリージョンが聞かれるので、8) Tokyoを選びましょう！

```
$ 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と表示されればおｋです！

```
INFO: Application available at myapp-dev2.elasticbeanstalk.com.
INFO: Successfully launched environment: myapp-dev
```

## サンプルを見てみる
以下のコマンドを叩くとブラウザが起動します。

```
eb open myapp-dev
```

![スクリーンショット 2014-12-18 23.09.26.png](https://qiita-image-store.s3.amazonaws.com/0/19316/681e61a5-5418-6e6b-83df-3c7935863185.png "スクリーンショット 2014-12-18 23.09.26.png")

## ソースコードをデプロイ

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

さきほどローカルで試した通りに表示されれば完了です。
これでAWS上にデプロイできました。


![スクリーンショット 2014-12-19 0.36.18.png](https://qiita-image-store.s3.amazonaws.com/0/19316/7df4a394-5052-6e6a-1266-41497332bfc7.png "スクリーンショット 2014-12-19 0.36.18.png")


## プロジェクトを削除

AWSは少々お高いので、遊んだあとはちゃんと削除しましょう

```
eb terminate myapp-dev 

```

## まとめ

コマンドラインからElasticBeanstalkでらくらく環境構築できましたね！
今回は触れていませんが、デフォルトでauto scalingの設定もできているので、簡単にスケールにも対応できるというかなりのすぐれものです。
さらにセキュリティグループもできています。

ElasticBeanstalkはドキュメントが少ないのが悲しいですが、
これだけ簡単なので試みる価値はあると思います。