2024/12/10 gem 依存パッケージバージョンのしくじりのはなし
1. Sidekiq が接続する AWS Elasticache Redis インスタンスの向き先変更
Redis インスタンスは redis 6 から redis 7 に変わる 先のはなしではふれていませんでしたが、Sidekiq 6 を使用しているというのが大前提にあります 7にアップデートしたらどうかという話もあると思います
ただデータマイグレーションなど実施項目が多く、変数を増やさいないため Sidekq 7 へのアップデートを同時に行うことは見送りました
そのため Sidekiq 6 のまま新しい Redis 7 のインスタンスへ、ACL で作成したユーザを指定し、データベースIDも指定するというのが前提条件になります
まずは Sidekiq 6 のまま素直に Redis 7 のインスタンスへ接続してみましょう、ということで Staging 環境でエイヤでやってみると、以下エラーで Sidekiq が起動できませんでした
Redis::CommandError: NOPERM this user has no permissions to run the ‘info’ command (Redis::CommandError)
infoコマンドを Redis へ実行しようとして許可されていないユーザだとなっていますね
redis-cli で接続し ACL CAT dangerous を確認するとわかりますが、これは dangerous カテゴリのコマンドです
さりとて、作成されたユーザは +@all -@dangerous +info とあるように、dangerous を除外しつつも、info コマンドは許可されているはずです
ローカルで試してみても再現できない…ということは、AWS Elasticache + Fargate ECS タスクの Sidekiq という状況になにか理由があるのか調べるほかありません
最小構成、ECS で Sidekiq が動作するバージョン同等の Ruby + redis-rb (gem redis) でオペレーション用のEC2インスタンスから実際に接続を試行します
(rbenv などで Ruby バージョンはすでに揃っている前提です & 接続するユーザ名、インスタンス名はダミーです)
code:irb
irb(main):002:0> require 'redis'
=> true
irb(main):003:0> redis = Redis.new(url: "rediss://alice:@master.staging-wanderland.nodeid.apne1.cache.amazonaws.com:6379/1")
=> #<Redis client v5.2.0 for rediss://master.staging-wanderland.nodeid.apne1.cache.amazonaws.com:6379/1> irb(main):004:0> redis.info
=>
{"redis_version"=>"7.0.7",
"redis_git_sha1"=>"0",
"redis_git_dirty"=>"0",
"redis_build_id"=>"0",
"redis_mode"=>"standalone",
"os"=>"Amazon ElastiCache",
<snip>
つながるやん!!! おかしい…なにが良くないのか…
しばらく頭を抱えて別の日にあることに気づきます
「redis gem のバージョン、合わせてなくない?」
Sidekiq 6 が依存している redis gem のバージョンは < 5, >= 4.5.0 です
確認につかった redis gem は v5.2.0 です
なんということだ…gemバージョンをあわせていなかった…あらためて確認すると
code:irb
irb(main):002:0> require 'redis'
=> true
irb(main):003:0> redis = Redis.new(url: "rediss://alice:@master.staging-wanderland.nodeid.apne1.cache.amazonaws.com:6379/1")
=> #<Redis client v4.8.1 for rediss://master.staging-wanderland.nodeid.apne1.cache.amazonaws.com:6379/1> irb(main):004:0> redis.info
/usr/local/rbenv/versions/3.x.x/lib/ruby/gems/3.1.0/gems/redis-4.8.1/lib/redis/client.rb:162:in `call': NOPERM this user has no permissions to run the 'info' command (Redis::CommandError)
<snip>
無事(?)再現しました
教訓: 最小構成で再現確認する際にパッケージやライブラリのバージョンを合わせるのを失念するな
今日は以上です