はじめに
発端
個人開発したアプリをFly.ioで運用しています。
ある日、画像のメールが来ました。
放置していましたが、その後発生した問題を解決するためにはこの移行が必要でした。
本記事ではこれまでのDB(以下unmanaged Postgres)をManaged Postgresへ移行する方法について触れます。
(メールタイトル:[Important]: Your unmanaged Postgres database on Fly.io)
Managed Postgresとは
Fly.ioにはManaged Postgresというサービスがあります。
これはDBにPostgreSQLを使用している場合に利用できるもので、公式ドキュメントには下記記載があります。
運用中の PostgreSQL データベースのあらゆる側面を処理する、当社の完全マネージド データベース サービスです。当社が以下の作業を担当します。
・ 自動バックアップとリカバリ
・ 自動フェイルオーバーによる高可用性
・ パフォーマンス監視とメトリクス
・ リソースのスケーリング(CPU、RAM、ストレージ)
・ 24時間365日のサポートとインシデント対応
・ 保存中および転送中のデータの自動暗号化
DB運用を良い感じにサポートしてくれるそうです。
逆にunmanaged Postgresはそれらを自分で管理しないといけないということですね。
現在Managed Postgresを使用しているかどうかは、下記コマンドを実行して確認可能です。
fly mpg list
ながれ
- クラスターの作成
- 移行
- unmanaged Postgresの削除
Managed Postgresは有料サービスで、これまでの費用に追加されます。
1. クラスターの作成
Fly.ioのダッシュボードに行き、画面左側の「Managed Postgres」をクリックします。
「Create new cluster」をクリックします。
各所を設定し、「Create cluster」をクリックします。(作成後の変更可能です)
・Name:他に影響は無いので何でも良いです
・Region:どこでも良いですが、理由が無ければアプリと同じにしておけば良いです
・Plan:アプリの規模を考慮して選択します
・Storage:移行前のDBサイズ以上を指定します
現在のDBサイズの確認方法
順番に下記を実行します。
fly ssh console -a アプリ名
psql $DATABASE_URL
SELECT pg_size_pretty(pg_database_size(current_database()));
・Extensions:アプリ内容が必要としないものならチェックは外れたままで良いです
2. 移行
準備として、作成したクラスターのDATABASE_URLを抑えておきます。
Fly.ioのダッシュボードで作成したクラスターをクリックします。
画面左側の「Connect」をクリックします。

「Connection URL」というものがありますが、これを後で使用します。

順番に下記を実行し、移行をします。
2つ目のNEW_URLについて、末尾に「?sslmode=require」を追加します。(追加しないと次処理が失敗します)
fly ssh console -a アプリ名
NEW_URL="「先ほど確認したConnection URL」+ ?sslmode=require"
pg_dump "$DATABASE_URL" | psql "$NEW_URL"
次にコンソール上で再度psql "$NEW_URL"を実行し、適当なSELECT文を実行し、データがちゃんとあることを確認します。
最後に下記を実行して環境変数を更新します。
fly secrets set DATABASE_URL="「先ほど確認したConnection URL」+ ?sslmode=require"
3. unmanaged Postgresの削除
移行後、アプリの動作確認を行います。
問題が無ければ、削除前にまずは停止します。
Fly.ioのダッシュボードに行き、画面左側の「Apps」をクリックします。

これまで稼働していたunmanaged Postgresをクリックします。
画面左側の「Machines」をクリックします。

和同開珎のような見た目をしたボタンがありますので、これをクリックしてインスタンスを停止します。
複数台ある場合は全て停止します。
停止後、しばらく様子見をして問題が無ければ削除します。
Apps > unmanaged Postgres > Settingsにて「Delete app」をクリックします。
移行が未完了の場合はこれでデータが消えてしまうので、移行および停止後の様子見まで確実に問題が無ければ実施してください。
Appsからunmanaged Postgresがいなくなれば削除成功です。
以上で終了です。
参考

