HerokuのPostgreSQLをアップグレードした

-2019.04.19 -インフラ
-

スポンサーリンク

無料プランのHerokuでRailsアプリケーションを開発・運用

会社の某ミーティングをきっかけに、年末ごろからRailsを利用して社内ピアボーナス・ブログ管理システムの個人開発していました。これは誰かの指示ではなく、課題・アイデアを聞いたときにシステム化により生じている課題を解決できるのではないか?と思えたため、自分で動いて開発したものです。

会社でのエンジニアと呼べる人間は 2人/100名超 の状況で、これからエンジニア組織を立ち上げていくフェーズにありますが、この行動は組織立ち上げに対して非常に良い影響をもたらしたと考えています。これはまたどこかでブログに書きます。

そのシステムを3月1日から全社にリリースして運用・保守をしているのですが、本エントリではインフラにPaaSのHerokuを選定したために生じたことについて書き留めておきます。

ちなみに、「ピアボーナス」とは英語のPeer(仲間、同僚)とBonusが1つになった言葉です。日ごろ表面化しにくい仕事による成果や貢献などに対して、従業員同士が互いに成果給を送り合える仕組みを表します。Googleも社員評価項目として導入している概念で、Uniposが有名なサービスです。

インフラがHerokuであることの利点

とにかく会社でエンジニアと呼べる人間は 2人/100名超 の状況です。
しかもRuby Goldを取ったばかりの私とその下に未経験からRailsエンジニアに転身した者がいるのみです。

WEBアプリケーションを載せるインフラとして代表的なEC2(Amazon EC2)やGCE(Google Compute Engine)のようなIaaSを使いこなせる技術力もリソースもあるはずもなく、Rails Tutorialで紹介されているHerokuをインフラに選定しました。

Herokuはセールスフォースが提供しているPaaSです。PaaSであるが故にネットワークやミドルウェアを独自設定するには自由度がないですが、一方で以下のメリットがあります。

月1,000時間までは無料

Herokuはdynoという独自のWebサーバプロセス単位で稼働しますが、無料利用枠があり、いちアカウントにつき月1,000時間のアプリ稼働枠が与えられます。今回の社内サービスの場合、4週間20営業日と仮定して24時間稼働だとしても480時間の稼働で済みます。料金体系が変わらない限り、無料枠の中で継続的に利用できます。

10,000レコードまでは無料

HerokuのDBとしてPostreSQLを利用していますが、無料プラン(Hobby Dev)では累計10,000レコードまでは無料で使えます。リリースから一定の期間はコストを掛けることなく様子見できるのも良い点の一つです。

メンテナンスコストがほぼゼロ

これまでHeroku側が原因で対応が発生したことはありません。運用が楽です。

デプロイがワンコマンドでできる

git push heroku master

とワンコマンド叩くだけでデプロイ出来るのも良い点です。

アドオン追加で追加拡張できる

実はPostgreSQLもアドオンです。その他にバッチ用のスケジュール管理、ログ管理、死活監視など多くのアドオンを無料から使う事ができます。


このようにランニングコストなしでWEBサービスをリリースできるHerokuですが、社員の方々が活発に使ってくれるお陰で(開発者としては本当に嬉しい限りなのですが)一週間あたり1,000レコードが蓄積するペースで利用されることとなりました。

このままではGW明けには無料プラン(Hobby Dev)のHerokuで利用できなくなると分かったので、月額9ドルプラン(Hobby Basic)にPostgreSQLをアップグレードしました。その手順をまとめておきます。

アップグレード手順

新DBを有料プランで作成

heroku addons:create heroku-postgresql:hobby-basic -a 【アプリ名】

# レスポンス
Creating heroku-postgresql:hobby-basic on ⬢ 【アプリ名】... $9/month
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pg:copy
Created postgresql-○○-○○ as HEROKU_POSTGRESQL_RED_URL
Use heroku addons:docs heroku-postgresql to view documentation

新DBが作成されたことを確認

HEROKU_POSTGRESQL_RED_URLとして新DBの情報が出力されればOKです。「RED」の部分は毎回異なる色が何か入ります。なお、DATABASE_URLの名称で旧DBも表示されます。

heroku pg:info --app【アプリ名】

メンテナンスモードをONにする

DB移管中にフロントでデータが生成されて差分が発生しないようにクローズします。

heroku maintenance:on -a 【アプリ名】

旧DBの内容を新DBに複製

pg:copyコマンドで複製します。
pg:copy DATABASE_URL(旧DB名) HEROKU_POSTGRESQL_RED_URL(新DB名)の順序です。

heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_RED_URL -a 【アプリ名】
 ▸    WARNING: Destructive action
 ▸    This command will remove all data from RED
 ▸    Data from DATABASE will then be transferred to RED
 ▸    To proceed, type 【アプリ名】 or re-run this command with --confirm 【アプリ名】

> 【アプリ名】
Starting copy of DATABASE to RED... done
Copying... done

アプリケーションの接続DBを切り替え

pg:promote HEROKU_POSTGRESQL_RED_URL(新DB名)で接続先を新DBに向けます。同時に、旧DBが「HEROKU_POSTGRESQL_GOLD_URL」の名称に変わります。

heroku pg:promote HEROKU_POSTGRESQL_RED_URL -a 【アプリ名】
Ensuring an alternate alias for existing DATABASE_URL... HEROKU_POSTGRESQL_GOLD_URL
Promoting postgresql-○○-○○ to DATABASE_URL on ⬢ 【アプリ名】... done

メンテナンスモードをOFFにする

heroku maintenance:off -a 【アプリ名】

フロントから操作してデータが保存されるかどうかを目視で確認

旧DBの削除

heroku addons:destroy HEROKU_POSTGRESQL_GOLD_URL

上記の流れでコマンドを打っていくと移管は簡単にできました。
Herokuを使ってスモールにサービスをスタートする場合は同じような状況になると思いますのでご参考に。

※Herokuのコマンド名称は変わる可能性があります。本記事は2019年4月19日に記載したものです。
正しい情報は公式を御覧ください。
Upgrading the Version of a Heroku Postgres Database

          
    

スポンサーリンク

  
Scroll Up