0
1

More than 3 years have passed since last update.

CloudWatchEventsの変数と定数をAWS BatchのJobコマンドに渡したい

Posted at

やりたいこと

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
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1