Step functionsをCFnで実装してたら`The value for the field ‘–xxxx’ must be a STRING`と怒られた

先にまとめ

背景

Step Functionsのstate machineをCFnで作成するために、yamlに色々定義してました。下記のようにGlue Job実行時にArgumentsとして、別設定ファイルに定義したIntegerの値を埋め込んでいます。

  ...
  run-glue-job:
    Type: Task
    Resource: arn:aws:states:::glue:startJobRun.sync
    Parameters:
      JobName: !Ref TestGlueJob
      Arguments:
        --num: ${self:custom.config.num}

${self:custom.config.num}で埋め込まれるのはIntegerである123

するとCFnをdeployする時にエラーが発生

UPDATE_FAILED: StateMachine (AWS::StepFunctions::StateMachine)
Resource handler returned message: "Invalid State Machine Definition: 'SCHEMA_VALIDATION_FAILED: The value for the field ‘—num’ must be a STRING at /States/run-glue-job/Parameters, SCHEMA_VALIDATION_FAILED: The value for the field '--port' must be a STRING at /States/xxxxxxxxxxx/Parameters' (Service: AWSStepFunctions; Status Code: 400; Error Code: InvalidDefinition; Request ID: xxxxxxxxxxxxx; Proxy: null)" (RequestToken: yyyyyyyyyy, HandlerErrorCode: InvalidRequest)

The value for the field '--num' must be a STRING なので、Argumentsの--numはStringでなければいけない、だそうです

解決方法

Integerのまま値を渡すことはどうしても無理そうなので、States.JsonToStringを使用してStringに変換する

...
Arguments:
  --num.$: States.JsonToString(${self:custom.config.num})
...

この設定だとStringとしてパラメータが渡されるので、渋々後続の処理内でStringの値をIntegerに補正する処理を入れました

ちなみに組み込み関数 – AWS Step Functionsの内容を確認すると、本来の目的に沿った使い方ではなさそう..

また適切な方法が見つかったらこの記事を変更します!なかなかこの方法を見つけるのに時間がかかったので一応備忘録として投稿しました