AWS Cloud9でRuby on Railsを動かしてみた（MySQL編）

こんにちは！モリタケンタロウです！
今回はAWSのCloud9で、Ruby on RailsのDBをMySQLで動かす方法について紹介します。
Railsでアプリを作るとき、デフォルトではSQLiteが採用されているようですが、今回はよりメジャーなMySQLを使ってみようと思います。  
デフォルトのSQLiteを使う場合は、↓の記事を参考にしてみてください。

* [AWS Cloud9でRuby on Railsを動かしてみた](https://qiita.com/MORITAKENTARO/items/e73ad617eb5ba6507eb4)

作成済みのアプリのDBをデフォルトのSQLiteからMySQLに変える場合は、↓の記事を参考にしてみてください。

* [Ruby on RailsのDBをMySQLに変えてみた](https://qiita.com/MORITAKENTARO/items/68a0b9234bfd42abdac7)

# とにかくやってみよう！
AWS Cloud9では最初からRubyもRailsもインストールされています。
`ruby -v`と`rails -v`のコマンドで確認できます。

```bash
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
$ rails -v
Rails 5.0.0
```
確認できたら早速アプリを作成してみましょう。
`rails new [アプリ名]`コマンドで作ります。

```bash
$ rails new my_app -d mysql
      create  
      create  README.md
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile

# 省略

Fetching mysql2 0.4.10
Installing mysql2 0.4.10 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

# 省略

An error occurred while installing mysql2 (0.4.10), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.4.10' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  mysql2
         run  bundle exec spring binstub --all
bundler: command not found: spring
Install missing gem executables with `bundle install`
```
`bundle install`してる時になんだかよく分からないエラーが出てきたみたいです…
「Make sure that ~」で言われた通り、`mysql2`のgemをインストールしてみます。

```bash
$ gem install mysql2 -v '0.4.10' --source 'https://rubygems.org/'
Building native extensions. This could take a while...
ERROR:  Error installing mysql2:
        ERROR: Failed to build gem native extension.

# 省略

-----
mysql.h is missing. You may need to 'apt-get install libmysqlclient-dev' or 'yum install mysql-devel', and try again.
-----

# 省略

```
またエラー…
今度は`yum install mysql-devel`してみろって書いてあるのでやってみます。
**※ sudo付けないと「You need to be root to perform this command.」って怒られた…**

```bash
$ sudo yum install mysql-devel
Loaded plugins: priorities, update-motd, upgrade-helper

# 省略

Installed:
  mysql-devel.noarch 0:5.5-1.6.amzn1                                                                                                                                                                      

Dependency Installed:
  mysql55-devel.x86_64 0:5.5.62-1.23.amzn1                                                                                                                                                                

Complete!
```
満を持してmysqlのgemのインストールに再挑戦します。

```bash
$ gem install mysql2 -v '0.4.10' --source 'https://rubygems.org/'
Building native extensions. This could take a while...
Successfully installed mysql2-0.4.10
Parsing documentation for mysql2-0.4.10
Installing ri documentation for mysql2-0.4.10
Done installing documentation for mysql2 after 0 seconds
1 gem installed
```
できたっぽい！問題の`bundle install`をやってみます。
**※ 作ったアプリのディレクトリの中に入るの忘れがち**

```bash
$ cd my_app/
$ bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/............

# 省略

Bundle complete! 15 Gemfile dependencies, 62 gems now installed.

# 省略

```
できるやん！
ということでアプリを起動して…ってのはもう少し我慢で、その前にMySQLのサービスを起動しないといけないみたいです。
じゃないと、「**Mysql2::Error** Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)」って怒られて一瞬ショックな気持ちになります。
ということで、`sudo service mysqld start`コマンドでMySQLのサービスを起動します。
**※ これもsudo付けないと「Permission denied」って怒られた…**

```bash
$ sudo service mysqld start                                         
Initializing MySQL database:  Installing MySQL system tables...

# 省略

Please report any problems at http://bugs.mysql.com/

                                                           [  OK  ]
Starting mysqld:                                           [  OK  ]
```
サービスを起動したら、今度はDBを作ります。
DB作らないでアプリを起動しても「**ActiveRecord::NoDatabaseError** Unknown database 'my_app_development'」って怒られるだけです。
`rails db:create`コマンドで`config/database.yml`に書いてある内容でDBが作られます。

```bash
$ rails db:create
Created database 'my_app_development'
Created database 'my_app_test'
```
そしていよいよアプリを起動します。

```bash
$ rails server
=> Booting Puma
=> Rails 5.0.7.2 application starting in development on http://localhost:8080
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.4 (ruby 2.6.3-p62), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:8080
Use Ctrl-C to stop
```
![yayrailsmysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/b1dbbc96-5db7-ac3f-5f3f-81803c3a6237.png)
できたー！待ち望んでいたエヴァの最終回っぽいイラスト！
いっぱい怒られたけどなんとか動かせました(^^)
アプリ開発は環境構築から地道ですね～…
それでは～