HerokuでPostgresを利用しているとバックアップの仕組みなどが最初からアドオンで提供されており非常に便利です。PG BackupというAddonですね。
このAddonは、現在バックアップの定期取得がプライベートベータで公開されています。おそらく、申し込めば利用できるのですが現在公開されている有料版のプランでも$30/月となっており定期取得もリリースされたとしても少し割高に感じます。
また、このアドオンを利用した場合herokuが管理しているAmazon S3の領域にファイルがバックアップされます。このURLはherokuコマンドを打つことで、ダウンロードURLを取得できるのですが、バックアップを利用する時というのはおそらくHeroku自体がダウンした時になるはずでそのときにherokuコマンドを発行できるのかというと疑問です。そのため自分のS3の領域にそのバックアップファイルを移動させておくほうが安全であると思っています。
そこで、HerokuのDaily cronのAddonを利用して、定期取得する仕組みが公開されていたので、それを改良してさらに自分のS3の領域にバックアップをコピーする仕組みを作ってみました。
コードの変更は以下の行とファイルを追加します。
Gemfile
gem "heroku_backup_task", :git => "git://github.com/mataki/heroku_backup_task.git"
lib/tasks/cron.rake
require "heroku_backup_task/tasks"task :cron => :heroku_backup_and_store_s3 if Rails.env.production?
簡単ですね。
後はherokuコマンドでaddonとconfigを追加すればOKです。Amazonのキーとbacketを設定してください。
heroku addons:add cron:dailyheroku config:add AWS_S3_SECRET_KEY="xxxx" AWS_S3_KEY_ID="xxxx" BACKUP_BACKET="backet-name"
以上で、設定は完了です。
これで日次で設定したS3のバケットに b001.dump という感じでファイルがどんどん保存されていきます。これでherokuが障害で操作不能に陥ってもデータを取り出すことができますね。