AWS Step Functionsでの日時操作メモ
Amazon States Language
組み込み関数の一覧
Appendix B: List of Intrinsic Functions
Amazon EventBridge Schedulerから実行日時を渡す
入力
{
"Timestamp": "<aws.scheduler.scheduled-time>"
}
EventBridge Scheduler自体はJSTで指定できるが、上記<aws.scheduler.scheduled-time>
はUTCとなる
組み込み関数のStates.StringSplit
でT
で分割、配列になるのでStates.ArrayGetItem
で0のアイテムを取得して日付だけにすることは可能。ただし、前述のEventBridge Schedulerと組み合わせではUTCなので実行時刻によっては日付がズレることがある。
{
"DateTime.$": "States.ArrayGetItem(States.StringSplit($.Timestamp, 'T'), 0)"
}
{
"DateTime.$": "States.StringSplit(States.ArrayGetItem(States.StringSplit($.Timestamp, 'T'), 1), ':')"
}
とすると
{
"nextState": "Build Rails Task",
"output": "{\"DateTime\":[\"00\",\"00\",\"00Z\"]}",
"status": "SUCCEEDED"
}
となる。States.ArrayGetItem
で0番目を取得すれば"00"
は得られるが文字列なのでStates.MathAdd
で加算することはできない。States.MathAdd
の前にStates.StringToJson
で文字列から数字に変換できそうだが、先頭が0なので
Cannot convert String to Json in States.StringToJson, caused by: Invalid numeric value: Leading zeroes not allowed at [Source: (String)"00"; line: 1, column: 2]
とエラーとなる。
アイデアとしては先頭が0でなければいいので
- 時刻に100を足す
States.Format('1{}', States.ArrayGetItem(States.StringSplit(States.ArrayGetItem(States.StringSplit($.Timestamp, 'T'), 1), ':'), 0))
-
States.StringToJson
で数字にする -
States.MathAdd
で9を足してStates.MathAdd
で100を引く
で時刻はJSTとして扱えそうだが、このあとで23より大きい場合はStates.MathAdd
で24を引いてStates.Format('{}', )
で文字列に変換が必要となる(1桁の場合は0をつける必要もある)ので素直にLambdaで変換するかStep Functionsで呼び出すサービス側で吸収した方が良いと思う。