2022/07/4

AWSのサービスを使ってCronによるスケジューラーを作成しよう

 
  

AWSのサービスである「ジョブスケジューラー」とは

本記事はAWSのマネージドサービスを使ってCronによるジョブスケジューラーを実装します。ジョブスケジューラーとは、一定の時間間隔や特定の日次に実行されるジョブのことです。 例えば、 ・毎週火曜日の午前8時に特定のメッセージをSlackに送信する ・60秒毎に特定のサーバーが動いているか、ヘルスチェックをする ・毎年12月21日の午前0時に誕生日のお祝いメールを送信する などです。 上記のように、特定の日時または一定の間隔を指定することがスケジューラーには求められます。本記事では、スケジュールを指定するCronの書き方を学んだ上で、それをAWSのサービスでどのように実行するかを学んでいきましょう。

Cronとは

読み方はクーロンです。Cronとは元々Linuxのサーバーにおいてスケジュールを指定することができる機能です。特定の時間や頻度でとあるアプリケーションを実行したい、という際に設定を行う機能です。 Linuxで
crontab -e
と実行するとCron式の確認と編集を行うことができます(下記はRaspbianをインストールしたRaspberry Piにて実行した例です。)
pi@raspberrypi:~ $ crontab -e
# Edit this file to introduce tasks to be run by cron.
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
~中略~
20 * * * * /home/ichiro.sato/application/hogehoge.jar
10 17 * * * /home/ichiro.sato/application/helloworld.jar
詳しい式の読み方は後で解説します。ここではhogehoge.jarとhelloworld.jarが定期的に実行されるような設定がなされている、というのを理解してください。

Cron式の書き方

このセクションではCron式の書き方に関して学習していきます。既にCron式の書き方をご存知の方は読み飛ばしていただいても構いません。 AWSで指定できるCron式の基本系は* * * * * *と「*」が6つ並んだ状態で、それぞれが半角スペース空いています。この「*」を必要に応じて数字に置き換えて任意のスケジュールを指定します。 順番は「分→時間→日→月→曜日→年」です。 1番目の*:分を0〜59の整数で指定します。 2番目の*:時間を0〜23の整数で指定します。 3番目の*:日を1〜31の整数で指定します。 4番目の*:月を1〜12の整数で指定します。 5番目の*:曜日を1〜7の整数で指定します(1が日曜日) 6番目の*:年を1970〜2199の整数で指定します。

Cron式のサンプル

前のセクションでCron式の書き方を学んだかと思います。このセクションでは具体例を見てみましょう。 基本は指定したいものだけを指定する、です。つまり、指定したくないパラメーターは「*」のままでいいということです。また、一定の間隔を指定したい場合は/を用いて表記します(25分毎の場合は/25と記載します) 【例1】毎月の25日の18時30分に実行するジョブ
30 18 25 * * *
【例2】毎週月曜日の10時15分に実行するジョブ
15 10 * * 1 *
【例3】2021年12月21日の0時0分に実行するジョブ
0 0 21 12 * 2021
【例4】毎時5分に実行するジョブ
5 * * * ? *
【例5】5分毎に実行するジョブ
*/5 * * * ? *
【例6】2時間毎に実行するジョブ
0 */2 * * ? *

AWSにおけるCron式の書き方の注意点

このセクションではAWS特有のCron式の書き方の注意点を説明します。基本的にはCronとは一般的な規格であるため、様々なアプリケーションやサービスでCronが使われています。しかし書き方・仕様には若干差異があります。 勘の良い方であれば既に気付いているかと思いますが、一番最初に説明したcrontab -eと、前セクションで説明したCronの記載方法は異なります。
20 * * * * /home/ichiro.sato/application/hogehoge.jar
というようにRasbianでは「*」が5つ分ですが、前セクションで話した記載方法では「*」が6つです。本記事で説明しているCronの書き方は、あくまでAWSのサービスで指定できる記載方法であると認識してください。 AWSであってもEC2でLinuxインスタンスを立てて、そのインスタンス内でCronを記載する場合は、OSの記載の仕方に合わせてください。

ハンズオン:Cloud Watch EventとLambdaを連携

このセクションでは、AWSのマネージドサービスであるCloud Watch EventとLambdaを連携されて、Cron式を用いたスケジュールドジョブを実装します。 Cloud Watch EventではCron式によるスケジューラーを設定することができ、そのスケジューラーをトリガーにLambdaを起動させることができます。

Lambda関数の作成

以下の手順で、Cron式で実行するための簡易な関数を作成します。 1.AWSコンソールにログインし、AWS Lambdaを開きます。 2.「関数の作成」ボタンを押下します。 3.「設計図の使用」を選択し、設計図の中から「hello-world」のテンプレートを選択後、右下にある「設定」ボタンを押下します。 4.「関数名」に任意の関数名を入力します。実行ロールは「基本的な Lambda アクセス権限で新しいロールを作成」を選択します。その後、右下の「関数の作成」を押下します。 5.作成されたら。「関数コード」にてソースコードを修正します。以下のコードをコピー&ペーストし、「デプロイ」を押下します。
'use strict';

exports.handler = (event, context, callback) => {
    console.log('※スケジュールイベントを受信!');
    callback(null, '終了');
};
以上でLambda関数の作成は完了です。

Cloud Watch Eventの設定

以下の手順で、Cron式によるスケジュールを設定します。 1.AWSコンソールにログインし、Could Watch Eventを開きます。 2.イベント>ルール を選択します。 3.イベントソースの「スケジュール」をチェックします。その後、「Cron式」をチェックします。その後テキストボックスに、0/3 * * * ? *を入力します。 4.ターゲットにて先程作成したLambda関数を選択します。 5.画面右下の「設定の詳細」を押下します。 6.名前・説明に任意の文字列を入力した後、「ルールの作成」を押下します。 以上でスケジュールの設定は完了です。この例では3分毎にLambda関数を実行する、というジョブが完成しました。 実行された結果は、CloudWatch Logs→Log groups から確認することができます。3分毎にログが出力されているか確認してみてください。

CloudWatchイベントとLambdaを上手に活用しよう

AWSでも定番のマネージドサービスであるCloud Watch EventとLambdaを組み合わせることで簡単にサーバーレスのスケジュールドジョブを構築することができます。 定期的にチャットツールにメッセージを送信する機能であったり、EC2インスタンスの起動停止(料金節約のために夜間停止するなど)するなどといった機能を簡単に実現できます。 Cron式はCloud Watch Event以外でも世の中で広く使われています。活用したことない方は是非、この機会に書き方を覚えましょう。]]>

ITエンジニアへのキャリアチェンジならキャリアチェンジアカデミー

この記事の監修者・著者

株式会社オープンアップITエンジニア
株式会社オープンアップITエンジニア
未経験からITエンジニアへのキャリアチェンジを支援するサイト「キャリアチェンジアカデミー」を運営。これまで4500人以上のITエンジニアを未経験から育成・排出してきました。
・AWS、salesforce、LPICの合計認定資格取得件数:2100以上(2023年6月時点)
・AWS Japan Certification Award 2020 ライジングスター of the Year 受賞

おすすめの動画

  • 【未経験からIT業界へ転職するなら】相談窓口とスキルの獲得はここで解決!IT転職が一気に有利に!【キャリアチェンジアカデミー】

  • 【費用一切不要】未経験からIT業界へ転職するならまずはここへ相談!【キャリアチェンジアカデミー】

  • 【何のエンジニアになれるのか?】未経験からITエンジニアを目指すとこんな道がある【キャリアチェンジアカデミー】