无法连接到 ElastiCache Redis

问题描述 投票:0回答:0

我有一个小型 Rails 7.0 应用程序,它使用 Redis 作为存储,从中获取数据以便稍后在后台处理。应用程序通过 ActiveJob API 与其进行通信,该 API 使用 Sidekiq 作为适配器。

我当地的环境一切都很顺利。但当我将它部署到 AWS 时,它就停止工作了。

当我进入远程环境并运行

sidekiq
时,我收到以下错误:

2024-01-23 17:13:52.760152 I [678:5260] Sidekiq -- Booted Rails 7.0.8 application in staging environment
2024-01-23 17:13:52.760235 I [678:5260] Sidekiq -- Running in ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) +YJIT [x86_64-linux-musl]
2024-01-23 17:13:52.760246 I [678:5260] Sidekiq -- See LICENSE and the LGPL-3.0 for licensing details.
2024-01-23 17:13:52.760250 I [678:5260] Sidekiq -- Upgrade to Sidekiq Pro for more features and support: https://sidekiq.org
2024-01-23 17:13:52.760275 I [678:5260] Sidekiq -- Sidekiq 7.2.1 connecting to Redis with options {:size=>10, :pool_name=>"internal", :url=>"redis://abc-def-ghi.serverless.apne1.cache.amazonaws.com:6379/0"}
Waited 1.0 seconds
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/ruby_connection/buffered_io.rb:140:in `block in fill_buffer'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/ruby_connection/buffered_io.rb:122:in `loop'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/ruby_connection/buffered_io.rb:122:in `fill_buffer'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/ruby_connection/buffered_io.rb:114:in `ensure_remaining'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/ruby_connection/buffered_io.rb:85:in `getbyte'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/ruby_connection/resp3.rb:113:in `parse'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/ruby_connection/resp3.rb:50:in `load'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/ruby_connection.rb:94:in `read'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/connection_mixin.rb:51:in `block in call_pipelined'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/connection_mixin.rb:49:in `times'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/connection_mixin.rb:49:in `call_pipelined'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client.rb:749:in `block in connect'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/middlewares.rb:16:in `call'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client.rb:748:in `connect'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client.rb:710:in `raw_connection'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client.rb:675:in `ensure_connected'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client.rb:255:in `call'
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/decorator.rb:26:in `call'
/usr/local/bundle/gems/sidekiq-7.2.1/lib/sidekiq/config.rb:144:in `block in redis_info'
/usr/local/bundle/gems/sidekiq-7.2.1/lib/sidekiq/config.rb:163:in `block in redis'
/usr/local/bundle/gems/connection_pool-2.4.1/lib/connection_pool.rb:110:in `block (2 levels) in with'
/usr/local/bundle/gems/connection_pool-2.4.1/lib/connection_pool.rb:109:in `handle_interrupt'
/usr/local/bundle/gems/connection_pool-2.4.1/lib/connection_pool.rb:109:in `block in with'
/usr/local/bundle/gems/connection_pool-2.4.1/lib/connection_pool.rb:106:in `handle_interrupt'
/usr/local/bundle/gems/connection_pool-2.4.1/lib/connection_pool.rb:106:in `with'
/usr/local/bundle/gems/sidekiq-7.2.1/lib/sidekiq/config.rb:160:in `redis'
/usr/local/bundle/gems/sidekiq-7.2.1/lib/sidekiq/config.rb:143:in `redis_info'
/usr/local/bundle/gems/sidekiq-7.2.1/lib/sidekiq/cli.rb:75:in `run'
/usr/local/bundle/gems/sidekiq-7.2.1/bin/sidekiq:31:in `<top (required)>'
/usr/local/bundle/bin/sidekiq:25:in `load'
/usr/local/bundle/bin/sidekiq:25:in `<main>'

当我启动 Rails 控制台并运行命令来放置作业时,出现以下错误:

irb(main):001:0> ExampleJob.perform_later(user_id: 1)
2024-01-23 17:17:15.180008 I [685:4720 redis_connection.rb:15] Sidekiq -- Sidekiq 7.2.1 connecting to Redis with options {:size=>10, :pool_name=>"internal", :url=>"redis://abc-def-ghi.serverless.apne1.cache.amazonaws.com:6379/0"}
2024-01-23 17:17:17.194664 I [685:4720 subscriber.rb:149] Rails -- Enqueued ExampleJob (Job ID: 804eca79-8e6a-4b99-8368-310eb28ac0f2) to Sidekiq(default) -- {:event_name=>"enqueue.active_job", :adapter=>"Sidekiq", :queue=>"default", :job_class=>"ExampleJob", :job_id=>"804eca79-8e6a-4b99-8368-310eb28ac0f2", :provider_job_id=>nil, :arguments=>"[\n  {\n    \"user_id\": 1\n  }\n]"}
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/ruby_connection/buffered_io.rb:140:in `block in fill_buffer': Waited 1.0 seconds (RedisClient::CannotConnectError)
/usr/local/bundle/gems/redis-client-0.19.1/lib/redis_client/ruby_connection/buffered_io.rb:140:in `block in fill_buffer': Waited 1.0 seconds (RedisClient::ReadTimeoutError)

我很困惑。谁能告诉我罪魁祸首是什么?

还有一些需要提及的事情是:

  • bundle exec sidekiq
    已经在应用端执行了
  • Redis 是 ElastiCache“无服务器”
  • Redis 与应用属于同一个 VPC
  • 此时Redis的安全组非常松散
    • 入站 - HTTP(端口 80)、HTTPS(端口 443)、TCP(端口 6379),所有这些都以
      0.0.0.0/0
      作为源
    • 出站--所有协议,所有带有 0.0.0.0/0 的端口
  • Redis 没有用户组的访问控制
sidekiq aws-serverless ruby-on-rails-7 amazon-elasticache
© www.soinside.com 2019 - 2024. All rights reserved.