Linux インスタンスでの cron ジョブの実行 - AWS OpsWorks

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Linux インスタンスでの cron ジョブの実行

重要

この AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、 AWS re:Post または AWS Premium Support を通じて AWS Support チームにお問い合わせください。

Linux の cron ジョブは、指定したスケジュールで 1 つ以上のコマンドを実行するよう cron デーモンに指示します。たとえば、スタックで PHP の e コマースアプリケーションをサポートするとします。毎週指定した時刻にサーバーから販売レポートが送信されるように cron ジョブをセットアップできます。cron の詳細については、Wikipedia の「Cron」を参照してください。Linux ベースのコンピュータまたはインスタンスで直接クローンジョブを実行する方法の詳細については、Indiana University Knowledge Base Web サイトの「What are cron and crontab, and how do I use them?」を参照してください。

SSH に接続することで個別の Linux ベースのインスタンスで cron ジョブを手動でセットアップし crontab 項目を編集できますが、 AWS OpsWorks スタックの主なメリットは、インスタンスの全レイヤーを範囲としてタスクを実行できることです。次の手順は、PHP アプリケーションサーバー レイヤーのインスタンスで cron ジョブをセットアップする方法を示していますが、どのレイヤーでも同じ方法を使用できます。

レイヤーのインスタンスで cron ジョブをセットアップするには
  1. ジョブをセットアップする cron リソースを使用するレシピを含むクックブックを実装します。この例では、レシピ名を cronjob.rb としています。実装の詳細については後述します。クックブックとレシピの詳細については、「クックブックとレシピ」を参照してください。

  2. スタックにクックブックをインストールします。詳細については、「カスタムクックブックのインストール」を参照してください。

  3. 次のライフサイクルイベントに割り当てて、レイヤーのインスタンスで AWS OpsWorks スタックでレシピを自動的に実行させます。詳細については、「レシピを自動的に実行する」を参照してください。

    • セットアップ — このイベントcronjob.rbに割り当てると、 AWS OpsWorks スタックはすべての新しいインスタンスでレシピを実行します。

    • デプロイ — このイベントcronjob.rbに割り当てると、アプリケーションをレイヤーにデプロイまたは再デプロイするときに、すべてのオンラインインスタンスでレシピを実行するように AWS OpsWorks スタックに指示します。

    Execute Recipes スタックコマンドを使用して、オンラインインスタンスでレシピを手動で実行することもできます。詳細については、「スタックコマンドの実行」を参照してください。

次の cronjob.rb の例では、サーバーから販売データを収集して電子メールでレポートを送信する、ユーザーが実装した PHP アプリケーションを週 1 回実行する cron ジョブをセットアップします。cron リソースの使用方法のその他の例については、「cron」を参照してください。

cron "job_name" do hour "1" minute "10" weekday "6" command "cd /srv/www/myapp/current && php .lib/mailing.php" end

cron は、cron ジョブを表す Chef リソースです。 AWS OpsWorks スタックがインスタンスでレシピを実行すると、関連するプロバイダーがジョブの設定の詳細を処理します。

  • job_name は、cron ジョブのユーザー定義名 (weekly report など) です。

  • hour/minute/weekday では、コマンドをいつ実行するかを指定します。この例では、毎週土曜日の午前 1 時 10 分にコマンドを実行します。

  • command では、実行するコマンドを指定します。

    この例では 2 つのコマンドを実行します。まず /srv/www/myapp/current ディレクトリに移動します。2 番目のコマンドでは、販売データを収集してレポートを送信する、ユーザーが実装した mailing.php アプリケーションを実行します。

注記

デフォルトで、bundle コマンドでは cron ジョブを操作できません。これは、 AWS OpsWorks スタックが /usr/local/bin ディレクトリにバンドルをインストールするためです。bundle ジョブで cron を使用するには、cron ジョブに明示的にパス /usr/local/bin を追加する必要があります。また、$PATH 環境変数が cron ジョブで展開されない場合があるため、$PATH 変数の展開に依存することなく、明示的に必要なパス情報をジョブに追加することがベストプラクティスとなります。以下の例では、bundle ジョブで cron を使用する方法を 2 種類示しています。

cron "my first task" do path "/usr/local/bin" minute "*/10" command "cd /srv/www/myapp/current && bundle exec my_command" end
cron_env = {"PATH" => "/usr/local/bin"} cron "my second task" do environment cron_env minute "*/10" command "cd /srv/www/myapp/current && /usr/local/bin/bundle exec my_command" end

スタックに複数のアプリケーションサーバーがある場合、PHP アプリケーションサーバーレイヤーのライフサイクルイベントに cronjob.rb を割り当てるのは最適な方法とは言えません。たとえば、レイヤーのすべてのインスタンスでレシピが実行されるので、ユーザーには複数のレポートが送信されることになります。この場合、適切な方法は、カスタムレイヤーを使用して 1 つのサーバーだけがレポートを送信できるようにすることです。

レイヤーの 1 つのインスタンスでのみレシピを実行するには
  1. たとえば、PHPAdmin というカスタムレイヤーを作成し、Setup イベントと Deploy イベントに cronjob.rb を割り当てます。カスタムレイヤーでは、必ずしも多くのことを実行する必要はありません。この例では、PHPAdmin はインスタンスでカスタムレシピを 1 つ実行するだけです。

  2. PHP App Server インスタンスの 1 つを に割り当てます AdminLayer。インスタンスが複数のレイヤーに属している場合、 AWS OpsWorks スタックは各レイヤーの組み込みレシピとカスタムレシピを実行します。

PHP アプリケーションサーバーと PHPAdminレイヤーに属しているインスタンスは 1 つだけであるため、cronjob.rb はそのインスタンスでのみ実行され、ユーザーは 1 つだけレポートレポートを受け取ります。