Edited at
HerokuDay 10

本番環境のデータが全部消えて無くなってもすぐ復旧できるようにしたい

More than 1 year has passed since last update.


Herokuの本番環境がすべて消えて無くなるみたいな怖いことが起こったことはありませんか?

僕はあります。(Herokuでカードの期限切れててアカウントごと消去された話 - yo-log)

たいていの人はちゃんとカードの更新とかしてると思うので問題ないと思いますが、万が一アカウントごと消されても余裕の表情で「すぐ復旧できるから大丈夫、そうHerokuならね」と言えるようにするための準備をいくつか書いてみようと思います。


その1: アプリケーションの設定をTerraform管理にする

復旧するときに面倒なのが、アカウントを取り直してアプリケーションの設定をゼロからやり直すときです。アドオンに何入れてたとかは覚えているかもしれませんが、環境変数などは無理です。

普段からコード管理しておけばいざというときにコマンド一発ですべてを復旧できます。

こんなかんじ。

yo-iida/heroku-terraform

TerraformのHeroku providerのドキュメントは以下になります。

Provider: Heroku - Terraform by HashiCorp

アプリケーション、アドオン、証明書、ドメイン、パイプラインなどの管理ができます。基本の機能は揃っていると思いますので、なにかあったときに備えるという点では運用中のアプリケーションでもやっておくと安心できそうです。

ちなみに、最近HerokuでもDockerが普通に使えるようになりましたが1、まだ普通に画面からポチポチアプリケーションの設定をしている方も多いのではないかという観点で書いております。Dockerで運用しているのであれば、Dockerイメージがあるのでこの話はいらないですね。


その2: バックアップをとる(Herokuの外に)

アプリケーションが消えた時に復旧のしようがないのがDBなどのアドオンで使っているデータだと思います。


DB

HerokuだとHeroku Postgresを使うことが多いと思います。Heroku Postgresにはバックアップの機能2があり、定期的にバックアップをとるといったこともできます。

しかし、本番でバックアップをとっているからといって安心してはいけません。アカウントを消去された場合バックアップも消されます。

なので、バックアップをHerokuの外に置くことを考えます。バックアップは、

heroku pg:backups:download

でローカルに落とせますが、手元の環境でcronに仕込むみたいなのはいかにもいけてないので、AWSのEC2などにherokuコマンドを実行できるインスタンスを用意して定期的にS3にバックアップデータを置くような仕組みを作るとよさそう。


その他

その他のアドオンについてはこれといって良い案がないので誰か教えてください。特にDNSなんかはアドオンで使っているものを再設定するのは結構めんどくさいと思います。

AWSであればTerraformで管理できるのでDNSもRoute53にするというような合わせ技で考えるといいかもしれません。


まとめ

Terraformでコード化して管理すると嬉しいよという話はいいとして、(アカウントを消されるというレアなケースについて)バックアップのバックアップをとるみたいなよくわからない話を書いてしまいすみませんw(と、言いつつバックアップ先にHeroku外のストレージを指定できるオプションがあるとうれしいのでは?という気もする)

個人的にはHeroku Billingメールをちゃんとみるということに尽きると思っております。