ITエンジニアによるITエンジニアのためのブログ

Heroku Postgres: Essentialプラン間でプランを変更する手順

この記事では、Heroku Postgresデータベースのプランを、あるEssentialプランから別のEssentialプランへ変更する手順を解説します (例: essential-1 から essential-0 へのダウングレード)。コスト削減やリソースの最適化のためにプラン変更が必要な場合に参考にしてください。

なお、Essentialプラン以外へのアップグレード手順については、「Heroku PostgreSQLのプランアップグレード方法」をご参照ください。

注意点:

  • Essentialプラン間の変更は即座に開始され、短時間のダウンタイムが発生します (メンテナンスモードを利用)。
  • プラン変更中は、データベースが読み取り専用 (read-only) モードになります。
  • 作業前後のデータベースバックアップを強く推奨します。

前提:

  • Heroku CLI がインストールされ、ログイン済みであること。
  • 対象のHerokuアプリケーションに対する操作権限があること。

手順:

1. データベース情報の確認

まず、移行対象となるデータベースの情報を Heroku CLI で取得します。このとき表示されるデータベースのURL (HEROKU_POSTGRESQL_COLOR_URL の形式) は後の手順で使用するため、控えておいてください (COLOR の部分は実際のデータベースの色名です)。

heroku pg:info --app YOUR_APP_NAME

【出力例】

=== DATABASE_URL, HEROKU_POSTGRESQL_COLOR_URL
Plan:                  essential-1
Status:                Available
Connections:           0/20
PG Version:            14.13  # プラン変更後にマイナーバージョンが上がる可能性があります
Created:               2024-06-19 22:42 # (例) データベース作成日時
Data Size:             27.4 MB / 10 GB (0.27%) (In compliance) # 容量制限内
Tables:                15/4000 (In compliance) # テーブル数制限内
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-addon-name # アドオン名
  • YOUR_APP_NAME は実際のアプリケーション名に置き換えてください。
  • HEROKU_POSTGRESQL_COLOR_URL は、対象データベースの環境変数名です。通常 DATABASE_URL と同じか、別の色名 (例: HEROKU_POSTGRESQL_CYAN_URL) になります。heroku config --app YOUR_APP_NAME でも確認できます。
  • postgresql-addon-name は、Heroku上で管理されているアドオンのユニークな名前です。

2. メンテナンスモードへの移行

Essentialプランの変更では、Standardプラン以上のプラン変更時に行われるようなメンテナンスウィンドウのスケジューリングは行われず、コマンド実行後すぐに移行プロセスが開始されます。そのため、移行中の意図しないアクセスやデータ不整合を防ぐために、アプリケーションをメンテナンスモードに移行します。

heroku maintenance:on --app YOUR_APP_NAME

コマンド実行後、ブラウザでアプリケーションにアクセスし、メンテナンス画面が表示されることを確認してください。

3. 事前バックアップの取得

万が一の事態に備え、プラン変更前に手動でデータベースのバックアップを取得します。

heroku pg:backups:capture --app YOUR_APP_NAME

バックアップは heroku pg:backups --app YOUR_APP_NAME で確認できます。

4. プラン変更の実行

手順1で控えたデータベースURLと、変更先のプラン名 (heroku-postgresql:essential-0 など) を指定して、アドオンプラン変更コマンドを実行します。

# 書式: heroku addons:upgrade [アドオン名 or データベースURL] [新しいプラン名] --app YOUR_APP_NAME
heroku addons:upgrade HEROKU_POSTGRESQL_COLOR_URL heroku-postgresql:essential-0 --app YOUR_APP_NAME

# または アドオン名を指定する場合
# heroku addons:upgrade postgresql-addon-name heroku-postgresql:essential-0 --app YOUR_APP_NAME

# 実行後メッセージ例
Changing postgresql-addon-name on YOUR_APP_NAME from heroku-postgresql:essential-1 to heroku-postgresql:essential-0… done, ~$0.007/hour (max $5/month)
Your database's plan is being changed.
  • YOUR_APP_NAME, HEROKU_POSTGRESQL_COLOR_URL, postgresql-addon-name はご自身の環境に合わせてください。
  • 変更先のプラン名 (essential-0 の部分) も指定したいプランに合わせてください。

5. プラン変更の進捗確認

プラン変更が開始されると、データベースのステータスが段階的に変化します。heroku pg:info コマンドで進捗を確認できます。

heroku pg:info --app YOUR_APP_NAME

ステータスは Available -> plan change: preparing (準備中) -> plan change: provisioning (プロビジョニング中) のように移行します。

【ステータス変化例】

# 準備中
Status: plan change: preparing
...

# プロビジョニング中
Status: plan change: provisioning
...

この間、データベースは読み取り専用モードになっています。

また、Herokuアカウントのメールアドレス宛に、「Plan change on your Postgres add-on」という件名で、プラン変更が開始された旨の通知メールが届きます(データベースが読み取り専用モードになったこと、所要時間の目安などが記載されています)。

6. プラン変更の完了確認

プラン変更が完了すると、heroku pg:info コマンドの出力が以下のように変わり、新しいプラン名 (essential-0) と Available ステータスが表示されます。データベースのサイズにもよりますが、通常15分前後で完了します。

heroku pg:info --app YOUR_APP_NAME

【完了時の出力例】

=== DATABASE_URL, HEROKU_POSTGRESQL_COLOR_URL
Plan:                  essential-0 # 新しいプラン名
Status:                Available   # ステータスが Available に戻る
Connections:           0/20
PG Version:            14.15      # マイナーバージョンが更新される場合がある
Created:               2024-06-19 22:42
Data Size:             27.1 MB / 1 GB (2.65%) # 容量上限が新しいプランのものに変わる
Tables:                15/4000
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-addon-name

プラン変更が完了した際も、開始時と同じ件名で完了通知メールが届きます(読み取り専用モードが解除された旨などが記載されています)。

7. 事後バックアップの取得

プラン変更が無事完了したことを確認するため、念のため再度バックアップを取得しておきましょう。

終わったら念のために再度データベースバックアップを取ります。

heroku pg:backups:capture --app YOUR_APP_NAME

8. メンテナンスモードの解除

データベースのプラン変更が完了したので、アプリケーションのメンテナンスモードを解除します。

heroku maintenance:off --app YOUR_APP_NAME

9. アプリケーションの動作確認

最後に、ブラウザでアプリケーションにアクセスし、データベースへの読み書きを含め、正常に動作することを確認してください。問題がなければ、プラン変更作業は完了です。