Wano Group Advent Calendar 2021の記事です。
AWS Step Functions から AWS Batchに動的な命令を与えたい時、よくやるパターンのTIPSを記載します。
AWS Batchに命令を与えるには、
- Parameters
- 環境変数
なりに命令を突っ込んで使う必要があります。
ここに命令としてJSONを使いたい時があるのですが、オブジェクトのままでなくシリアライズして渡す必要があります。
例えば、こういうJSONを命令として与えたい時どうするでしょうか。
{
"call_type" : "create_image",
"data" : {
"bucket" : "xxxx",
"key" : "xxxx"
}
}
問題: States.JsonToString内で動的構築
ASLには States.JsonToString
オペレータがあるのですが、これをAWS Batchの命令でそのまま使うには若干問題があります。
...
"batch:CreateAndSaveImages": {
"Type": "Task",
"Next" : "End"
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobName": "xxxxxxxx",
"JobDefinition": "xxxxx",
"JobQueue": "xxxxx",
"ContainerOverrides": {
"ResourceRequirements": [
{
"Type": "VCPU",
"Value": "1"
},
{
"Type": "MEMORY",
"Value": "2048"
}
],
"Environment": [
{
"Name": "ACTIVITY_TASK_TOKEN",
"Value.$": "$$.Task.Token"
},
{
"Name": "BATCH_INPUT_JSON",
"Value.$": "States.JsonToString({ \"call_type\" : \"create_image\" , \"data\" : {\"bucket\" : "$.bucket", \"key\" : \"$.obj\"} })"
}
]
}
}
},
...
上記では、BATCH_INPUT_JSON環境変数に直接オブジェクトを動的構築/シリアライズしようとしているのですが、2021年12月現在、こういう複雑なテンプレート構築はStates.JsonToString
ではできないようです。
解決策: いったんPass Stateで任意の場所に格納する
解決策としては、Pass Stateをデータ加工専用のプロセスとして用い、ResultPath
などで好きな場所に変数を格納します。
そのうえで、命令オブジェクトをシリアライズする States.JsonToString
では変数が格納されている場所だけを指定します。
...
"pass:CreateImageEncodePayload": {
"Type": "Pass",
"Next": "batch:CreateAndSaveImages",
"ResultPath": "$.result.CreateImageEncodePayload",
"Parameters": {
"call_type" : "create_image",
"data" : {
"bucket.$": "$.bucket",
"key.$": "$.bucket"
}
}
},
"batch:CreateAndSaveImages": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobName": "xxxxxxxx",
"JobDefinition": "xxxxx",
"JobQueue": "xxxxxx",
"ContainerOverrides": {
"ResourceRequirements": [
{
"Type": "VCPU",
"Value": "1"
},
{
"Type": "MEMORY",
"Value": "2048"
}
],
"Environment": [
{
"Name": "ACTIVITY_TASK_TOKEN",
"Value.$": "$$.Task.Token"
},
{
"Name": "BATCH_INPUT_JSON",
"Value.$": "States.JsonToString($.result.CreateImageEncodePayload)"
}
]
}
},
"End": true
}
...
毎度 AWS Batch利用の前に Pass State
が出てきてしまう難点があり、ちょっとかっこ悪いですが、これで動的に変わる JSON Objectを命令として扱うことができるようになりました。