15

私はAmazonElasticBeanstalkでRailsプロジェクトをホストしており、デプロイのたびにサーバーでdelayed_jobワーカーを自動的に再起動するようにcontainerコマンドを構成しようとしています。

私はこれで試しました:

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

しかし、プッシュされたバージョンはワーカーの再起動後にデプロイされたため、ワーカーによるジョブの処理に失敗したようです。

インスタンスにsshで接続し、ワーカープロセスを強制終了し、デプロイされたバージョンフォルダーから新しいプロセスを再起動すると、すべてが正常に機能します。

私がこれをどのように扱うことができるかについて何か考えがありますか?

ありがとう

4

4 に答える 4

22

Amazoncontainer_commandsのドキュメントによると:

これらは、アプリケーションと Web サーバーがセットアップされ、アプリケーション バージョンのファイルが抽出された後、アプリケーション バージョンがデプロイされる前に実行されます。

(私のものを強調)

これは、コマンド/var/app/currentとして設定している時点で、まだ以前のバージョンを指していることを意味します。cwdただし、デフォルトでは、再びドキュメントから、次のようになりcwdます。

解凍されたアプリケーションのディレクトリです。

delayed_jobこれは、抽出されたばかりの (まだデプロイされていない) アプリのディレクトリから実行する場合は、オーバーライドせずcwdに、デプロイしようとしているアプリのdelayed_jobを開始する必要があることを意味します。

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

アップデート:

私は今これを自分で設定しましたが、標準を介してそれを行うには制限があることがわかりましたcontainer_commands-基本的にdelayed_jobは、まだ/var/app/ondeckディレクトリにある間に開始されます。通常はこれで問題ありませんが、一部のジョブで問題が発生しました。これは、アプリが/var/app/current.

アプリサーバーが再起動された後に実行されるスクリプトを追加できるという、文書化されていない (警告!) アプローチを見つけました (そして、新しいデプロイは にあります/var/app/current)。

/opt/elasticbeanstalk/hooks/appdeploy/post基本的に、Elastic Beanstalk は、ウェブサーバーの再起動後にスクリプトを実行します。つまり、このディレクトリにシェル スクリプトをドロップすると、シェル スクリプトが実行されます。

以下のようなシェルスクリプトを作成しました。

#!/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

このスクリプトを S3 バケットにアップロードし、「パブリック」であることを確認しました。.ebextensions次に、ディレクトリ (例: )でオプション スクリプトを使用して、99delayed_job.configこのスクリプトをアプリのデプロイの一部としてデプロイできます。ただし、postディレクトリが存在しない可能性があることに注意してください。

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

展開すると、次のように表示されます/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.

私が言ったように、この「投稿」ディレクトリに何かを入れることは文書化されていません - しかし、うまくいけば、ある時点で、Amazon が.optionsデプロイ後にコマンドを実行するスクリプトに実際のサポートを追加することを願っています。

于 2013-04-29T09:58:59.520 に答える
6

Ruby 2.1 (Passenger Standalone) を実行している 64 ビット Amazon Linux 2014.09 v1.1.0で、この投稿のおかげで動作しました。

このスクリプトはルートとして実行されますが、ワーカーは 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
于 2015-02-13T19:08:00.427 に答える