1. ホーム
  2. amazon-web-services

[解決済み] AWS Elastic Beanstalk, cronjobの実行

2023-02-05 18:14:40

質問

毎分実行する cronjob/task を設定する方法があれば知りたいです。現在、私のインスタンスのいずれかがこのタスクを実行することができるはずです。

これは、私が設定ファイルで行おうとしたことですが、成功しませんでした。

container_commands:
  01cronjobs:
    command: echo "*/1 * * * * root php /etc/httpd/myscript.php"

これが正しい方法なのかどうか、よくわからないのですが

何かいい方法はありませんか?

どのように解決するのですか?

Elastic Beanstalkにcronジョブを追加する方法です。

アプリケーションのルートに.ebextensionsというフォルダがなければ作成します。 次に、.ebextensionsフォルダの中に設定ファイルを作成します。 ここでは説明のためにexample.configを使用します。 そして、example.configに以下の内容を追加します。

container_commands:
  01_some_cron_job:
    command: "cat .ebextensions/some_cron_job.txt > /etc/cron.d/some_cron_job && chmod 644 /etc/cron.d/some_cron_job"
    leader_only: true

これはElastic Beanstalk用のYAML設定ファイルです。 これをテキストエディタにコピーするときは、テキストエディタがタブの代わりにスペースを使用していることを確認してください。 さもないと、これをEBにプッシュしたときにYAMLエラーが発生します。

つまり、これは01_some_cron_jobというコマンドを作成するということです。 コマンドはアルファベット順に実行されるので、01は最初のコマンドとして実行されることを確認します。

このコマンドは、some_cron_job.txtというファイルの内容を取得し、/etc/cron.dのsome_cron_jobというファイルに追加します。

コマンドは次に、/etc/cron.d/some_cron_jobファイルのパーミッションを変更します。

leader_onlyキーは、コマンドが、リーダーとみなされるec2インスタンス上でのみ実行されることを保証します。 実行中のすべてのec2インスタンスで実行されるのではなく、です。

次に、.ebextensionsフォルダの中にsome_cron_job.txtというファイルを作成します。 このファイルにあなたのcronジョブを配置します。

ですから、例えば

# The newline at the end of this file is extremely important.  Cron won't run without it.
* * * * * root /usr/bin/php some-php-script-here > /dev/null

つまり、このcronジョブはrootユーザで毎日毎時毎分に実行され、出力を/dev/nullに破棄します。 /usr/bin/phpはphpのパスです。 そして、some-php-script-hereをあなたのphpファイルへのパスに置き換えてください。 これは明らかに、あなたのcronジョブがPHPファイルを実行する必要があることを想定しています。

また、コメントにあるように、some_cron_job.txtファイルの末尾に改行があることを確認してください。 そうでなければ、クーロンは実行されません。

更新しました。 Elastic Beanstalkがインスタンスをスケールアップするとき、このソリューションには問題があります。 例えば、1つのインスタンスでcronジョブを実行しているとします。 トラフィックが増加したため、Elastic Beanstalkは2つのインスタンスにスケールアップしました。 leader_onlyは、2つのインスタンス間で1つのcronジョブを実行するようにします。 トラフィックが減少し、Elastic Beanstalkは1つのインスタンスにスケールダウンします。 しかし、Elastic Beanstalkは2番目のインスタンスを終了させるのではなく、リーダーであった1番目のインスタンスを終了させます。 このとき、Cronジョブは終了された最初のインスタンスでのみ実行されていたため、実行されていません。 下のコメントを見てください。

アップデート2です。 以下のコメントから、これを明確にしただけです。 AWSは自動インスタンス終了に対する保護機能を備えています。リーダーインスタンスでこれを有効にすれば、問題ありません。- Nicolás Arévalo Oct 28 '16 at 9:23