LoginSignup
3
3

More than 1 year has passed since last update.

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

Posted at

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

4.MySQlのバージョンを選択
スクリーンショット 2022-01-16 21.26.19.png

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

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

5.テンプレートを選択
今回は無料枠を利用することとします。
下の方に概算コストが表示されるので高性能なテンプレートを選択する場合はそちらを確認してください。
スクリーンショット 2022-01-16 21.30.32.png

6.基本情報を設定
スクリーンショット 2022-01-16 21.33.34.png

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

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

db.t2.microを選択します。1GBのメモリを搭載、実験に適したサイズです。
スクリーンショット 2022-01-16 21.37.55.png

8.ストレージを設定
今回は初期設定のままとします。
1年間は無料利用枠の対象となります。
スクリーンショット 2022-01-16 21.41.05.png

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

10.接続の設定
スクリーンショット 2022-01-16 21.44.39.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

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

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

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

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

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

6.DBパラメータグループに先ほど作成したグループを選択。
変更を保存する。
スクリーンショット 2022-01-16 22.42.04.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.

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3