Closed6

AWS Step Functionsでの日時操作メモ

trysmrtrysmr

Amazon EventBridge Schedulerから実行日時を渡す

入力

{
  "Timestamp": "<aws.scheduler.scheduled-time>"
}

EventBridge Scheduler自体はJSTで指定できるが、上記<aws.scheduler.scheduled-time>はUTCとなる

trysmrtrysmr

組み込み関数のStates.StringSplitTで分割、配列になるのでStates.ArrayGetItemで0のアイテムを取得して日付だけにすることは可能。ただし、前述のEventBridge Schedulerと組み合わせではUTCなので実行時刻によっては日付がズレることがある。

{
    "DateTime.$": "States.ArrayGetItem(States.StringSplit($.Timestamp, 'T'), 0)"
}
trysmrtrysmr
{
    "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]

とエラーとなる。

trysmrtrysmr

アイデアとしては先頭が0でなければいいので

  1. 時刻に100を足す
States.Format('1{}', States.ArrayGetItem(States.StringSplit(States.ArrayGetItem(States.StringSplit($.Timestamp, 'T'), 1), ':'), 0))
  1. States.StringToJsonで数字にする
  2. States.MathAddで9を足してStates.MathAddで100を引く

で時刻はJSTとして扱えそうだが、このあとで23より大きい場合はStates.MathAddで24を引いてStates.Format('{}', )で文字列に変換が必要となる(1桁の場合は0をつける必要もある)ので素直にLambdaで変換するかStep Functionsで呼び出すサービス側で吸収した方が良いと思う。

このスクラップは3ヶ月前にクローズされました