やりたいこと
CloudWatchEvents(CWE)を使ってAWS BatchにJobを投入する。
JobコマンドではCWE動いた時の時刻と任意の定数を使いたい。
そのために必要なものを設定していく。
Jobコマンドでやりたいことのイメージ
$ exec --time {時刻} --target {定数}
Jobコマンドで変数や定数を扱うために
CWE動いた時刻や任意の定数をコマンドで扱うために、CWEから値を受け取って扱う。
Jobでは受け取った値が特定のJSON形式でないと扱うことができず、コマンドで扱う際は特殊な書き方をする必要がある。
Jobが扱える形式
Jobコマンドから扱えるのはJSON形式のParameters配下のプロパティのみ。
この形式を考慮してCWEのインプットの設定をする必要がある
{
"Parameters":{
"time": "2015-11-11T21:29:54Z",
"target": "01234"
}
}
Parameters配下のプロパティでもオブジェクト形式だと扱えない。
そのためプログラムでオブジェクトや配列を扱いたい場合は、jsonを受け取ってプログラム内でパースする。
{
"Parameters":{
"time": "2015-11-11T21:29:54Z",
"targets": "{\"targets\":[\"01234\", \"56789\"]}"
}
}
Jobコマンドで受け取った値を呼び出すための設定をする
受け取った値はRef::パラメータ名
で呼び出すことができる。
ジョブ定義でコマンドの引数にパラメータが入るように設定しておく。
$ exec --time Ref::time --target Ref::target
CWEの情報をターゲットに渡すために
CWEはターゲットに対して情報を渡すことができる。
渡す情報は以下の四種類がある。
- 一致したイベント
- 時刻やアカウントIDなど、CWEがもつ変数
- 一致したイベントの一部
- 定数(JSON テキスト)
- 任意の定数
- インプットトランスフォーマー
- CWEがもつ変数と定数の両方を渡すことができる
今回は変数と定数の両方を渡すのでインプットトランスフォーマーを使う。
インプットトランスフォーマーを設定する
インプットトランスフォーマーはマッピングとテンプレートの二種類を設定することでターゲットに定数を変数を混ぜた値を渡せるが、設定が面倒。
マッピングではCWEの変数をテンプレートで扱うために、変数と対応する名前を設定する。
テンプレートでは実際にターゲットに渡す情報を設定する。
どちらもJSON形式で指定する。
マッピング
変数$.time
に対して、mytime
と言う名前をつけている。
{
"mytime":"$.time"
}
テンプレート
JSONの形式で定数を表現する。
<名前>
形式を使うことでマッピングで設定した変数を組み込むことができる。
変数を呼び出す際は<>を""で挟むと文字列として認識されてしまうため、""で挟んではいけない。
{
"Parameters":{
"time": <mytime>,
"target": "01234"
}
}
ターゲットに渡される値
<mytime>
の部分が実行時間に置き換わってターゲットに渡される
{
"Parameters":{
"time": "2015-11-11T21:29:54Z",
"target": "01234"
}
}
別のアプローチ
別のアプローチなら面倒なインプットトランスフォーマーは不要だった、、、
定数をジョブ定義設定する
ジョブ定義のコマンドを以下のようにしておけば、CWEで定数を扱わなくなる。
変数だけなら面倒なインプットトランスフォーマーじゃなくて良い。
$ exec --time Ref::time --target "01234"
変数をコマンドから取得する
コマンドで動き出した時刻を取得すれば、CWEで変数を扱わなくなる。
定数だけなら面倒なインプットトランスフォーマーじゃなくて良い。
$ exec --time `date --iso-8601="minutes"` --target Ref::target