AWS RDSからsupabaseへの移行方法(Laravelの設定方法も含む)

# 目的
AWS RDSからsupabaseへの移行方法を解説します。
Laravelを　EC2上で動かしているので、アプリケーション側の設定方法も一緒に解説します。

# 背景
個人開発で使っていたAWS RDSが、無料枠が終了し月額**USD 47.76**かかっていました、、、
データベース料金の節約のため、移行を検討しました。

調べてみると、データベースをそもそも使わない考え方やレンタルサーバー上でDBエンジンをインストールしDBを構築する方法など、色んな節約方法が存在していることを知りました。
会社では、RDSを使用した案件しか参加したことがなく、データベース＝マネージドなクラウドサービス(RDSなど)と、DB構築を脳死で決めてました、、、

その中、PaaSという脳死エンジニアでも今までの運用のまま使用できる存在を知り、最終的に[supabase](https://supabase.com/)を選びました。
数あるPaaSのデータベースサービスの中で、supabaseを選択した理由は以下の通りです。
- Postgresデータベースである
- 無料枠がある(7日間放置すると停止するらしいが、バッチ処理で対応できる)
- 東京リージョンがある（海外リージョンだとレスポンスタイムが10倍くらいになることがある）
- PaaSのデータベース界隈では割と老舗らしい

個人的な興味としては、neonのブランチ機能が面白そうだと思ったのですが、一番近いリージョンがシンガポールということで今回は諦めました。（今後、東京リージョンが追加される噂もある）

# 移行手順
下記の作業を行います。
- supabaseのアカウント、プロジェクトの作成
- 稼働環境のバックアップ準備
- RDS→supabaseにデータを移行
- LaravelのDB接続設定を変更
- 動作確認

では、順番に作業開始します。

## supabaseのアカウント、プロジェクトの作成
supabase へのサインインを行います。
サインインは GitHub アカウントを介して行えます。以下からサインインを行なってください。
GitHub アカウントをもっていない方は作成してからサインインを行なってください。
https://supabase.com/dashboard/sign-in


サインインできたら、新規プロジェクトの作成を行います。

![FireShot Capture 023 - Supabase - supabase.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366493/7fab776a-2b1a-dbcc-16d6-1d52b796bae9.png)

1. supabaseのダッシュボードのTop画面から`New Project`ボタンをクリックし、そこから出てくるポップアップ内の`〇〇's Org`ボタンをクリック
1. `Project name(プロジェクト名)`、`Database Password(データベースのパスワード)`、`Region(リージョン)`をそれぞれ入力
    - `Project name(プロジェクト名)`: 動作にあまりかかわらないので単純にわかりやすい名前を入力
    - `Database Password(データベースのパスワード)`: データベースにアクセスするときのパスワード。複雑な文字列が望ましい
    - `Region(リージョン)`: サーバーの地理的に近いところが良いと思います。`Northeast Asia(Tokyo)`にしました
1. `Security options`をクリックしてアコーディオンを開き、`Only Connection String`を選択
    - Data APIを使用しないため、 `Only Connection String`を選択しました
    - Data APIは、簡単に言えばsupabaseが提供するDBを操作するためのRest APIであり、今回は一般的なDB接続を行うため不要と判断しました

## 稼働環境のバックアップ準備
EC2のAMIとRDSのスナップショットを取得して、万が一に移行失敗した際のバックアップ体制を用意しておくと安全です。

## RDS→supabaseにデータを移行

### 事前準備: pg_dumpのバージョンアップ

RDSのバージョンに合わせる必要があるため、ずれている場合は、pg_dumpのアップデートする。

下記記事を参考に実行しました。ここでは、細かい説明は省略します。

https://dev.classmethod.jp/articles/amazon-linux2-pg_dump-rds-for-postgresql/


### ステップ 1: データベースのバックアップ

1. EC2にSSHかセッションマネージャを使用して接続します(RDSに接続できるのであればEC2でなくても大丈夫です)
2. **pg_dump**コマンドを使用して、Amazon RDS の PostgreSQL データベースのバックアップを作成します
    
    ```
    pg_dump <データベース名> -h <RDSエンドポイント> -U <ユーザー名> -W -F c -b -v -f <バックアップファイル名>.dump
    ```

### ステップ 2: Supabase の設定

1. Supabase のプロジェクトダッシュボードにログインし、先ほど作成したデータベースの設定画面(Settings > Database)を開きます
1. Connection parameters欄のModeを`Session Mode`を選択します
2. Connection parameters欄からデータベースの接続情報（ホスト、ポート、データベース名、ユーザー名、パスワード）をメモしておきます

![スクリーンショット 0006-08-14 10.17.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366493/ccafdd4b-c3f1-893c-2c41-7370d32c9567.png)


### ステップ 3: データベースの復元

1. **pg_restore**コマンドを使用して、Supabase のデータベースにバックアップファイルを復元します
    
    ```
    pg_restore -h <Supabaseホスト> -U <ユーザー名> -d <データベース名> -v <バックアップファイル名>.dump
    ```
### ステップ 4: 確認とテスト

1. データが正しく移行されたことを確認します。Supabase のダッシュボードからデータベースにリストアしたデータが存在するか確認します

## LaravelのDB接続設定を変更
1. Supabase のプロジェクトダッシュボードにログインし、先ほど作成したデータベースの設定画面(Settings > Database)を開きます
1. Connection string欄のタブを`URI`を選択します
1. Connection string欄のModeを`Session Mode`を選択します
1. Connection string欄からデータベースの接続情報の文字列をメモしておきます
1. EC2にアクセスして、Laravelのenvファイルの接続設定を変更します（DATABASE_URLに先ほどメモした文字列をセットしてください。）
    ```
    DB_CONNECTION=pgsql
    DATABASE_URL=postgres://postgres.xxxx:password@xxxx.pooler.supabase.com:5432/postgres
    ```
1. 下記コマンド実行でenvファイルを適用します
    ```
    $ php artisan config:cache
    $ sudo systemctl restart nginx
    ```

## 動作確認
Laravelのアプリケーション経由で、一通りの動作ができるか確認してください。
同時にsupabaseのダッシュボード画面からデータを参照できるので確認できると安全です。

# 参考資料
RDSからの移行作業についての公式ドキュメント: [Migrate from Amazon RDS to Supabase](https://supabase.com/docs/guides/resources/migrating-to-supabase/amazon-rds)
Laravelの設定作業についての公式ドキュメント: [Use Supabase with Laravel](https://supabase.com/docs/guides/getting-started/quickstarts/laravel)