Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Como executar o Redis no Amazon OpsWorks para um aplicativo Rails?


Uma maneira possível de fazer isso é criar um "cluster ElastiCache" na AWS e dizer ao Rails para usá-lo.

Tenho meu aplicativo Rails em execução com uma pilha OpsWorks e uso o redis por dois motivos diferentes:uso o Sidekiq para trabalho atrasado e uso o armazenamento em cache.

É muito importante definir o grupo de segurança correto para seu cluster redis do ElastiCache, esse grupo de segurança deve estar disponível para sua pilha do OpsWorks.

Primeiro, crie seu cluster Redis ElastiCache. Em seguida, vá no console da AWS, clique em "EC2" e clique em "Security Group" (em NETWORK &SECURITY). Pesquise o grupo de segurança usando o ID do grupo de segurança associado ao cluster do elasticache.

Agora defina uma regra de entrada em que a origem seja o grupo de segurança opsworks que você tem dentro do opsworks.

No seu EC2 -> Grupo de Segurança:

Em OpsWorks -> Camadas -> Rails App Server Security:

Ao final, em seu projeto Rails, edite seu config/production.rb (supondo que você esteja trabalhando para env de produção) e adicione uma linha como esta para definir seu armazenamento de cache:
config.cache_store = :redis_store, "redis://#{Rails.application.secrets.redis_host}:#{Rails.application.secrets.redis_port}/0/cache", { expires_in: 90.minutes }

Então, para fazer o Sidekiq usar o Redis, você precisa de um config/sidekiq.rb arquivo assim:
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

Você pode recuperar o URL e a porta redis dentro do Painel ElastiCache do Console AWS, clicando na coluna Nós relacionada ao seu cluster.

Você precisa de uma receita apenas para iniciar e parar o sidekiq, a menos que queira iniciá-lo manualmente entrando em sua máquina via ssh (claro que não é bom para produção).

Nesse caso, você deve adicionar uma receita personalizada à sua pilha do OpsWorks, para o evento Deploy. Esta receita será algo assim:
# 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

Espero que ajude!