CloudWatch EventsからAWS BatchにJSONでParameterを渡す方法

Posted on 2020.02.15

表題のとおり、CloudWatch Events から Batch を呼びたい、Trigger ごとにパラメータを変えたい、そのためにジョブ定義を複数作るまでもない、みたいなときの小ネタです。

Lambda とかだと直感的に渡した JSON が起動する Function の event に渡ってくるんですが、Batch だとそんなにすんなりいかなくてちょっと困った記録です。

ちなみに AWS Batch とは 初めて触る AWS Batch を見ていただければ。クラメソさんのブログにはいつもお世話になってます

やりかた

Batch の準備

まずはジョブ定義とコンピューティング環境を作ります。 リファレンス

簡単のため、ただ echo するだけのジョブ定義を作ってみます。

コマンドに echo helloworld といれます。

echo_helloworld

ジョブ定義からジョブの送信して完了後ログを確認すると

helloworld

hello_world_log

となっていることが確認できます。とりあえず起動自体は OK ですね。

Parameter 使用するジョブ定義に変更

次にジョブ定義を Parameter 参照する形に変更します

パラメータに message : default の項目を追加しつつ、コマンドを echo Ref::message とします。Ref::XXX で起動時にパラメータを XXX で渡すと置換して実行してくれます

param

そのままジョブ定義からジョブの送信して完了後ログを確認すると

default

となっていることが確認できます。

CloudWatch Events からパラメータを渡して起動

本題です。

↑ で作ったジョブ定義に対して CloudWatch Events のルールを作ります。

ターゲットを Batchジョブのキュー を選択して、入力の設定から 定数(JSONテキスト) を選択します。そこに以下のように設定します

{"Parameters": {"message": "hello hello hello how low"}}

Parameters の中に渡す必要があります。Keyは大文字始まりでもOKです。

cloudwatch

これで Trigger を適切に設定して起動してあげると、完了後ログは以下のようになります。

hello hello hello how low

how_low

パラメータ無事うけとれました

まとめ

これで定時バッチなどで環境変数違いで複数ジョブ定義を作らなくても、パラメータで切り替えるようにできるようになりました。 この辺を CloudFormation のテンプレートにして運用していたりします(それも結構ハマったんですがまた別の話)