EC2環境にデプロイしていたRailsアプリのデータベースを後からRDSに移行したので自分自身の復習も兼ねて手順をまとめました。
前提
Rails -v 6.0.4
MySQL -v 5.7.36
サーバー: nginx
AWS側の設定
現在使用しているMySQLのバージョンと同じものを選択します。
MySQLのバージョンの確認方法は下記の通りです。
[ec2-user]$ mysql -u root -p
mysql> select version();
5.テンプレートを選択
今回は無料枠を利用することとします。
下の方に概算コストが表示されるので高性能なテンプレートを選択する場合はそちらを確認してください。
いずれの項目も自由に設定できますがマスターユーザー名とパスワードは後で使用するので控えるようにしてください。
7.DBインスタンスのクラスを選択
db.t2.microを選択します。1GBのメモリを搭載、実験に適したサイズです。
8.ストレージを設定
今回は初期設定のままとします。
1年間は無料利用枠の対象となります。
9.可用性と耐久性
無料利用枠のテンプレートを選択した場合こちらは設定できないのでスルーします。
VPCとサブネットグループに関しては現在使用しているEC2インスタンスと同じ場所に作成します。
パブリックアクセスはこのDBインスタンスにパブリックIPを割り当てるかどうかを設定するものになります。同じVPCに設置したEC2インスタンスから接続できれば十分なので「いいえ」を選択します。「はい」にすると攻撃されるリスクがあります。
VPCセキュリティグループは新規で作成します。あとで中身は設定します。
アベイラビリティゾーンはEC2インスタンスと同じ場所に配置するので自身のEC2インスタンスのアベイラビリティゾーンを確認して選択してください。
11.データベースの作成を選択する
残りの項目については今回はデフォルトのままでいきます。
12.データベースの完成を待つ
DBインスタンス一覧から先ほど作成したDBインスタンスのステータスを確認し、「利用可能」となっていれば作成は完了です。
13.セキュリティグループの設定
DBインスタンスをクリックし、「接続とセキュリティ」からセキュリティグループを選択。「インバウンドルールの設定を編集」を選択。
デフォルトの設定を削除し、下記のように設定します。
ソースには使用しているEC2インスタンスに設定したセキュリティグループIDを指定します。
ここまで設定したら「ルールを保存」してください。
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
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ページにアクセスする
3.パラメータグループの作成を選択
4.time_zoneの項目にAsia/Tokyoを選択し、保存する
5.ダッシュボードから変更を選択
6.DBパラメータグループに先ほど作成したグループを選択。
変更を保存する。
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.