Rails: EC2とRDBでデプロイする際に使用した参考記事

## はじめに
AWS Cloudtechで一通り基礎を学んだ初心者が、
Rails のアプリをAWSでデプロイしさらに冗長化構成にする際に参考にした記事をまとめました。
AWSの基礎を学んで、WordPressの設定はできるけど、Railsアプリの場合はちょっと良く分からない。
AWSの記事はたくさんあるけど、どの記事が自分の設定にあっているか分からないという方もこの記事を読むと何か掴めるかもしれません。

最終的に以下の図のような設定ができました。


[![Image from Gyazo](https://i.gyazo.com/0c882aaece9bf417946a7eb2890ee4bd.png)](https://gyazo.com/0c882aaece9bf417946a7eb2890ee4bd)
環境は以下の通りです。
Rails 6
MySQL(RDS)

*この記事で冗長化の設定方法は書いてありません。


## RailsのアプリをAWSでデプロイする際の参考記事の決め方と参考記事の紹介

### データベースについて
  - EC2に直接インストールする方法
  - AWSのRDSを使う方法

データベースの使用方法は二種類あります。冗長化構成にしたいのであれば、AWSのRDSを使用するのが◎です。

違いは、EC2にMysqlサーバーをインストールするか否かです。

初心者向けの丁寧に解説されているほとんどの記事は、EC2にデーターベースサーバーを直接インストールしているということに注意しながら参考記事を探します。

冗長化構成にするための基盤の設定は、AWSのRDSを使用したシングル構成の環境構築です。
「マルチAZ」「シングル構成」「RDS」などをキーワドにして記事を探します。

これという記事はありませんが、AWS Cloudtechで学習することで簡単に作れるようになります。
下記の図のような構成で環境構築することが最初の目標になります。

ここでの注意点は、セキュリティグループのインバウンドルールを正しく設定することです。
EC2にhttp接続、ssh接続ができるように設定し、RDSはEC2から接続できるように設定します。

[![Image from Gyazo](https://i.gyazo.com/3cc8a994439b2c0c1f5266c6bf90cb11.png)](https://gyazo.com/3cc8a994439b2c0c1f5266c6bf90cb11)

上記の環境を構築できたら、EC2に接続しRailsが動く環境をインストールしていきます。

### EC2の設定
EC2にインストールする内容はどの記事もほとんど同じです。
node.jsをインストールする際に出てくるメッセージにyarnもインストールしてくださいとあるのでインストールします。(yarnのことは書いていない記事も多いですが柔軟に)

注意することは、データベースのインストール時にmysql-devel、mysqlはインストールして

```
[ec2-user@ip-10-0-0-21 sample-app]$ sudo yum -y install mysql-devel
[ec2-user@ip-10-0-0-21 sample-app]$ sudo yum -y install mysql
```

mysql-serverをインストールしないということです。(RDSを使用するため)

### sshでEC2への接続を試す(ターミナル)
```
[ダウンロードしたkeyがあるディレクトリ]$ chmod 600 key.pem
↑権限の変更をしています

$ ssh -i 〇〇.pem ec2-user@紐付けたElastic IP
↑ssh接続
```

### EC2からRDSの接続を試す

```
[ec2-user@ip-10-0-0-21 sample-app]$ mysql -h <RDSのエンドポイント> -u rails -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 140
Server version: 8.0.20 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample ←           |
+--------------------+
4 rows in set (0.00 sec)
```
この記事がわかりやすそうです。

https://qiita.com/Yuuki46240345/items/551539a3f1a037a75c37

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ConnectToInstance.html

`> show databases;`

これを打つことでRDSで作成したデーターベースをみることができます。




### ローカルのdatabase.ymlのproductionの設定

```ruby:database.yml

production:
  adapter: mysql2
  encoding: utf8
  database: <%= Rails.application.credentials.db[:database] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  host: <%= Rails.application.credentials.db[:host] %>
  port: <%= Rails.application.credentials.db[:port] %>

```


参考にした記事

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_Ruby.rds.html



### 環境変数の設定方法

credentials.yml.encとmaster.keyを使う方法を試してみました。
環境変数が設定してあるcredentials.yml.encは暗号化されてGithubに、master.keyは.gitignoreに載っているため公開されないという仕組みです。EC2にgitcloneしたアプリにも同じmaster.keyを書いてあげることでcredentials.yml.encの暗号化が解け、環境変数がEC2上でも使えるようになるという仕組みです。

以下の記事を参考にしました。わかりやすいです。ありがとうございます。

https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39


こんな感じで設定しました。(ローカルで設定)

```ruby:credentials.yml.enc
# aws:
#   access_key_id: 123
#   secret_access_key: 345

db:
  database: sample_app
  host:     database-1.csssssssd.ap-northeast-1.rds.amazonaws.com
  username: sample
  password: sample3456
  port:     3306

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: asdfgfhaasdffg7as7gd78a9ha9ahdhnsg894ti9849
~                                  
```


### ユニコーン、EC2のサーバにアプリのコードをクローン、Nginx、Capistrano
環境設定が終わったところでユニコーンの設定、Githubからアプリのコードをクローンしていきます。
クローンができたら、Nginx、Capistranoを設定します。

ユニコーンの設定からはこの記事が参考になりました。ありがとうございます。

https://note.com/teri2013/n/nd8e45bc29198


gitcloneしたアプリでrubyがないと言わました。
`$ rbenv global x.x.x`
で効かなかったようです。下記を入力。


```
$ rbenv local x.x.x
```



環境変数の設定は、
設定したcredentials.yml.encに対応するローカルのmaster.keyを手動でEC2内のアプリにコピーするという方法で行います。
この記事が参考になりました。ありがとうございます。

https://qiita.com/gyu_outputs/items/4653f625ffabc7318a8a

master.keyのファイルの場所の関係でエラーが何度か出ましたが、環境変数が使えるようになればデーターベースには繋がりますし、エラーが出たらエラー文が教えてくれるので次に進めます。

### 複数のEC2に自動デプロイする方法(Capistrano設定後)
ローカルのproduction.rbにserverを付け加える

```ruby:config>deploy>production.rb
server '54.65.157.240', user: 'ec2-user', roles: %w{app db web}
server '35.72.140.240', user: 'ec2-user', roles: %w{app db web}
```

### AutoScallingで追加されたEC2に自動でデプロイする方法

この記事が参考になりそうです。まだ試していないのでわかりません。

https://qiita.com/EntreGulss/items/69535065ce952990ec7a

## 最後に

エラーがたくさん出るとは思いますが、一つの記事をベースに、その他エラーが出る度に色々な記事を参考にしながら理解を深めていけば解決方法は見つかります。


AWS Cloudtech、お勧めです。
herokuにデプロイできず2日間エラーに向き合って、基礎が全くわかっていないと気付きAWSを勉強し始めて約20日間。
全くインフラの知識がなかった自分でも、色々な記事を参考にエラーを解決していくことができるようになりました。

ありがとうございます☺️