Herokuからredisのバージョンをv6にアップブレードするようにと催促メールが届いたので対応しました。 公式のアップグレード手順に従って対応しましたが、それだけだとエラーが発生してしまいましたので記事にすることにしました。同じ轍を踏まないためにも参考なれば幸いです。
Herokuからのメール(抜粋)
Running up-to-date software versions is essential for maintaining a highly-available and secure fleet of Heroku Data for Redis instances. Your Redis database redis-xxx on your-app is running a deprecated version (4.0.14) and will not be supported after 30 Jun, 2023.
Redis6ではTLS接続が必須になるため設定ファイルに注意!
Redis6からはPremiumプラン以上の場合はTLS接続が必須となったようなので、Sidekiq等でRedisの接続定義を変更する必要があります
Sidekiq.configure_server do |config| config.redis = { url: ENV["REDIS_URL"], # ↓この部分を追加 ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } } end Sidekiq.configure_client do |config| config.redis = { url: ENV["REDIS_URL"], # ↓この部分を追加 ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } } end
この定義を追加しなかった場合、OpenSSL::SSL::SSLError (hostname "xxxxxx" does not match the server certificate):
というエラーが発生してアプリからRedisに接続ができなくなってしまいます。
なぜVERIFY_NONEなのかというとHeroku内部ではSSLを使用していないためです。HerokuのルーターレベルでSSLを終了させて、内部接続にはHTTPSを使用しているため、VERIFY_NONEで問題ないとのことでした。
https://stackoverflow.com/questions/65834575/how-to-enable-tls-for-redis-6-on-sidekiq
アップグレード手順
上記の考慮を踏まえてアップグレードを実行します。 基本的には公式のアップグレード手順と同じことをしています。
1. メンテナンスモードをON
heroku maintenance:on
2. アップグレード実行
heroku redis:upgrade --version 6.2
3. アップグレード進捗状況の確認
heroku redis:info === redis-angular-51206 (REDIS_URL) Plan: Premium 0 Status: preparing (version upgrade in progress) Created: 2021-09-08 20:41 Version: 5.0.12 Timeout: 300 Maxmemory: noeviction Maintenance: not required Maintenance window: Tuesdays 21:00 to Wednesdays 01:00 UTC Persistence: AOF HA Status: Available Requires TLS: No Keyspace Notifications: Disabled
私の環境の場合、preparingからavailableに変わるまで20分程度の時間が掛かりました。
4. メンテナンスモードをOFF
heroku maintenance:off
終わりに
以上でアップグレード作業は完了です。
途中OpenSSL::SSL::SSLError
が発生してかなり焦りましたがすぐに対応できて良かったです。
テスト環境でもリハーサルでアップグレードをしたのですが、その時はエラーが発生しませんでした。なぜ発生しなかったかというとテスト環境ではRedisをPremiumプランにしていなかったためです。Premium未満の場合、TLS接続は必須ではないためOpenSSL::SSL::SSLError
のエラーが発生しないため防ぐことが出来ませんでした。
テスト環境でも同スペックの構成をしておく必要があるのだと改めて痛感しました。。
参考
https://ogirginc.github.io/en/heroku-redis-ssl-error https://devcenter.heroku.com/ja/articles/connecting-heroku-redis#connecting-in-ruby