ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

Step Functions でステートマシン起動開始(実行開始)時刻を利用する方法

本記事の内容

こんにちは、AWSエンジニアの山口です。

みなさん、Step Functionsを使っていますか?

非同期で疎結合なワークフローを組み込むときに便利なStep Functionsですが、定期的な実行が必要な処理に対して外部制御を加える際に自動化する際にも利用されます。そのような処置の場合、処理結果によって生成されるアウトプット名称に処理実行日付を付与することが多いかと思います。

今回は、Step Functions でステートマシン起動開始(実行開始)時刻をステートマシン内のデータとして利用する方法を書いていきます。

本記事のサマリ

  • StepFunctionsでステートマシン起動開始(実行開始)時刻は、Contextオブジェクトから取得可能
  • Passステートを利用してContextオブジェクトからテートマシン起動開始(実行開始)時刻を利用してみる
  • 少し複雑な特定日付フォーマットも Lambda を使わずにステートマシン内で構成可能



本文はここから

ステートマシン起動開始(実行開始)時刻 は Contextオブジェクトから取得できる

Step Functions ではあらかじめContext オブジェクトとして、ステートマシンおよび実行に関する情報が含まれている JSON データが存在します。
Context オブジェクトには、下記のフィールドからアクセスできます。

  • InputPath
  • OutputPath
  • ItemsPath (Mapステート)
  • Variable (Choiceステート)
  • ResultSelector
  • Parameters
  • 変数と変数の比較演算子

Contextオブジェクトにはステートマシン起動開始(実行開始)時刻の他、ステートマシン実行時の Inputデータ、ステートマシン名、タスクTokenなどの情報が含まれています。

Contextオブジェクトの詳細はAWS公式ドキュメントに記載されています。

docs.aws.amazon.com

Contextオブジェクトからテートマシン起動開始(実行開始)時刻を取得する方法

では、実際にContextオブジェクトからステートマシン起動開始(実行開始)時刻を取得してみましょう。
今回は、Passステートを利用して Parameters フィルタから取得します。

<Parameters フィルタの記載内容>

{
  "ExecutionStartTime.$": "$$.Execution.StartTime"
}

<Workflow Studio の画面キャプチャ>

<ステートマシンの実行結果>

Contextオブジェクトから取得した結果として、outputデータ内の $.Pass_ExecutionStartTime.ExecutionStartTime へステートマシンの起動開始(実行開始)時刻 "2023-09-25T05:43:55.025Z" が出力されています。

組み込み関数とContextオブジェクトを組み合わせた応用的な使い方

Contextオブジェクトから取得したステートマシンの起動開始(実行開始)時刻に対して、組み込み関数を使い処理することでマシンイメージやタグなどに特定フォーマットの日付を付与することが可能です。日付演算をするだけの Lambda関数 を作成して呼び出すよりもお手軽に実装できます。

下記のステートマシンでは、Contextオブジェクトから取得したステートマシンの起動開始(実行開始)時刻を再フォーマットし、「Prefix-年月日時分」に加工しています。

<ステートマシンのコード>

{
  "Comment": "A description of my state machine",
  "StartAt": "ステートマシン起動時刻取得+月日時刻を分割",
  "States": {
    "ステートマシン起動時刻取得+月日時刻を分割": {
      "Type": "Pass",
      "ResultPath": "$.Pass_ExecutionStartTime",
      "Parameters": {
        "DateTSplited.$": "States.StringSplit($$.Execution.StartTime, 'T')"
      },
      "Next": "月日の表記から\"-\"を取り除く"
    },
    "月日の表記から\"-\"を取り除く": {
      "Type": "Pass",
      "Parameters": {
        "DateHyphenSplited.$": "States.StringSplit($.Pass_ExecutionStartTime.DateTSplited[0], '-')"
      },
      "ResultPath": "$.Pass_ReformatDateData",
      "Next": "時間の表記から\":\"を取り除く"
    },
    "時間の表記から\":\"を取り除く": {
      "Type": "Pass",
      "Parameters": {
        "TimeHyphenSplited.$": "States.StringSplit($.Pass_ExecutionStartTime.DateTSplited[1], ':')"
      },
      "ResultPath": "$.Pass_ReformatTimeData",
      "Next": "月日データと時間データを再フォーマット"
    },
    "月日データと時間データを再フォーマット": {
      "Type": "Pass",
      "Parameters": {
        "DateData.$": "States.Format('{}{}{}', $.Pass_ReformatDateData.DateHyphenSplited[0], $.Pass_ReformatDateData.DateHyphenSplited[1], $.Pass_ReformatDateData.DateHyphenSplited[2])",
        "TimeData.$": "States.Format('{}{}', $.Pass_ReformatTimeData.TimeHyphenSplited[0], $.Pass_ReformatTimeData.TimeHyphenSplited[1])"
      },
      "ResultPath": "$.Pass_ReformatDateAndDateData",
      "Next": "Prefixデータと月日データ、時間データを結合"
    },
    "Prefixデータと月日データ、時間データを結合": {
      "Type": "Pass",
      "End": true,
      "Parameters": {
        "NameAndTime.$": "States.Format('{}-{}-{}', $.Name, $.Pass_ReformatDateAndDateData.DateData, $.Pass_ReformatDateAndDateData.TimeData)"
      }
    }
  }
}

<ステートマシン実行時のInputデータ>

{
 "Name": "TestName"
}

ステートマシンの実行結果は下記の通りです。

<ステートマシンの実行結果>

Step Functions には、組み込み関数、Contextオブジェクトなど、Visual Studioから意識しずらいですが、活用すると便利な機能が多くあります。

本記事が Step Functions を活用する・活用していきたいと考えている、どなたかのお役に立てば嬉しいです。