En mulig måde at gøre det på er at oprette en "ElastiCache-klynge" på AWS og fortælle Rails om at bruge den.
Jeg har min rails-app kørende med en OpsWorks-stack, og jeg bruger redis af to forskellige årsager:Brug Sidekiq til forsinket job og brug cachelageret.
Det er meget vigtigt at indstille den korrekte sikkerhedsgruppe for din redis ElastiCache-klynge skal denne sikkerhedsgruppe være tilgængelig for din OpsWorks-stak.
Opret først din Redis ElastiCache-klynge. Gå derefter ind i din AWS-konsol, klik på "EC2", klik derefter på "Sikkerhedsgruppe" (under NETVÆRK &SIKKERHED). Søg i sikkerhedsgruppen ved hjælp af det sikkerhedsgruppe-id, der er knyttet til din elasticache-klynge.
Indstil nu en indgående regel, hvor kilden er opsworks-sikkerhedsgruppen, som du har inde i opsworks.
I din EC2 -> Sikkerhedsgruppe:
I OpsWorks -> Lag -> Rails App Server Security:
Til sidst, i dit Rails-projekt, rediger din config/production.rb fil (forudsat at du arbejder for produktionsenv) og tilføj en linje som denne for at indstille din cachelager:
config.cache_store = :redis_store, "redis://#{Rails.application.secrets.redis_host}:#{Rails.application.secrets.redis_port}/0/cache", { expires_in: 90.minutes }
Så for at få Sidekiq til at bruge Redis, skal du bruge en config/sidekiq.rb fil som denne:
Sidekiq.configure_server do |config|
config.redis = { url: "redis://#{Rails.application.secrets.redis_host}:#{Rails.application.secrets.redis_port}/12", network_timeout: Rails.application.secrets.redis_timeout }
end
Sidekiq.configure_client do |config|
config.redis = { url: "redis://#{Rails.application.secrets.redis_host}:#{Rails.application.secrets.redis_port}/12", network_timeout: Rails.application.secrets.redis_timeout }
end
Du kan hente redis URL'en og porten inde i dit AWS Console ElastiCache Dashboard ved at klikke på kolonnen Nodes relateret til din klynge.
Du behøver kun en opskrift for at starte og stoppe sidekiq, medmindre du vil starte den manuelt ved at gå ind i din maskine via ssh (selvfølgelig ikke godt for produktion).
I dette tilfælde skal du tilføje en brugerdefineret opskrift til din OpsWorks-stak til Deploy-begivenheden. Denne opskrift vil være sådan her:
# Recipe used for a deploy event
Chef::Log.info("Restart Sidekiq...")
node[:deploy].each do |application, deploy|
deploy_to = node[:deploy][application][:deploy_to]
rails_env = node[:deploy][application][:rails_env]
execute "sidekiq stop" do
user "deploy"
cwd "#{deploy_to}/current/"
command "bundle exec sidekiqctl stop tmp/pids/sidekiq.pid"
environment "RAILS_ENV" => rails_env
only_if { "ps aux | grep [s]idekiq" }
end
bash "bundle" do
user "deploy"
cwd "#{deploy_to}/current/"
code <<-EOH
RAILS_ENV="#{rails_env}" bundle exec sidekiq --index 0 --pidfile tmp/pids/sidekiq.pid --environment "#{rails_env}" --logfile log/sidekiq.log --daemon
EOH
end
end
Håber det hjælper!