【Rails初学者】Heroku RedisをRails/Sidekiqに繋いでみる
こんにちは。
エンジニア転職を目指し、学習中の現役看護師です。
今回、RailsアプリをHerokuにデプロイしつつ、Redisを使ってSidekiqを動かすまでの手順を、表示されたエラーや対処も含めて備忘録のために、まとめてみました。
この設定でできるようにしたいこと
- RailsアプリにHeroku Redisを導入したい
- Sidekiq(非同期処理)をRedisで動かしたい
- Redisの証明書エラーを解決したい
環境
- Ruby 2.7.7
- Rails 6.0.6.1
- Sidekiq
- Heroku(Miniプラン)
- Redis gem 4.8.1
1. Heroku Redisを追加
Heroku CLIでアドオンを追加:
heroku addons:create heroku-redis:mini --app アプリ名
数分待つと、以下のように環境変数が自動で設定される
REDIS_URL
REDIS_TLS_URL ← これがSSL接続用
表示されたエラー:SSL証明書エラー
SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate in certificate chain)
Heroku Redisは自己署名証明書を使用しているため、そのままだとSSL接続時に失敗してしまうこともある。
Redis設定(config/initializers/redis.rb)
$redis = Redis.new(
url: ENV["REDIS_TLS_URL"],
ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE }
)
REDIS_TLS_URL を指定し、verify_mode を VERIFY_NONE にするといいらしい。
Sidekiqの設定(config/initializers/sidekiq.rb)
Sidekiq.configure_server do |config|
config.redis = {
url: ENV["REDIS_TLS_URL"],
ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE }
}
end
Sidekiq.configure_client do |config|
config.redis = {
url: ENV["REDIS_TLS_URL"],
ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE }
}
end
動作確認
Herokuのコンソールから接続確認
heroku run rails console --app アプリ名
Rails.cache.write("test_key", "Hello Redis")
Rails.cache.read("test_key")
# => "Hello Redis"
これで値が返ってきたらRedis接続できている。
エラーが表示された際の確認事項
エラー内容 | 原因 | 解決策 |
---|---|---|
certificate verify failed |
SSL証明書の検証失敗 |
ssl_params: { verify_mode: VERIFY_NONE } を忘れてないか |
REDIS_TLS_URL がない |
Redisアドオンがまだ作成中なのか |
heroku addons:info で確認 |
Sidekiqが動かない | workerが停止中なのか |
heroku ps:scale worker=1 を実行 |
ActionCableなど他用途でも同じ対応が可能らしい
# config/cable.yml
production:
adapter: redis
url: <%= ENV["REDIS_TLS_URL"] %>
channel_prefix: your_app_production
ssl_params:
verify_mode: <%= OpenSSL::SSL::VERIFY_NONE %>
まとめ
- Heroku Redisは自己署名証明書なのでSSL設定が必須
REDIS_TLS_URL
を使用(←REDIS_URL
ではない)verify_mode: OpenSSL::SSL::VERIFY_NONE
を忘れない
初学者のため、間違えていたらすいません。
引き続き、学習を進めます。