Input transfomerで、EventBridgeからECSタスクに環境変数を動的に渡す方法
今回作成したかった構成
S3へのオブジェクト作成イベントをトリガーにEventBridge経由でECS(Fargate)タスクを起動するというもの。
記事の趣旨
この記事では、S3のイベントから取得した値を環境変数としてECSにどうやって渡すのかを主に解説していきたいと思う。
terraformやCDKなどを使って上記の設定をする記事は少し見かけたが、コンソール画面から設定する方法についてあまり記事がなかったのでここにまとめる。
やりかた
EventBridgeのターゲット指定から、入力トランスフォーマー(Input transfomer)を使用することでS3イベントから動的にECSに環境変数として渡すことができる。以降で手順を説明する。
1. EventBridgeのターゲット指定
EventBridgeでは、コンソールからだと以下のようにECSタスクを起動するように設定する画面がある。
ここでさらに下にスクロールすると、「追加設定」があり、「ターゲット入力を設定」のデフォルト値が一致したイベントになっているところを「入力トランスフォーマー」に変更する。
そして「入力トランスフォーマーを設定」から以下のような設定モーダルが開くのでここから設定を行う
2. 入力パス、テンプレート、出力
入力トランスフォーマー(以降Input transfomer)は、3段階に分けて変換が行われる。手順は以下の通り。
- s3イベント取得
- 入力パスでイベントから必要のものを抽出して変数に格納
- 変数を使って実際に送信したいjsonのテンプレート作成
- 実行時にテンプレート通りに出力を作成
S3からのイベントは以下のような形でコンソール画面から確認できるので、それを見つつ入力パスは作成すれば良い。
入力パス例
{"bucket_name":"$.detail.bucket.name","object_key":"$.detail.object.key"}
テンプレート例
入力パスでキー名に指定したものが変数として以下で使える。
{
"containerOverrides": [
{
"name": "コンテナ名",
"environment": [
{
"name": "BUCKET_NAME",
"value": <bucket_name>
},
{
"name": "OBJECT_KEY",
"value": <object_key>
}
]
}
]
}
3. Input transfomerのテンプレートで詰まったところ
テンプレートの設定方法の記事が少なく正しい記述の仕方がなかなか見つからなかった。
最初は、RunTaskAPIのjsonを丸ごと以下のように記載していてうまくいかなかった。
{
"count": 1,
"cluster": "xxxx",
"taskDefinition": "xxx",
"launchType": "FARGATE",
"networkConfiguration": {
"awsvpcConfiguration": {
"subnets": ["subnet-xxxx"]
}
},
"overrides": {
"containerOverrides": [
{
"name": "container-name",
"environment": [
{
"name": "BUCKET_NAME",
"value": <bucket_name>
},
{
"name": "OBJECT_KEY",
"value": <object_key>
}
]
}
]
}
}
これをcontainerOverridesだけにしたところ上手く動くようになった。(どういったルールに則って動いているのかはよくわからない)
以下記事のCDKの記載だとcontainerOverridesから記載をし始めていることに気がついてもしかしたらと思って試したら動くようになった。
{
"containerOverrides": [
{
"name": "container-name",
"environment": [
{
"name": "BUCKET_NAME",
"value": <bucket_name>
},
{
"name": "OBJECT_KEY",
"value": <object_key>
}
]
}
]
}
以上。
Discussion