LoginSignup
1
0

More than 1 year has passed since last update.

StepFunctions から AWS Batchの呼び出しでJSON Stringを使う

Last updated at Posted at 2021-12-13

Wano Group Advent Calendar 2021の記事です。

AWS Step Functions から AWS Batchに動的な命令を与えたい時、よくやるパターンのTIPSを記載します。

image.png

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で任意の場所に格納する

image.png

解決策としては、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を命令として扱うことができるようになりました。

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