目的
AWS RDSからsupabaseへの移行方法を解説します。
Laravelを EC2上で動かしているので、アプリケーション側の設定方法も一緒に解説します。
背景
個人開発で使っていたAWS RDSが、無料枠が終了し月額USD 47.76かかっていました、、、
データベース料金の節約のため、移行を検討しました。
調べてみると、データベースをそもそも使わない考え方やレンタルサーバー上でDBエンジンをインストールしDBを構築する方法など、色んな節約方法が存在していることを知りました。
会社では、RDSを使用した案件しか参加したことがなく、データベース=マネージドなクラウドサービス(RDSなど)と、DB構築を脳死で決めてました、、、
その中、PaaSという脳死エンジニアでも今までの運用のまま使用できる存在を知り、最終的にsupabaseを選びました。
数あるPaaSのデータベースサービスの中で、supabaseを選択した理由は以下の通りです。
- Postgresデータベースである
- 無料枠がある(7日間放置すると停止するらしいが、バッチ処理で対応できる)
- 東京リージョンがある(海外リージョンだとレスポンスタイムが10倍くらいになることがある)
- PaaSのデータベース界隈では割と老舗らしい
個人的な興味としては、neonのブランチ機能が面白そうだと思ったのですが、一番近いリージョンがシンガポールということで今回は諦めました。(今後、東京リージョンが追加される噂もある)
移行手順
下記の作業を行います。
- supabaseのアカウント、プロジェクトの作成
- 稼働環境のバックアップ準備
- RDS→supabaseにデータを移行
- LaravelのDB接続設定を変更
- 動作確認
では、順番に作業開始します。
supabaseのアカウント、プロジェクトの作成
supabase へのサインインを行います。
サインインは GitHub アカウントを介して行えます。以下からサインインを行なってください。
GitHub アカウントをもっていない方は作成してからサインインを行なってください。
https://supabase.com/dashboard/sign-in
サインインできたら、新規プロジェクトの作成を行います。
- supabaseのダッシュボードのTop画面から
New Project
ボタンをクリックし、そこから出てくるポップアップ内の〇〇's Org
ボタンをクリック -
Project name(プロジェクト名)
、Database Password(データベースのパスワード)
、Region(リージョン)
をそれぞれ入力-
Project name(プロジェクト名)
: 動作にあまりかかわらないので単純にわかりやすい名前を入力 -
Database Password(データベースのパスワード)
: データベースにアクセスするときのパスワード。複雑な文字列が望ましい -
Region(リージョン)
: サーバーの地理的に近いところが良いと思います。Northeast Asia(Tokyo)
にしました
-
-
Security options
をクリックしてアコーディオンを開き、Only Connection String
を選択- Data APIを使用しないため、
Only Connection String
を選択しました - Data APIは、簡単に言えばsupabaseが提供するDBを操作するためのRest APIであり、今回は一般的なDB接続を行うため不要と判断しました
- Data APIを使用しないため、
稼働環境のバックアップ準備
EC2のAMIとRDSのスナップショットを取得して、万が一に移行失敗した際のバックアップ体制を用意しておくと安全です。
RDS→supabaseにデータを移行
事前準備: pg_dumpのバージョンアップ
RDSのバージョンに合わせる必要があるため、ずれている場合は、pg_dumpのアップデートする。
下記記事を参考に実行しました。ここでは、細かい説明は省略します。
ステップ 1: データベースのバックアップ
-
EC2にSSHかセッションマネージャを使用して接続します(RDSに接続できるのであればEC2でなくても大丈夫です)
-
pg_dumpコマンドを使用して、Amazon RDS の PostgreSQL データベースのバックアップを作成します
pg_dump <データベース名> -h <RDSエンドポイント> -U <ユーザー名> -W -F c -b -v -f <バックアップファイル名>.dump
ステップ 2: Supabase の設定
- Supabase のプロジェクトダッシュボードにログインし、先ほど作成したデータベースの設定画面(Settings > Database)を開きます
- Connection parameters欄のModeを
Session Mode
を選択します - Connection parameters欄からデータベースの接続情報(ホスト、ポート、データベース名、ユーザー名、パスワード)をメモしておきます
ステップ 3: データベースの復元
-
pg_restoreコマンドを使用して、Supabase のデータベースにバックアップファイルを復元します
pg_restore -h <Supabaseホスト> -U <ユーザー名> -d <データベース名> -v <バックアップファイル名>.dump
ステップ 4: 確認とテスト
- データが正しく移行されたことを確認します。Supabase のダッシュボードからデータベースにリストアしたデータが存在するか確認します
LaravelのDB接続設定を変更
- Supabase のプロジェクトダッシュボードにログインし、先ほど作成したデータベースの設定画面(Settings > Database)を開きます
- Connection string欄のタブを
URI
を選択します - Connection string欄のModeを
Session Mode
を選択します - Connection string欄からデータベースの接続情報の文字列をメモしておきます
- EC2にアクセスして、Laravelのenvファイルの接続設定を変更します(DATABASE_URLに先ほどメモした文字列をセットしてください。)
DB_CONNECTION=pgsql DATABASE_URL=postgres://postgres.xxxx:password@xxxx.pooler.supabase.com:5432/postgres
- 下記コマンド実行でenvファイルを適用します
$ php artisan config:cache $ sudo systemctl restart nginx
動作確認
Laravelのアプリケーション経由で、一通りの動作ができるか確認してください。
同時にsupabaseのダッシュボード画面からデータを参照できるので確認できると安全です。
参考資料
RDSからの移行作業についての公式ドキュメント: Migrate from Amazon RDS to Supabase
Laravelの設定作業についての公式ドキュメント: Use Supabase with Laravel