はじめに
私たちが運営しているHabitat-HubではRenderを利用してバックエンドサーバー&DB環境を構築していました。
DBについては、無料プランだと3ヶ月ごとにデータがリセットされてしまうと制約があったため、都度立て直していたのですが、最近リセットのタイミングが1ヶ月へと変更になりました。
立て直し作業&移行作業は30分程度で終わるとはいえ、貴重なデータを扱うような神経を使う作業を高頻度ではやりたくないものです(流れを知りたい方はRenderの無料プランでDBを使う方法をご覧ください)。
とはいえ、有料プランへ加入するというのも収益が出ていない状態では難しい状況です。
そのため、この度DBのみ他サービスのNeonに移すこととしました。
バックエンドサーバー自体は引き続きRenderを利用し、DBのみNeonに移すという変更です。
もしご興味のある方は、記事を引き続き読んでみてください。
Renderとは
Renderは簡単にアプリなどのサービスを公開できるホスティングサービスです。
利用できる言語や機能も豊富でありながら、価格も抑えられた良いサービスです。
DBも構築することができますが、冒頭で記載したように無料プランではDBが1ヶ月で使えなくなってしまいます。
Neonとは
Rust言語で作られたクラウド上にて動作するサーバーレスの PostgreSQL プラットフォームです。従来の PostgreSQL データベースソフトウェアと同じような使い方ができますが、サーバーを準備したり運用する必要がないため、フルマネージドサービスとして利用可能です(参考:Bun & TypeScriptでバックエンド開発:サーバーレスDB「Neon」の基本的な使い方)。
無料プランでは1つのDBのみ構築できるようです。
DB移行
流れは以下になります。
- Renderでダンプファイルを作成する(バックアップ)
- Neonのアカウントを発行し、DB接続に必要な情報を取得する
- DBに接続し、ダンプファイルを利用してデータを復元する
- Renderの環境変数を変更する
- (必要に応じて)バックエンドのコードを修正
DB接続情報の一部をコードに直接書き込んでいる人がいれば、4番の作業でコードも修正してください。
Renderでダンプファイルを作成する(バックアップ)
以下のコマンドを実行します。
{XXX}のRenderのダッシュボードにある値で置き換えてください
pg_dump -Fc -d postgres://{DB_USER}:{DB_PASSWORD}@{DB_HOST}{DB_REGION}/{DB_NAME} > {ダンプファイル名}
Renderは外部接続する際、リージョンなどをホスト名の後ろにくっつける必要があるらしいので、その辺りをお忘れなく(.singapore-postgres.render.com
のようなもの)。
Neonのアカウントを発行し、DB接続に必要な情報を取得する
Neonにアクセスし、サインアップしましょう。
そのあと、DBを作成してみましょう(この辺りはわかりやすくなっていたので、詳しい説明は割愛します)。
リージョンはRenderのサーバーをシンガポールにしていたので、同じにしました。
また、後で記載しますが、postgre SQLのバージョンが古いとエラーが発生することがあるため、14以降にしておいた方が良いと思います。
DB接続に必要な情報は先ほど作成したDBのダッシュボードに移動し、Connection Detailsというところで確認できます。
DBに接続し、ダンプファイルを利用してデータを復元する
以下のコマンドを実行します。
pg_restore --clean -h {DB_HOST} -p 5432 -U {DB_USER} -d {DB_NAME} {ダンプファイルのパス}
パスワードが聞かれますので、DB_USERのパスワードを入力してください(Neonのダッシュボードにあるはずです)。
多少ワーニングが出ますが、エラーになっていなければ復元できていると思います
注意点
ローカルのpostgreのバージョンが古いとエンドポイントIDを指定しろ、と怒られてしまします。
エンドポイントをうまく指定できれば、良いのですが、結構エラーが解消しなかったので、特に思い入れがなければ、バージョン14以降のpostgreを利用しましょう。
参考:https://neon.tech/docs/connect/connection-errors
Renderの環境変数を変更する
DBの接続情報を書き換えます。
私たちはRenderの環境変数(ダッシュボード > Environment > Secret Files)で管理しているため、その情報を書き換えました。
別管理している場合は、その値を書き換えてください。
(必要に応じて)バックエンドのコードを修正
neonではDB接続の際、sslモードでアクセスする必要があるため、バックエンドのコードもそのように変更します。
今まではRenderのバックエンドサーバーとDBだったので、なくても問題なかったのですが、環境を分けたことにより、調整が必要となりました。
ちょっとした調整は必要かもしれないので、エラーなどが出たらログを見ながら、対応してみてください。
最初、バックエンド側のAPIがずっとエラーを吐いていたのですが、Renderのログを見て、sslモードのエラーが出ていることがわかりました。
この辺りはRenderの便利なところですよね。
おわり
無料枠で頑張ろうと思うと結構いろいろなところで、苦労しますね...
もし皆様の助けになれば嬉しいです。
参考