Как запустить Redis на Amazon OpsWorks для приложения Rails?

Я пытаюсь настроить экземпляр/уровень Redis в среде Amazon OpsWorks для целей кэширования и Sidekiq, но не могу заставить приложение Rails взаимодействовать с Redis.

Нужен ли мне рецепт шеф-повара, несмотря ни на что? Я пытался создать Redis на отдельном слое, добавил экземпляр на этот слой, но не могу найти способ заставить Rails и Redis общаться друг с другом.

Любой совет, как это сделать?

Спасибо


person user984621    schedule 02.03.2016    source источник
comment
Пожалуйста, отметьте мой ответ как правильный. Спасибо   -  person Diego D    schedule 17.02.2017


Ответы (1)


Возможный способ сделать это — создать «кластер ElastiCache» на AWS и указать Rails использовать Это.

У меня есть приложение rails, работающее со стеком OpsWorks, и я использую Redis по двум разным причинам: использую Sidekiq для отложенного задания и использую хранилище кеша.

Очень важно установить правильную группу безопасности для вашего кластера Redis ElastiCache, эта группа безопасности должна быть доступна для вашего стека OpsWorks.

Сначала создайте кластер Redis ElastiCache. Затем перейдите в консоль AWS, нажмите «EC2», затем нажмите «Группа безопасности» (в разделе «СЕТЬ И БЕЗОПАСНОСТЬ»). Найдите группу безопасности, используя идентификатор группы безопасности, связанный с вашим кластером elasticache.

Теперь установите правило для входящих подключений, где источником является группа безопасности opsworks, которая у вас есть внутри opsworks.

В вашей группе безопасности EC2 ->: введите здесь описание изображения

В OpsWorks -> Layers -> Безопасность сервера приложений Rails: введите здесь описание изображения

В конце в вашем проекте Rails отредактируйте файл config/production.rb (при условии, что вы работаете над производственной средой) и добавьте строку, подобную этой, чтобы установить хранилище кеша:

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

Затем, чтобы заставить Sidekiq использовать Redis, вам понадобится файл config/sidekiq.rb, подобный этому:

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

Вы можете получить URL-адрес Redis и порт на панели мониторинга ElastiCache консоли AWS, щелкнув столбец «Узлы», относящийся к вашему кластеру.

Вам нужен рецепт только для запуска и остановки sidekiq, если только вы не хотите запускать его вручную внутри вашей машины через ssh (конечно, не очень хорошо для производства).

В этом случае вы должны добавить пользовательский рецепт в свой стек OpsWorks для события Deploy. Этот рецепт будет примерно таким:

# 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

Надеюсь, поможет!

person Diego D    schedule 14.03.2016
comment
Спасибо @DiegoD. Является ли использование ElastiCache достаточно масштабируемым? - person user984621; 16.03.2016
comment
@ user984621 ElastiCache масштабируется как RDS. Я думаю, что это отличный выбор, но, конечно, это зависит от ваших потребностей. Пожалуйста, отметьте мой ответ как принятый, если вы считаете, что он вам каким-то образом помог. - person Diego D; 17.03.2016