【AWS】RailsアプリをEC2デプロイした時にでたエラーを解決する

自作したアプリケーションをAWS上にデプロイする際に、いくつかエラーが出てつまづいたので、どうやって解決したかをまとめ的な感じでつらつらと書いていきます。
各エラーの内容にはそこまで踏み込まず、解決するという部分にフォーカスしてます。

なお、デプロイ時は、下記のQiita記事を参考に行いました。
題の通り、世界一丁寧でした。。。誠に有難うございます。。。

[世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで](https://qiita.com/naoki_mochizuki/items/814e0979217b1a25aa3e)

## 環境

macOS:10.14.6
Ruby:2.5.7
Rails:5.2.4.1

## ①ssh: connect to host [作成したEC2のElasticIP] port 22: Operation timed out

これは、EC2インスタンスにsshログインした時に出たエラー。

```
$ ssh -i [app名].pem ec2-user@[作成したEC2のElasticIP]
ssh: connect to host [作成したEC2のElasticIP] port 22: Operation timed out
```

### 解決方法
1.AWSコンソールに入り、AWSのサービスからEC2を選択
2.左のメニューバーからセキュリティグループを選択
3.インバウンドを選択
4.編集
5.タイプ:SSH、ソース：マイIPのルールを追加
6.保存

これでsshログインできるようになります。
ちなみに自分のIPアドレスはwi-fi環境により異なったりするので注意が必要です。

**【追記】**
現在はSSHでログインしなくても、SystemsManagerを使用してログインした方が楽＆セキュアですね。
セキュリティグループ使ってポート許可設定する必要もなくなるので。

[Systems Manager を利用した EC2 インスタンスの管理 - AWS Systems Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-setting-up-ec2.html)


## ②ERROR: Ruby install aborted due to missing extensions

これは、EC2インスタンスにrbenvを使用してrubyをインストールする際に出たエラー。

```
$ rbenv install -v 2.5.7
~
#省略
~
BUILD FAILED (Amazon Linux AMI 2018.03 using ruby-build 20200224)

Inspect or clean up the working tree at /tmp/ruby-build.20200229053400.25770.gpU4NA
Results logged to /tmp/ruby-build.20200229053400.25770.log

Last 10 log lines:
installing capi-docs:               /home/irikawa/.rbenv/versions/2.5.7/share/doc/ruby
The Ruby readline extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
Try running `yum install -y readline-devel` to fetch missing dependencies.
```

### 解決方法
これはエラー文に書かれている以下のコマンドを実行し、

```
$ sudo yum install -y readline-devel
```

その後、rubyをインストール

```
$ rbenv install -v 2.5.7
~
#省略
~
Installed ruby-2.5.7 to /home/user/.rbenv/versions/2.5.7
```

無事入りました。

## ③EC2インスタンスにmaster.keyを作成する

これは特別エラーが出たわけではないのですが、考え方の整理として。

rails5.2以上では、rails newをしたタイミングで、「credentials.yml.enc」と「master.key」が生成されます。
それぞれの役割は、超ざっくり説明すると、「credentials.yml.enc」が鍵穴で、「master.key」が鍵という位置付けになり、「credentials.yml.enc」を複合する際には「master.key」が必要になるとのこと。

ローカル環境で開発している段階では特別意識しなくても良いのですが、EC2にあげるタイミングで.gitignoreに書かれている「master.key」はEC2側には渡ってくれません。

なので、以下の方法でEC2側に「master.key」を手動で作成してあげる必要があります。

まずはローカル環境でmaster.keyの中身をコピーします。
以下のコマンドを打って出てくる英数字の暗号みたいなものをコピーする。

```local.
~/myapp$ vi config/master.key
```

次にEC2側にmaster.keyを以下のコマンドで作成し、先程コピーしたものをペーストします。

```server.
[user|myapp]$ vim config/master.key
```

保存して終了。これでOKです。

**【追記】**

この記事を書いた4年後くらいに追記しますが、master.keyをリモートに上げるのはマズいですね。。。
master.keyがなくてもRailsアプリケーションからは環境変数は読み込めますし、master.keyは手元に流出しないように保管しておきましょう。


## ④bundle install時、mysqlが入らないエラー：Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

EC2インスタンス内でbundle install時に以下のエラー。主要部分のみ抜粋してます。

```server.
[user|myapp]$ bundle install
~
#省略
~
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
-----
mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel',
and try again.
-----
An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.
```

mysqlクライアントがないというエラーみたいですね。

エラー文に書いている以下のコマンドを実行。

```server.
[user|myapp]$ sudo yum install mysql-devel
```

その後、bundle installしたら無事mysqlが入りました。

一旦、以上になります。

今後随時更新していきます。