Jak Automatycznie uruchomić opóźnione zadanie podczas wdrażania projektu rails na Amazon Elastic Beanstalk?

Hostuję projekt rails na Amazon Elastic Beanstalki próbuję skonfigurować polecenie container, aby automatycznie ponownie uruchomić mój delayed_job worker na serwerze po każdym wdrożeniu.

Próbowałem z tym:

container_commands:
  restartdelayedjob:
    command: "RAILS_ENV=production script/delayed_job --pid-dir=/home/ec2-user/pids start"
    cwd: /var/app/current

Ale wydaje się, że wersja popchnięta jest wdrażana po ponownym uruchomieniu workera, więc zadania nie zostały przetworzone przez worker.

Kiedy podłączam się do mojej instancji przez ssh, zabijam proces worker I restartuję nowy z folderu wdrożona wersja, wszystko działa dobrze.

Masz jakiś pomysł, jak sobie z tym poradzę?

Thanks

Author: Asteriskk, 2013-01-18

4 answers

Zgodnie z dokumentacją Amazona dla container_commands:

Uruchamiane są po skonfigurowaniu aplikacji i serwera www oraz wyodrębnieniu Pliku wersji aplikacji, ale przed wdrożeniem wersji aplikacji .

(moje)

Oznacza to, że w tym momencie /var/app/current, który ustawiasz jako cwd dla Twojego polecenia, nadal wskazuje na poprzednią wersję. Jednak domyślnie, z dokumentów ponownie, cwd:

Jest katalogiem rozpakowanej aplikacji.

Oznacza to, że jeśli chcesz uruchomić delayed_job z katalogu aplikacji, która właśnie została wyodrębniona (ale jeszcze nie została wdrożona), nie nadpisuj cwd i powinieneś uruchomić delayed_job dla aplikacji, która ma zostać wdrożona.

Ref: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-container_commands

Aktualizacja:

Skonfigurowałem to sam i stwierdziłem, że istnieją ograniczenia w robieniu tego za pomocą standardowego container_commands - zasadniczo delayed_job zostanie uruchomiony, gdy będzie nadal w katalogu /var/app/ondeck. Zazwyczaj jest to OK, ale miałem pewne problemy z niektórymi zadaniami, ponieważ ta ścieżka utknęła wokół niego spowodowałaby błędy, ponieważ aplikacja była teraz w /var/app/current.

Znalazłem nieudokumentowaną (więc uwaga!) podejście, że można dodać skrypty do uruchomienia po ponownym uruchomieniu serwera aplikacji (a nowe wdrożenie jest w /var/app/current).

Zasadniczo Elastic Beanstalk wykona skrypty w /opt/elasticbeanstalk/hooks/appdeploy/post po ponownym uruchomieniu serwera www. Oznacza to, że jeśli upuścisz skrypty powłoki do tego katalogu, zostaną one uruchomione.

Stworzyłem taki skrypt powłoki:

#!/usr/bin/env bash
. /opt/elasticbeanstalk/support/envvars
cd $EB_CONFIG_APP_CURRENT
su -c "RAILS_ENV=production script/delayed_job --pid-dir=$EB_CONFIG_APP_SUPPORT/pids restart" $EB_CONFIG_APP_USER

Załadowałem ten skrypt do wiadra S3 i upewniłem się, że jest "publiczny". Następnie możesz użyć skryptu options w swoim katalogu .ebextensions (np. 99delayed_job.config) aby wdrożyć ten skrypt jako część aplikacji deploy, biorąc pod uwagę, że katalog post może nie istnieć:

commands:
  create_post_dir:
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
    ignoreErrors: true
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/99_restart_delayed_job.sh":
    mode: "000755"
    owner: root
    group: root
    source: http://YOUR_BUCKET.s3.amazonaws.com/99_restart_delayed_job.sh

Po uruchomieniu powinieneś zobaczyć coś takiego w swoim /var/log/eb-tools.log:

2013-05-16 01:20:53,759 [INFO] (6467 MainThread) [directoryHooksExecutor.py-29] [root directoryHooksExecutor info] Executing directory: /opt/elasticbeanstalk/hooks/appdeploy/post/
2013-05-16 01:20:53,760 [INFO] (6467 MainThread) [directoryHooksExecutor.py-29] [root directoryHooksExecutor info] Executing script: /opt/elasticbeanstalk/hooks/appdeploy/post/99_restart_delayed_job.sh
2013-05-16 01:21:02,619 [INFO] (6467 MainThread) [directoryHooksExecutor.py-29] [root directoryHooksExecutor info] Output from script: delayed_job: trying to stop process with pid 6139...
delayed_job: process with pid 6139 successfully stopped.

