JawsDB

【Heroku】JawsDBのアップグレード。Multi TenantからSingle Tenantに変更

HerokuのJawsDBのプランを「Leopard Shared」から「Whitetip」に変更したい。

ただ今回のようにMulti Tenant(Leopard Sharedなど)からSingle Tenant(Whitetipなど)に変更する場合に、Add-onsのページからプラン変更ができなかったのでその方法をメモしていきます。

JawsDBをアップグレードする方法

HerokuのAdd-onsからJawsDBのプランを変更することができない。

Multi TenantからSingle Tenantに変更したい場合は、新しく別のJawsDBをインストールしないといけないようです。(Add-onsにJawsDBが2つある状態になる)

▼普通にプラン変更しようとすると表示されるエラー

Item could not be updated:
An error was encountered when contacting the add-on partner to change to jawsdb:whitetip: Cannot automatically move between Shared and single-tenant plans. See documentation. https://devcenter.heroku.com/articles/jawsdb#migrating-between-plans

「古いJawsDB」から「新しいJawsDB」へデータ移行する

DBを新しく作ったので、まだ新しい方のDBは何も入っていない状態になっています。なので今まで使っていた古いDBから新しいDBにデータ移行する必要があります。

そのためには⑴古いDBからsqlファイルをエクスポートして、⑵新しいDBへそのsqlファイルをインポートする、という手順になります。

Herokuの環境変数を新しいDBに切り替える

SettingsのConfig Varsに記載しているデータベースの環境変数(DB_HOST、DB_PASSWORDなど)を書き換えましょう。

まとめ

HerokuのJawsDBの中でも安いプランを使ってAPIを作っていたのですが、すぐにDBのアクセス回数上限に達して500エラーになることが頻発していたので遂にアップグレードに踏み切りました。

「新しくDBを作ってデータ移行する」というのは少し面倒ではありますが、特に難しい作業はなかったので意外とすんなりアップグレードすることができました。これでやっとAPIがたくさん使える!!

【Heroku】JawsDBの無料プランには制限がある

HerokuにWEBサービスをデプロイする時には、mySQLを使うためにアドオンの「JawsDB」を利用することがあります。

たまにページにアクセスすると突然500エラーが起きて、そこからしばらく500エラーが出続けてページが開けないということが時々ありました。

そしてどうやらその原因がJawsDBによるエラーということがわかったので、そのメモです。

Server Error (500)の原因

JawsDBの特定のプランには1時間のうちにDBへアクセスする回数の上限max_questions)があり、この上限を超えてしまうと500エラーになってしまいます。

制限があるのはSharedプラン(上から3つの安いプラン)で、これらは他のユーザーと容量をシェアしているため1ユーザーが使いすぎないために制限を設けているようです。

SharedプランSingle-tenantプラン
DBへのアクセス回数上限あり(1時間あたりの回数)上限なし
料金Free 〜 月24ドル月39ドル 〜
対象プランKitefin Shared
Leopard Shared
Blacktip Shared
Whitetip
Whitetip Alpha
Mako
…etc

Server Error (500)を起きないようにするには

「Single Tenant」を持っているプラン(上から4つ目以降)にする方法です。これらはアクセス回数の上限がないため、確実にエラーを起こさせないためにはプランを上げることが一つの解決法です。

ただし「月$39〜」という価格なのでお手頃とは言えないですね…。

Server Error (500)が起きてしまったら…

もしSharedプランを利用していて上限に達してしまったら、「1時間待つ」か「プランを上げる」のどちらかしかないと思います。

対処法

  1. 1時間待つ
  2. JawsDBのプランを上げる

まとめ

DawsDBを安く利用するなら上限に達しない範囲で抑えるように工夫しないといけないようです。

個人的には、Djangoの管理画面上で大量データをCSVインポートをしたかったり、DjangoでAPIを作ってNext.jsで大量のページをビルドしたかったりするので、プランを上げるしかないのかなと感じでしまいました。。

一時的な大量アクセスの時だけアップグレードして、終わったらすぐにダウングレードするとかだと料金的にどうなるんだろうか…