[解決済み] AWS Elastic Beanstalk, cronjobの実行
質問
毎分実行する 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
関連
-
[解決済み】S3 Bucket アクションがどのリソースにも適用されない
-
[解決済み] Amazon SQSを複数のコンシューマで使用する
-
[解決済み] s3 - HeadObject 操作を呼び出すときに、エラーが発生しました (403)。Forbidden
-
[解決済み] AWS-CLI: autoscalinggroupsをリストダウンする方法
-
[解決済み] AWS Lambda Functionに一時ファイルを保存することはできますか?
-
[解決済み] 新しいIAM管理者ユーザーに "この操作を実行する権限がありません "と表示される
-
[解決済み] s3バケットから複数ファイルをコピーする
-
[解決済み] CIDRアドレスがVPCのCIDRアドレスに含まれない
-
[解決済み] 毎日午前2時30分にcronジョブを実行する
-
[解決済み】Amazon EC2とAWS Elastic Beanstalkの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] CloudFormation Stack Errors with REST API Doesn't Contain Any Methods
-
[解決済み] エラー: networkMode 'awsvpc' が指定された場合、ネットワーク構成を提供する必要があります。
-
[解決済み] タスク実行時にAWS ECSエラーが発生しました。クラスタにコンテナインスタンスが見つかりませんでした。
-
[解決済み] SQSとRabbitMQの比較
-
[解決済み] AWS CloudFrontとGlobal Accelerator for Dynamic Contentsの比較
-
[解決済み] Terraform AWS Provider の有効なクレデンシャルソースが見つかりません。
-
[解決済み] kubectlエラー EKSクラスタにアクセスする際、サーバーにログインする必要がある(Unauthorized)。
-
[解決済み] CIDRアドレスがVPCのCIDRアドレスに含まれない
-
[解決済み] Amazon SNSとAmazon SQSの違いは何ですか?
-
[解決済み] AWS EFS vs EBS vs S3(違い&いつ使う?)【終了しました。