Amazon EventBridgeを使ってAWS Batchを起動する

背景

少し前からAWS Batchを使ってDjangoのカスタムコマンドを実行する仕組みを実装していました。今回はAWS BatchをAmazon EventBridgeを使って実行してみようと思います。

一つ気になるところがありまして、AWS Batchで利用するコンテナイメージやジョブ定義ファイルはGitHub Actionsを用いてデプロイしています。(以前の記事参照

ジョブ定義ファイルを更新した場合、Amazon EventBridgeも更新する必要があるのかどうかを検証してみたいと思います。

Amazon EventBridgeの設定

まず、EventBridgeの設定を行います。

マネジメントコンソールからAmazon EventBridgeを選択し、左メニューにあるルールをクリックします。

イベントバスはdefaultを選択したままにしておきます。

ルールの一覧の右上にルールを作成というボタンがあるのでそれを押下します。

ルールの作成

ルールの作成画面に遷移します。

名前と説明は適当に入力します。名前は必須なので、必ず入力します。

パターンの定義では大きく2種類あって、イベントパターンとスケジュールがあります。

今回はCronのように特定の時間でAWS Batchを起動したいので、スケジュールを選択します。

スケジュールの設定

スケジュールをクリックすると、さらに下に設定項目が表示されます。
固定速度ごとCron式が選択できます。Cronのように設定したいので、Cron式を選択します。

試しに設定してみます。5分ごとに実行するようにしてみます。

1
0/5 * * * * *

一見あっていそうですが、この記述方法では設定できません…

なにがダメなのかというと、曜日の設定は、日が*の場合は、*ではなく、?となっています。曜日を指定する場合は、日を?にしないといけなかったりします。この辺りの設定についてはドキュメントを読んでみてください。

また、Cronの設定が正しいと、実行する日時が下に表示されます。
Cron式の設定

設定が正しいかどうかは実行日時が表示されるかどうかで判断することができます。時刻の表記はGMTではなくローカルタイムゾーンにしておいたほうがわかりやすいと思います。基本的には9時間を引いてCron式を設定することになります。

イベントバスの設定

イベントバスはAWSのデフォルトのイベントバスのままにします。

ターゲットの設定

次にターゲットの設定を行います。今回のターゲットはAWS Batchなので、ターゲットのところでバッチジョブのキューを選択します。

すると、ジョブキュージョブ定義,ジョブ名が必須の入力項目として現れます。

ジョブキュージョブ名はジョブキューのARNとジョブ名を入力すれば良いのですが、注意が必要なのはジョブ定義です。

ジョブ定義はジョブ定義の名前またはARNと書かれています。ジョブ定義のARNを参照すると、

1
arn:aws:batch:ap-northeast-1:xxxxxxxxxxxx:job-definition/jobname:1

のように最後にrevisionがついています。revisionまで指定してしまうと、GitHub Actionsでのデプロイでジョブ定義ファイルが更新されて新しいrevisionが作成された場合、EventBridgeから起動できなくなってしまいます。

では、どうすればいいのかというと、方法は2つあります。

  • ジョブ定義の名前で指定する
  • ARNで指定する場合は:revisionを書かない(jobnameまでにする)

この2つの方法で設定すると、GitHub Actionsでジョブ定義ファイルを更新しても、EventBridgeが最新のジョブ定義ファイルで実行してくれます。

ロールの設定

ロールは新しいロールを追加します。

再試行ポリシーとデッドレターキューの設定

この辺り、細かく設定できるので、うまく実行できなかった場合は通知を受け取ることもできると思いますが、一旦スキップします。

最後に作成ボタンを押下してルールを作成します。

バッチ実行確認

指定した時間にジョブが起動し、正しく実行されることを確認しました。

また、GitHub Actionsでデプロイし、ジョブ定義ファイルを更新した後も正しく実行されることを確認しました。

まとめ

Amazon EventBridgeを使ってAWS Batchを起動する方法を確認しました。

最初はGitHub Actionsでジョブ定義ファイルをデプロイした後に、Amazon EventBridgeの設定を修正する処理を追加しないといけないかなと思っていたのですが、最新のrevisionを指定できるようになっていてよかったです。