こちらの記事で SAM を使って Lambda 単体のアプリケーションを作成するのをやったので、次はこの Lambda 関数を EventBridge から定期的に呼び出すのをやってみたいと思います。
その前に、 EventBridge から定期的に実行する方法として新しい Schduler というのが追加されていたので、まずはそちらを試しました。
EventBridge による定期的な実行について
EventBridge (以前は CloudWatch Event )を久しぶりに見てみると、 Scheduler という機能が増えてます。どうも 2020 年にリリースされたようです。
- Amazon EventBridge で新しいスケジューラーの提供を開始
- [新機能] タイムゾーン指定でスケジュール起動できるAmazon EventBridge Schedulerがリリースされました | DevelopersIO
以前は、 EventBridge バスにルールを定義することで、定期的にイベントを実行する方法でした。が、このルールによる方法は、
- 対象となるイベントバスがデフォルトのイベントバスの必要がある
- 時間の指定が UTC
などの制約があります。以前使ったときは、最初の制約があって、いろんなスケジュールが同じイベントバスに混在するのでちょっとやりにくいなと思ってました。
あと、2つ目の時間の指定については、以前は UTC で指定して、実行例の表示も UTC だったように思ったんですが、今見てみたら、時間の指定は UTC だけど、確認はローカルタイムゾーンが選べるようになってました。
下記の記事でも触れてますね。
AWS EventBridgeでのワイルドカード活用法まとめ #AWS - Qiita
これだと、2つ目に関しては実行例で確認できるので、時間の設定間違いが少なくなりそうです。
両者の違いについては、上記の developer.io の記事などを見てもらえばより詳しくわかるかと思います。では、早速、 EventBridge Schduler を試してみます。
EventBridge Scheduler の試用
では、 SAMで作った Hello World を返す Lambda 関数を定期的に呼び出すスケジューラーを下記などを参考に作ってみます。
Amazon EventBridge スケジューラーをはじめて使用してみた
まずは、 aws のコンソールから、 EventBridge のスケジュールを選択して、
一覧画面の右上にある『スケジュールを作成』をクリックして作成開始です。
スケジュールの設定
最初に表示された画面で、スケジュール名と説明を入力します。
『スケジュールグループ』というのを設定して、スケジュールをグループ分けすることもできるようです(今回はデフォルトのグループとしています)。
次に、画面の下部に移動して、スケジュールを入力します。
スケジュールの種類として『1回限りのスケジュール』と『定期的なスケジュール』があり、さらに『定期的なスケジュール』は、 cron ベースのスケジュールと rate ベースのスケジュールに分かれています。
今回は cron ベースの『定期的なスケジュール』を作成することにします。まず、タイムゾーンを選択します。
テキストボックスに入力すると、絞り込み検索してくれますので、簡単に選べますね。次に、実行したい時刻を、 cron 式で入力します。
この例だと、1分ごとに実行されることを想定しています。cron の書き方は、下記などを参考にしてください。
cron 式と rate 式を使用して Amazon EventBridge でルールをスケジュールする - Amazon EventBridge
次に、『フレックスタイムウィンドウ』を設定します。
実行時にどれだけの幅を持たせるかを指定する時間枠になります。今回の例だと、あまり意味がないので、『オフ』としました。
最後に、このスケジュールの時間枠を指定します。
スケジュールを停止し忘れたときに、Lambda 関数を呼び出すのが無限に続くといやなので、停止時刻を日付付で指定しておきます。
ここまでできたら、『次へ』ボタンを押します。
呼び出すリソースを指定
次はスケジューラーが呼び出すリソース(ターゲット)を指定します。
今回は、 Lambda を選びます。
Lambda を選択すると、関数をドロップダウンリストから選択できます。また、新規作成もできるようですし、バージョンやエイリアスを指定することもできます。また、ペイロードを指定すれば、呼び出し引数を渡すこともできますね。
その他のオプション
スケジューラーが最後の呼び出しを行った際に、自動的に削除するかどうかも選択できます。
『DELETE』を選択すると、最後の呼び出し後に削除されます。今回は『DELETE』を選んでみました。
スケジューラーの実行に失敗した場合の再試行とデッドレターキューを設定することもできます。
今回は、1分ごとに呼び出すので、再試行は無効にして、デッドレターキューもなしとしました。
最後に、実行ロールを指定します。既存のロールがなければ、スケジュール用に新しいロールも作成してくれます(ロールとそれにアタッチするポリシーも作ります)。
設定に問題が無ければ、『スケジュールを作成』ボタンを押します。
こんな感じにスケジュールが作成されていれば、 OK です。
スケジュールによる Lambda の実行
スケジュールが作成されると、早速、 Lambda の呼び出しが始まりました。Lambda の該当関数を開いて、『モニタリング』を見ると、
こんな感じに呼び出されたのがわかります。
今回の場合は、終了日時を指定していたので、呼び出しが終わったら、スケジュールも消えていました。
ただし、ロールを新規作成していた場合、ロール(およびポリシー)は残ったままになっているのでその点はご注意ください。
まとめ
EventBridge Scheduler 使ってみたところ、以前からあるイベントバスでルールを設定するよりも使いやすい印象を受けました。すでに動いているルールも、順次 Scheduler に切り替えていこうかな。