【Rails × AWS】本番環境のDB(MySQL)をRDSに移行し、タイムゾーンを日本時間に変更する

EC2環境にデプロイしていたRailsアプリのデータベースを後からRDSに移行したので自分自身の復習も兼ねて手順をまとめました。

# 前提

```
Rails -v 6.0.4
MySQL -v 5.7.36
サーバー： nginx
```

# AWS側の設定

1. AWSのRDSダッシュボードを開く

2. 「データベースの作成」を選択

3. エンジンのタイプを選択
現在使用しているSQLの種類を選択。
今回はMySQLを選択します。
![スクリーンショット 2022-01-16 21.23.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640672/6e69b3e0-cd4c-abc5-deaa-2fd281dcaf56.png)

4.MySQlのバージョンを選択
![スクリーンショット 2022-01-16 21.26.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640672/e7db8381-d8f5-edae-0e4f-f66775bbbcb8.png)

現在使用しているMySQLのバージョンと同じものを選択します。
MySQLのバージョンの確認方法は下記の通りです。

```
[ec2-user]$ mysql -u root -p
mysql> select version();
```

5.テンプレートを選択
今回は無料枠を利用することとします。
下の方に概算コストが表示されるので高性能なテンプレートを選択する場合はそちらを確認してください。
![スクリーンショット 2022-01-16 21.30.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640672/f47f40c6-0576-ae90-c415-5d7892ff3518.png)

6.基本情報を設定
![スクリーンショット 2022-01-16 21.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640672/be9db74c-31fb-f6ba-7033-dade4b74a62e.png)

いずれの項目も自由に設定できますがマスターユーザー名とパスワードは後で使用するので控えるようにしてください。

7.DBインスタンスのクラスを選択

db.t2.microを選択します。1GBのメモリを搭載、実験に適したサイズです。
![スクリーンショット 2022-01-16 21.37.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640672/e889b374-76db-b69a-3504-f21fa484da4e.png)

8.ストレージを設定
今回は初期設定のままとします。
１年間は無料利用枠の対象となります。
![スクリーンショット 2022-01-16 21.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640672/31d20118-ea12-d454-f923-9cefc0c22d1e.png)

9.可用性と耐久性
無料利用枠のテンプレートを選択した場合こちらは設定できないのでスルーします。

10.接続の設定
![スクリーンショット 2022-01-16 21.44.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640672/a1489a46-d680-bde9-ccfd-195951596455.png)

VPCとサブネットグループに関しては現在使用しているEC2インスタンスと同じ場所に作成します。

パブリックアクセスはこのDBインスタンスにパブリックIPを割り当てるかどうかを設定するものになります。同じVPCに設置したEC2インスタンスから接続できれば十分なので「いいえ」を選択します。「はい」にすると攻撃されるリスクがあります。

VPCセキュリティグループは新規で作成します。あとで中身は設定します。

アベイラビリティゾーンはEC2インスタンスと同じ場所に配置するので自身のEC2インスタンスのアベイラビリティゾーンを確認して選択してください。

11.データベースの作成を選択する
残りの項目については今回はデフォルトのままでいきます。

12.データベースの完成を待つ
DBインスタンス一覧から先ほど作成したDBインスタンスのステータスを確認し、「利用可能」となっていれば作成は完了です。

13.セキュリティグループの設定
DBインスタンスをクリックし、「接続とセキュリティ」からセキュリティグループを選択。「インバウンドルールの設定を編集」を選択。
デフォルトの設定を削除し、下記のように設定します。
ソースには使用しているEC2インスタンスに設定したセキュリティグループIDを指定します。

![スクリーンショット 2022-01-16 22.09.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640672/cb44d481-76ac-b2ae-f0eb-ac94c5395f27.png)

ここまで設定したら「ルールを保存」してください。

14.エンドポイントを確認する
再度、RDSダッシュボードからDBインスタンスを選択し、エンドポイント欄の数値をどこかにコピーしておいてください。

# EC2上のMySQLからDBインスタンスにデータを移行する

ここからはターミナル操作でデータを移行する手順です。

15.EC2インスタンス上でバックアップを取る

```
[ec2-user]$ mysqldump --databases railsdb -u root -p > /tmp/railsdb.sql
```
'railsdb' の箇所は現在MySQL上で使用している移行したいデータベース名に置き換えてください。
ここで要求されるパスワードはrootユーザーのパスワードを入力してください。

16.RDSのDBインスタンスにリストアする

```
mysql -h [エンドポイント] -u admin -p < /tmp/railsdb.sql
```

エンドポイントには先ほど確認したエンドポイントを入力し、'admin'のところには先ほど設定したRDSのユーザー名を入力してください。ここで求められるパスワードもRDS用のマスターパスワードを入力します。

# Rails側の設定
ここからはRailsのdatabase.ymlの設定を変更します。

17.database.ymlを書き換える

```
#変更前のdatabase.yml
production:
  <<: *default
  database: <%= Rails.application.credentials.db[:database] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  socket: <%= Rails.application.credentials.db[:socket] %>
```
環境変数としてそれぞれ設定してありますがRDS用のuser名とpasswordに変更していきます。さらにhostの項目を追加します。

```
#localターミナル
 $ EDITOR=vim bin/rails credentials:edit
```

```credentials.yml
db:
  database: 変更しない
  username: admin(RDS用のユーザー名)
  password: RDS用の設定したPW
  socket: 変更しない
  host: エンドポイント
```

```
#変更後のdatabase.yml
production:
  <<: *default
  database: <%= Rails.application.credentials.db[:database] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  socket: <%= Rails.application.credentials.db[:socket] %>
  host: <%= Rails.application.credentials.db[:host] %>
```

これで移行自体は完了です。

# RDSのtime-zone設定

上記の時点でRDSへ移行は完了しましたがRDSはデフォルトでtime-zoneがUTCで設定されています。

```
[ec2-user]$ mysql -h [エンドポイント] -P 3306 -u [RDSのユーザー名] -p
mysql> show variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | UTC        |
| time_zone        | UTC        |
+------------------+------------+
mysql> SELECT NOW();
UTC時間が表示される
```

system_time_zoneはいじれないようなのでtime_zoneの方を日本時間に設定する手順を紹介します。

1.AWSのRDSページにアクセスする

2.パラメータグループを選択する
![スクリーンショット 2022-01-16 22.35.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640672/6932bbc3-243b-62bd-956a-747300070c1c.png)

3.パラメータグループの作成を選択

4.time_zoneの項目にAsia/Tokyoを選択し、保存する

5.ダッシュボードから変更を選択

6.DBパラメータグループに先ほど作成したグループを選択。
変更を保存する。
![スクリーンショット 2022-01-16 22.42.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640672/02a03168-e79c-a6b3-b93b-5d570c409485.png)

7.「アクション」から再起動を選択
再起動後、DBインスタンスの設定項目のパラメータグループが「同期中」となっていることを確認する。

```
[ec2-user]$ mysql -h [エンドポイント] -P 3306 -u [RDSのユーザー名] -p
mysql> show variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | UTC        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
mysql> SELECT NOW();
日本時間が表示される
```
上記のようになっていればOK.