Railsで特定のコントローラーでSessionを使わないようにする

Railsはコントローラーで session に書き込みを行うとセッションIDがアサインされ、Set-CookieでCookieにセッションIDが設定される。

デフォルトでは全てのリクエストでCSRFトークンをセッションに格納しているため、何も設定していないとランディングページなどのセッションをあまり必要としない静的ページへのアクセスでセッションストアの容量が圧迫されたりしてしまう。

コントローラーで `protect_against_forgery?` をオーバーライドして false を返すようにすると、session に書き込みが行われないため、新規にセッションIDがアサインされなくなる。

class StaticPagesController < ApplicationController
  skip_before_action :authenticate_user!

  parivate

  def protect_against_forgery?
    false
  end
end

ただし当然ながらCSRFトークンが作成されなくなるため、使いどころは注意されたし。

外部サービスで使用しているPostgresqlのデータベースをHeroku Postgresにリストアする

基本的にはHerokuのドキュメントに全て書いてある。
https://devcenter.heroku.com/articles/heroku-postgres-backups

今回はAWS EC2のRailsアプリケーションをHerokuに移行した時のデータベースのコピーしたので、手順をメモしておく。

AWSサービス側での操作

  1. メンテナンス画面にした後、冗長化してあるWEBサーバーを止めて1台のシングル構成に。
  2. パブリックディレクトリ(Herokuがアクセスできる場所)にPostgresqlのダンプファイルを作成する。念のため、ファイル名は乱数にでもしておく。
PGPASSWORD=$PG_PASSWORD pg_dump -Fc --no-acl --no-owner -U $PG_USER -h $PG_HOST -p $PG_PORT $PG_DATABASE -f /var/www/app/current/public/xxxxxxxxxx.dump

Heroku側での操作

heroku pg:backups:restore 'https://www.app.com/xxxxxxxxxx.dump' DATABASE_URL --app=app-name --confirm=app-name

これでHerokuにDBがコピーされるので、ドメインをHerokuに向けてメンテナンスを解除する。

注意

heroku pg:backups:restore を実行すると、URLにアクセスできなかったなどの理由でリストアに失敗した場合でもHeroku Postgres のデータベースは削除されてしまう。