RailsでRedisをつかってセッション管理をする際に気になったこと
いままで redis-rails を使っていたが、リポジトリのREADMEに以下記述があった
If you need session storage, consider directly using redis-actionpack instead.
セッションで使うならredis-actionpack
を使うことを検討してねと翻訳されました。
こっちのリポジトリのREADMEをみてもまあ、セッションストアに使えるよーとまでしか書かれていない。
なぜこの一文があるんだろ?
あ、キャッシュストアはRailsですぐ使えるやつ(ActiveSupport::Cache::RedisCacheStore
)ができたから、セッション管理だけで使うケースしかないでしょ?ってことか
A quick note about Rails 5.2
Rails 5.2.0 includes a Redis cache store out of the box, so you don't really need this gem anymore if you just need to store the fragment cache in Redis. Maintenance on the redis-activesupport gem will continue for security and compatibility issues, but we are no longer accepting new features. We are still actively maintaining all other gems in the redis-store family, such as redis-actionpack for session management, and redis-rack-cache for HTTP cache storage.
この記事がわかりやすかった
つまりキャッシュ・セッションでRedisを扱う場合のライブラリ選定として、
どっちもredis-railsを使って実現するならそれを使えばいいけど、エラーにするかどうかという基準も検討材料にする必要がある
- キャッシュストアではRailsが用意している機能を使う場合はエラーにはならない
- キャッシュとしては効率などで使われることがほとんどの目的なので、エラーにならないでよさそう
- 検知できる仕組みは用意されているべきかも
- セッションストアでは
redis-rails
,redis-actionpack
を使う場合はエラーになる-
redis-session-store
の場合はエラーにならないとのこと
-
Redisは現時点で7.0.6まで出ている
AWS ElastiCache は 7.0 まで対応している
パッチバージョンは勝手に更新されていくみたい?
クラスターは、作成時または変更時に、現在利用可能な Redis 6.0 の任意のパッチバージョンで起動されます。
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/supported-engine-versions.html
セッションに登録されないなーとおもっていたら、Railsでは現在Redisは6.2の対応をまだできていない?
Dockerでは7.0を入れていたのでそれが原因かも?
ミドルウェアは適用されている
$ bin/rails middleware
use ActionDispatch::HostAuthorization
use Rack::Sendfile
use ActionDispatch::Static
use ActionDispatch::Executor
use ActionDispatch::ServerTiming
use ActiveSupport::Cache::Strategy::LocalCache::Middleware
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use ActionDispatch::RemoteIp
use Sprockets::Rails::QuietAssets
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::ActionableExceptions
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActionDispatch::Cookies
use ActionDispatch::Session::RedisStore
use ActionDispatch::Flash
use ActionDispatch::ContentSecurityPolicy::Middleware
use ActionDispatch::PermissionsPolicy::Middleware
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use Rack::TempfileReaper
run RailsTemplate::Application.routes
接続も問題なくRails consoleからできるけどなー...
irb(main):017:0> redis = Redis.new(host: "redis", db: 0)
=> #<Redis client v4.8.0 for redis://redis:6379/0>
irb(main):018:0> redis.keys
=> []
irb(main):019:0> redis.set("test", "hoge")
=> "OK"
irb(main):020:0> redis.keys
=> ["test"]
irb(main):021:0> redis.get("test")
=> "hoge"
irb(main):022:0> redis.del("test")
=> 1
irb(main):023:0> redis.keys
=> []
secureの設定ミスだった
secure = ENV['REDIS_SECURE'] || false
としてsecureを設定していたが、
環境変数に
REDIS_SECURE=false
と設定しているが、文字列として判定されtrufyとなったのだろう...