【AWS】EventBridgeでLambda関数を一定時間ごとに実行してみる

AWS

1.Lambdaの定期実行について

Lambdaの呼び出しタイミングについては、
・同期(API Gateway、Cognitoなど)
・非同期(S3、CloudWatch、SESなど)
・ストリームベース(DynamoDBなど)

上記の3種類があります。


多くは非同期での呼び出しとなるのですが、今回は、「Amazon EventBridge」を利用したLambdaの非同期実行の関数を作成してみようと思います。

Amazon EventBridgeとは、AWSが提供している、『イベント』を通じて様々なアプリケーション同士を簡単に接続できるようにするサービスです。
このサービスを利用し、一定時間ごとに処理を実行するという、シンプルな関数の作成を行っていきます。

一定時間といっても、「毎時XX分」「毎日XX時」といった決まった時刻の実行や、「XX分ごと」「XX時間ごと」といった周期的な実行など様々なパターンが考えられますが、今回はサンプルとして、1分ごとに動作する関数を作成してみます。
(※なお、今回はIAMへのLambda関連のポリシー付加は済んでいる前提とします)

2.EventBridgeでのスケジュール作成

① ルールの作成

↓↓↓        

コンソール画面の検索窓で”EventBridge”と入力すると、「Amazon EventBridge」が表示されます。
クリックすると、EventBridgeの画面に遷移しますので、まずは定期実行に関するルールを設定します。
ここでは「ルールを作成」をクリックしましょう。

次に、ルールの詳細を定義していきます。
名前は任意の名称で構いませんので、今回は「testScheduleRule」と入力します。
そして、ルールタイプについては、今回は単純な定期実行の関数作成となりますので、「スケジュール」を選択します。


なお、「スケジュール」を選択すると、「EventBridge Schedler」という機能にてスケジューリングを行う事が可能です。
ここでは「EventBridge Schedulerで続行」をクリックしましょう。
※従来のEventBridgeでのルール作成も可能ですが、タイムゾーンがUTCだけだったり、1回限りのスケジューリングが出来なかったりと制約も多いのでEventBridge Schedulerを利用した方が良いと思います。

EventBridge Schedulerでは、まずはスケジュールのパターンを設定していきます。
今回は定期実行の関数作成が目的なので、「定期的なスケジュール」を選択し、以下の形で各種項目を設定していきます。


・スケジュールの種類:rateベースのスケジュール
・rate式:1minutes(※1秒毎に実行される)
・フレックスタイムウィンドウ:オフ


ひと通り設定が終わりましたら、「次へ」をクリックしてください。

② ターゲットの選択

次に選ぶのは「ターゲット」です。
EventBridgeで設定したスケジュールで「何を」実行するのかを選ぶことになります。
今回は、一定時間毎にLambda関数を実行するのが目標なので、

「AWS Lambda」→「新しいLambda関数を作成」の順に選択しましょう。
※「新しいLambda関数を作成」をクリックすると、別ウィンドウが開き、Lambda関数が作成できます。

③ Lambda関数の作成

今回は簡単な定期実行関数の作成なので「一から作成」を選択します。
関数名は任意の名称を設定できますので、今回の例では「ScheduleLambda」と命名します。
ランタイムについては、今回の関数はPythonで作成しますので、「Python X.XX」を選択してください。

(Pythonはとりあえず最新バージョンで)

<※補足>
実行ロールについてですが、Lambda関数を実行しますので、実行権限を持つロールを割り当てる必要があります。
今回は、予め「role-lambda-exec」というロールを別途作成していたので、それを割り当てる事にしています。

(Lambdaの実行権限を持つロールであれば、何でもいいです)

ひと通り設定が終わりましたら、「関数の作成」をクリックしてください。

ここでは、Lambda関数をPythonで実装していきます。
今回は定期実行を確認することだけが目的なので、特に実装は変更しません。

※赤枠内のデフォルトのコードをそのまま使用します。
もし定期実行でCloudwatchに何かログ表示させたい場合は、任意のコードを実装いただいてもOKです。

ひとまず、Lambda関数の作成はこれで終わりです。
先ほどまで操作していた「EventBridge」の画面に戻ってください。

④ 作成したLambda関数のスケジュール紐づけ

「ターゲットの選択」画面に戻りましたら、「Invoke」欄にて、呼び出すLambda関数を選びます。
ブラウザを更新すると、先ほど作成した「ScheduleLambda」が選択可能となります。
プルダウンから選んで、「次へ」をクリックしてください。

⑤ 設定の変更

次に「設定」のオプションを入力します。
ひとまず上記画面の通りで大丈夫ですが、「スケジュールを有効化」だけはONにしてください。これがOFFのままだと、動作確認ができませんので。
「スケジュール完了後のアクション」「再試行ポリシー」「アクセス許可」は、作成するイベントの性質によって、適宜変更してください。

(今回はお試しなので、上記画面の通りの設定にします)

各種設定の入力が終わりましたら、「次へ」をクリックしましょう。

⑥ スケジュールの作成、及び確認

「次へ」をクリックすると、確認画面に移動します。
入力したスケジュール名(testScheduleRule)、rate式(今回は1分毎の繰り返し)などが、入力した通りになっているか確認しましょう。

問題なければ、下にスクロールし、「スケジュールを作成」をクリックしてください。

これでスケジュールが作成され、上記画面が表示されます。

「EventBridge」の一覧画面にも、作成したスケジュールが表示されています。
ターゲットに「ScheduleLambda」の関数が設定されていることも確認できます。

3.作成したスケジュールの動作確認

① CloudWatchでの確認

では、動作確認をしてみましょう。
「CloudWatch」の画面に移動し、ロググループを確認してみて下さい。
先ほどのEventBridgeでのスケジュール作成の過程で同時に作成したLambda関数である「ScheduleLambda」のログが出力されていることが確認できます。

先ほど、スケジュール作成の際に、「スケジュールを有効化」をONにしましたよね。
よって、作成と同時にスケジュールが有効となり、1分毎のScheduleLambda実行が既に行われていることになります。

見ての通り、Lambda関数が1分毎に起動されていることが確認できますね。
因みに、Lambda関数(Pythonのコード)自体はデフォルトのままとしたので、特に何も表示されません。START~ENDのログが延々と表示されるだけです。
まぁ、今回は定期実行を試してみるのが目的でしたので、これでOKです。

実際に定期実行を運用する際は、Lambda関数を目的に合わせて作り込んだ上で実行してみて下さい。

② スケジュールの無効化⇔有効化

なお、今回作成した定期実行のスケジュールは、放っておくと延々と1分毎に起動してしまいます。
なので、動作確認ができましたら、ストップしてください。

EventBridgeにて対象のスケジュールを選択し、右上にある「無効化」をクリックすれば、スケジュールはストップします。
(※「無効化」→「有効化」に表示が変わります)
因みに、再開したい場合は、「有効化」をクリックすれば、再スタートします。

まとめ

今回は、EventBridgeという機能を用いて、Lambda関数を一定間隔で定期的に実行する仕組みを作成してみました。
ここで作ってみたスケジュールは非常にシンプルなものであり、実際は様々な処理や条件も追加してひとつのシステムとして構築することになると思います。

EventBridgeによるスケジューリングの方法についても、今回実施した方法以外にも様々な形で作ることが可能なので、今回作成したやり方をベースとして、色んなパターンでのシステムを構築してみて下さい。
(今回はここまで)

お読みいただき、有難うございました!

コメント

タイトルとURLをコピーしました