2013-05-16 01:21:02,620 [INFO] (6467 MainThread) [directoryHooksExecutor.py-29] [root directoryHooksExecutor info] Script succeeded.

Jak już mówiłem, umieszczanie rzeczy w tym katalogu "post" jest nieudokumentowane - ale mam nadzieję, że w pewnym momencie Amazon dodał rzeczywiste wsparcie dla skryptów .options do uruchamiania poleceń po wdrożeniu, w takim przypadku można przenieść to do oficjalnie wspierane podejście.

 21
Author: Marcin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-16 01:40:48

On 64bit Amazon Linux 2014.09 v1.1.0 uruchomiony Ruby 2.1 (osobowa osobowa) , działa dzięki ten post .

Zauważ, że ten skrypt jest uruchamiany jako root, ale twoi pracownicy powinni być uruchamiani jako użytkownik webapp.

# Adds a post-deploy hook such that after a new version is deployed
# successfully, restarts the delayed_job workers.
#
# http://stackoverflow.com/questions/14401204/how-to-automatically-restart-delayed-job-when-deploying-a-rails-project-on-amazo
# http://www.dannemanne.com/posts/post-deployment_script_on_elastic_beanstalk_restart_delayed_job
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/50_restart_delayed_job.sh":
    mode: "000755"
    owner: root
    group: root
    encoding: plain
    content: |
      #!/usr/bin/env bash

      EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
      EB_APP_CURRENT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
      EB_APP_USER=$(/opt/elasticbeanstalk/bin/get-config container -k app_user)
      EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)
      EB_APP_PIDS_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_pid_dir)

      . $EB_SUPPORT_DIR/envvars
      . $EB_SCRIPT_DIR/use-app-ruby.sh

      cd $EB_APP_CURRENT_DIR

      # Switch to the webapp user.  Worker shouldn't be run as root.
      su -s /bin/bash -c "bundle exec bin/delayed_job --pid-dir=$EB_APP_PIDS_DIR restart" $EB_APP_USER
 5
Author: Jonathan Tran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-13 19:08:00

W przypadku, gdyby ktoś chciał opóźnić pracę w najnowszym ElasticBeanstalk (64bit Amazon Linux 2014.09 v1.0.9 z systemem Ruby 2.1 (Puma)): mam go do pracy przy użyciu poniższego kodu (dzięki damontorgerson). Te akta są w ruby.config in .folder ebextensions.

# Install git in order to be able to bundle gems from git
packages:
yum:
  git: []

files: 
  "/opt/elasticbeanstalk/hooks/appdeploy/post/50_restart_delayed_job":
    mode: "000777"
    owner: root
    group: root
    content: |
      EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
      EB_APP_STAGING_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir)
      EB_CONFIG_APP_CURRENT=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
      EB_CONFIG_APP_LOGS=$(/opt/elasticbeanstalk/bin/get-config container -k app_log_dir)
      EB_APP_USER=$(/opt/elasticbeanstalk/bin/get-config container -k app_user)
      EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)
      EB_CONFIG_APP_PIDS=$(/opt/elasticbeanstalk/bin/get-config container -k app_pid_dir)

      . $EB_SUPPORT_DIR/envvars
      . $EB_SCRIPT_DIR/use-app-ruby.sh

      cd $EB_CONFIG_APP_CURRENT

      . $EB_SUPPORT_DIR/envvars.d/sysenv

      bin/delayed_job --pid-dir=/var/tmp restart
 4
Author: Dhanush Balachandran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-28 13:29:36

Ja swoje tak mam z klejnotem" demony":

commands:
  create_post_dir:
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
    ignoreErrors: true
  webapp_pids:
    command: "mkdir /home/webapp/pids"
    ignoreErrors: true
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/99_restart_delayed_job.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      . /opt/elasticbeanstalk/support/envvars
      chown webapp:webapp /home/webapp/pids
      su -l -c "$EB_CONFIG_APP_CURRENT/bin/delayed_job --pid-dir=/home/webapp/pids restart" $EB_CONFIG_APP_USER
      echo "worker starting" >> /var/log/directory-hooks-executor.log
 1
Author: laertiades,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-08 20:49:08