Redis
 sql >> Base de données >  >> NoSQL >> Redis

Comment exécuter Redis sur Amazon OpsWorks pour une application Rails ?

Une façon possible de le faire est de créer un "cluster ElastiCache" sur AWS et de dire à Rails de l'utiliser.

J'ai mon application rails en cours d'exécution avec une pile OpsWorks et j'utilise redis pour deux raisons différentes :utiliser Sidekiq pour le travail retardé et utiliser le magasin de cache.

Il est très important de définir le bon groupe de sécurité pour votre cluster redis ElastiCache, ce groupe de sécurité doit être disponible pour votre pile OpsWorks.

Créez d'abord votre cluster Redis ElastiCache. Ensuite, allez dans votre console AWS, cliquez sur "EC2", puis cliquez sur "Groupe de sécurité" (sous RÉSEAU &SÉCURITÉ). Recherchez le groupe de sécurité à l'aide de l'ID de groupe de sécurité associé à votre cluster elasticache.

Définissez maintenant une règle entrante où la source est le groupe de sécurité opsworks que vous avez dans opsworks.

Dans votre EC2 -> Groupe de sécurité :

Dans OpsWorks -> Couches -> Rails App Server Security :

A la fin, dans votre projet Rails, éditez votre config/production.rb fichier (en supposant que vous travaillez pour l'environnement de production) et ajoutez une ligne comme celle-ci pour définir votre magasin de cache :

config.cache_store = :redis_store, "redis://#{Rails.application.secrets.redis_host}:#{Rails.application.secrets.redis_port}/0/cache", { expires_in: 90.minutes }

Ensuite, pour que Sidekiq utilise Redis, vous avez besoin d'un config/sidekiq.rb fichier comme celui-ci :

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

Vous pouvez récupérer l'URL et le port redis dans votre tableau de bord AWS Console ElastiCache, en cliquant sous la colonne Nœuds associée à votre cluster.

Vous n'avez besoin d'une recette que pour démarrer et arrêter sidekiq, à moins que vous ne vouliez le démarrer manuellement à l'intérieur de votre machine via ssh (bien sûr, ce n'est pas bon pour la production).

Dans ce cas, vous devez ajouter une recette personnalisée à votre pile OpsWorks, pour l'événement de déploiement. Cette recette ressemblera à ceci :

# 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

J'espère que cela vous aidera !