Ruby on Rails Elastic beanstalkへのデプロイ（EBデプロイ編）

#概要
Ruby on Rails で作ったアプリケーションをデプロイ環境の構築をElasticBeanstalk（以下EB）を使用して、最短で行います。
IAM権限変更編・環境構築編・EBデプロイ編で分けます。
あくまで、パッとデプロイすることに重点を置くので、厳しい管理が必要な方の場合はご了承ください。


#目次
[IAM権限変更編](https://qiita.com/TQO/items/1d66a6f986d96bd9cc12)
[環境構築編](https://qiita.com/TQO/items/797fe2362b05f6021b63)
[EBデプロイ編]()

##EBへデプロイ

1.まずは初期設定を行います。
eb init (再設定の場合は eb init -i)

```ruby:myapp
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-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
・・・
22) af-south-1 : Africa (Cape Town)
(default is 3): 9 #Tokyoを選択
Enter Application Name
(default is "myapp"): 
Application myapp has been created.

It appears you are using Ruby. Is this correct?
(Y/n): 
Select a platform branch.
1) Ruby 2.7 running on 64bit Amazon Linux 2
2) Ruby 2.6 running on 64bit Amazon Linux 2
3) Ruby 2.5 running on 64bit Amazon Linux 2
4) Puma with Ruby 2.6 running on 64bit Amazon Linux
5) Puma with Ruby 2.5 running on 64bit Amazon Linux
6) Puma with Ruby 2.4 running on 64bit Amazon Linux
7) Passenger with Ruby 2.6 running on 64bit Amazon Linux
8) Passenger with Ruby 2.5 running on 64bit Amazon Linux
9) Passenger with Ruby 2.4 running on 64bit Amazon Linux
・・・
17) Passenger with Ruby 2.0 running on 64bit Amazon Linux (Deprecated)
18) Passenger with Ruby 1.9.3 running on 64bit Amazon Linux (Deprecated)
(default is 1): 4 
#cloud9なので、Amazon Linuxですが大切なのは、PumaとRuby 2.6（今回のversion）を選ぶこと

Do you wish to continue with CodeCommit? (y/N) (default is n): <EnterでOK>
Do you want to set up SSH for your instances?
(Y/n): <EnterでOK>

Select a keypair.
1) cloudformation
2) [ Create new KeyPair ]
(default is 1): <これ用にキーペアを作るか、事前にあるkeyを使うかは自由です。>
```
これで初期設定はＯＫです。
デプロイに必要なEC2まわりの作成をしていきましょう。（ここｋも良しなにやってくれると助かるのですが。）

2.必要なVPC,subnet,securitygroupの作成
2-1.VPC作成
AWSのコンソールメニューからVPC を選択。
Create VPC をクリック。
以下の通り入力・選択する
Name tag: myapp-vpc (任意の名前)
IPv4 CIDR block: 10.0.0.0/16 (任意のネットワークを指定)
Create をクリック。

2-2.サブネット(Subnet)の作成
左メニューから サブSubnetを選択。
1つめのSubnetを作る。 Subnetの作成 ボタンをクリック。
以下の通り入力。
名前タグ: myapp-subnet-1a (任意のSubnet名)
VPC: myapp-vpc を選択.
アベイラビリティーゾーン: ap-northeast-1a (VPCを作成しているリージョンから一つ選ぶ)
IPv4 CIDRブロック: 10.0.0.0/24 (AZごとにVPCのCIDRの範囲で指定)
2つめのSubnetを作る。ふたたび サブネットの作成 ボタンをクリック。
以下の通り入力。
名前タグ: myapp-subnet-1c (任意のSubnet名)
VPC: myapp-vpc を選択.
アベイラビリティーゾーン: ap-northeast-1c (VPCを作成しているリージョンから一つ選ぶ)
IPv4 CIDRブロック: 10.0.1.0/24 (AZごとにVPCのCIDRの範囲で指定)

2-3.インターネットゲートウェイ(IGW)の作成
左メニューから  を選択。
IGWの作成 ボタンをクリック。
Nameタグ: myapp-gateway
作成 ボタンをクリック。
リストからゲートウェイ myapp-gateway を選択し、アクションから VPCにアタッチ を選択。
VPC: myapp-vpc を選択
アタッチ をクリック。
左メニューから ルートテーブル をクリック。
VPC IDを参考に、 myapp-vpc に紐づいているルートテーブルを選択。
ページ下部のタブから Routes を選択し、 Edit routes をクリック。
Add route をクリックし、以下を入力
Destination: 0.0.0.0/0
Targetから Internet Gateway を選択し、続けて myapp-gateway を選択。
Save routes をクリックして保存。

2-4.セキュリティグループの作成（2つのリージョン用に2つ、RDS用に1つ作成します。）
左メニューから セキュリティグループ を選択
Create security group をクリックして以下のように入力.
Security group name: myapp-security-group
Description: （なんでもいいです）
VPC: myapp-vpc を選択。
Create をクリックしてセキュリティグループを作成する。
リストから今作ったセキュリティグループを選択し、画面下のタブから Inbound Rules をクリック。
Edit rules をクリック。
ルールの追加 をクリックして以下のように入力。
タイプ: HTTP
説明: HTTP
Save rules をクリックしてルールを保存する。これを再度繰り返し、もう一つ作成。

RDS用のセキュリティグループは今作ったセキュリティグループの二つからのアクセスを許可するようにします。
Inbound Rulesにセキュリティグループからのインバウンド（アクセス）を許可します。先ほどのセキュリティグループ二つを選択して追加しましょう。
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614984/c25614e5-709f-8d48-623a-9ac4372fc0bd.jpeg)

以上でVPC,subnet,securitygroupの作成は終わり。

4.EBへデプロイ
あと少しです。デプロイしていきましょう。
ターミナルに戻って、以下のコマンドでデプロイ時の設定（RDSの作成、ALBの設定も含め）して構築します。

```
eb create <EBの環境名> --instance_type <EC2のスペック> --database.engine <DBの種類> --database.username <DBusername> --elb-type application --vpc
#例）eb create rails-app --instance_type t2.medium --database.engine mysql --database.username admin --elb-type application --vpc
Enter an RDS DB master password: 
Retype password to confirm: 

Enter the VPC ID: <作成したVPCのID>
Do you want to associate a public IP address? (Y/n): <Enter>
Enter a comma-separated list of Amazon EC2 subnets: <作成した2つのSubnetのID>
Enter a comma-separated list of Amazon ELB subnets: <作成した2つのSubnetのID>
Do you want the load balancer to be public? (Select no for internal) (Y/n): 
Enter a comma-separated list of Amazon VPC security groups:<作成した2つのセキュリティグループのID>
```

これでデプロイ環境の構築がEBのコンソール画面で始まります。
追加で、作成されたRDSの設定を追加します。(設定するパラメータはRDSのコンソール→各RDS画面で確認できます。)

```
eb setenv RDS_DB_NAME=◎◎ RDS_USERNAME=◎◎ RDS_PASSWORD=◎◎ RDS_HOSTNAME=◎◎ RDS_PORT=◎◎
例）eb setenv RDS_DB_NAME=myapp RDS_USERNAME=admin RDS_PASSWORD=123456 RDS_HOSTNAME=database-1.cfwrsdfe64.ap-northeast-1.rds.amazonaws.com RDS_PORT=3306
```
デプロイしてみましょう。

```
eb deploy
```
ここで、EBのコンソールでURLを確認してみましょう。

![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614984/6bad2dd4-4934-c96c-1600-503b8ceb43bc.jpeg)

An unhandled lowlevel error occurred. The application logs may have details.
という表示がでました。これはRubyで本番環境時のシークレットキーを作成、設定していないためおきます。
ということで、ここにRubyの本番環境設定をしていきましょう。

5.rubyの環境変数およびシークレットキーの出力EBへの設定

```
#シークレットキーの出力
rails credential:edit
<シークレットキー>
#EBへ設定を反映
eb setenv SECRET_KEY_BASE=<シークレットキー>
```

本番環境時のCSSprecompileが必要なので・・

```ruby:
RAILS_ENV=production bundle exec rake assets:precompile
```

```ruby:myapp/config/environments/production.rb
config.assets.compile = true
```

6.再度デプロイ

```
eb deploy
```
お疲れ様です。これでデプロイ完了です。


##まとめ
今回AWS　elastic beanstalkを使ってRubyのアプリケーションのデプロイをしました。
簡単にALB、Autoscallingなどのリソースも含めて冗長的な構成をすぐ作れる事、elastic beanstalkの環境ですべてのリソースの管理できるのもは非常にいいサービスに感じました。
一方で、RDSがデフォルトで作成されなかったり、環境の削除の際はS3が残る点（バケットポリシーの関係で）は不便に感じました。


##その他
いくつか、デプロイ後に触ること、エラー時の対応について追記します。
1.初期の設定では毎度DB作成・マイグレーションされる
Elastic Beanstalk＞環境＞myapp-env＞設定
RAILS_SKIP_ASSET_COMPILATION(false →　true)
RAILS_SKIP_MIGRATIONS(false →　true)

2.エラーについて
エラーがはかれる場合は以下のコマンドで現状のエラー内容がわかるので、対応しましょう。
eb logs

その他ebコマンドについては[こちら](https://qiita.com/yoshito410kam/items/712e96be87477aafdc89)
が参考になりました。

##参考記事
以下の記事を参考にさせていただきました。
RailsアプリケーションをElastic Beanstalkにデプロイするまで
https://qiita.com/hiroeorz@github/items/c9dcdb9c648d7e8eae7f#rails%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E4%BD%9C%E6%88%90%E3%81%A8%E8%A8%AD%E5%AE%9A%E7%AD%89

Railsのバージョンを指定してinstallする方法
https://qiita.com/tanakayo/items/7b85261924eca1a5a3d6

production環境でsecret_tokenをセットする(rails)
https://qiita.com/takusemba/items/2ad25d3d0a007757c194

Rails5をproduction（本番環境）で起動する時に嵌ったこと
https://qiita.com/qqhann/items/7cd01f4b5cff4a31e053

aws EB CLI 公式ref
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb3-cmd-commands.html

Elastic Beanstalkで使うコマンドまとめ
https://qiita.com/yoshito410kam/items/712e96be87477aafdc89