AWS StepFunctionとAmazon EventBridgeを使ってステートマシンの定期実行をしたのでまとめました。

どうもさいちゃんです。AWSの公式チュートリアルでStepFunctionを触っていたら現在のものと少し違う部分が出てきて戸惑ったのでアウトプットを兼ねてまとめてみました!
2022.03.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Step Functionを触ってみたかったので、今回はAWSで公開されている10分でできるチュートリアル「サーバーレスワークフローのスケジューリング」をやってみました。

しかしチュートリアルに掲載されている内容が少し古く戸惑ってしまう部分があったので、本ブログはその辺のまとめ+アウトプット記事となっています。

まずは今回使ったサービスの簡単な概要説明からしていきます。

AWS Step Functions

Step Functionは簡単に言うとAWSが提供するワークフローサービスの一つです。ビジネスプロセスの自動化やパイプライン構築に使用することができ、ワークフローは分かりやすく可視化されるのも大きな特徴です。

基本的にはStep Function単体で使うというよりも他のサービスと組み合わせて使うもので、例えばLambda関数を順番に呼び出していくといったときに便利なサービスになっています。

上記はほんとにざっくりとした説明ですが、StepFunctionについてはこちらのブログとても参考になりました。

このチュートリアルではStepFunctionで作成したステートマシンの定期実行を行うために、AWS EventBridgeも使用していきますがこちらについては、後述してあります。

やってみた

IAMロールの作成

まず初めにStep Function用にIAMロールを作成していきます。Step Functionはほかのリソースにアクセスするため権限を与える必要があります。

ロールの作成から信頼されたエンティティの種類を選択ページで、AWSサービスを選択し、Step Functionを選択します。

アクセス権限はそのまま次に進んで問題ありません。

ロール名は「step_functions_basic_execution」としておきます。このまま作成しましょう。

ステートマシンの作成

Step Functionには様々なステートマシンテンプレートが用意されています。チュートリアルには「HelloWolrld」を使う方法が記載されていましたが、「HelloWolrd」のテンプレートが見当たらないので一旦サンプルから作るのはやめて、手動で「HelloWorld」のステートマシンを作っていきます。

コードでワークフローを記述を選択して、タイプは標準で下記コードを定義に記述します。

{
    "Comment": "A Hello World example of the Amazon States Language using a Pass state",
    "StartAt": "HelloWorld",
    "States": {
      "HelloWorld": {
        "Type": "Pass",
        "Result": "Hello World!",
        "End": true
      }
    }
  }

コードのとなりに構成図のようなものができるのがわかると思います。このコードに少し変更を加えます。

{
    "Comment": "A Hello World example of the Amazon States Language using a Pass state",
    "StartAt": "Do Something",
    "States": {
      "Do Something": {
        "Type": "Pass",
        "Result": "Work complete!",
        "End": true
      }
    }
  }

HelloWorldだった部分をDo somethigに書き換えて、さらに7行目のHello World!Work complete!に書き換えてあります。

これによって右側の構成図にも変更が反映されていることが分かります。

このステートマシンに任意の名前をつけて、既存のロールから先ほど作成したstep_functions_basic_executionを選択します。

これでステートマシンを作成すれば、実行の準備完了です。

Amazon EventBridge

チュートリアルではここでCloudWatch Eventを使ってルールを作りステートマシンの定期実行を行う手順だったのですが、調べてみるとCloudWatch EventはAmazon EventBridgeという名称になっていました。

Amazon EventBridgeはCloudWatch Eventをベースに構築されたサービスなので基本的な構造はCloudWatch Eventと変わりません。スケジュールを組んだり何かAPIをトリガーとしてプログラムを実行するなどのアクションを行うことが可能なサービスです。

新たな機能としてサードパーティー製品との連携が可能になっているようです。

基本的な操作はほとんど変わらずでしたが、本ブログではEventBridgeでのルール作成手順をご紹介していきたいと思います。

Amazon EventBridgeのルール作成

スケジュールに沿って、ステートマシンを動かすために、EventBridgeのルールを作成していきます。

ルールに任意の名前を付けて、ルールタイプはスケジュールを選択します。

この時、イベントバスでルールを有効にするのチェックが入っていることを確認します。

スケジュールパターンは通常のレートで実行されるスケジュールを選択し、分かりやすく今回は1分間隔でスケジューリングをします。

ターゲットの選択で、AWSのサービスにチェックをいれ、Step Functionステートマシンを選択します。

該当のステートマシンを選び、ロールは新しく作成のままで、追加設定からターゲット入力を設定の欄が一致したイベントとなっていることを確認して次に進みます。

今回タグは特に設定せずにルールの作成をします。これで作成したステートマシンが1分ごとに実行されるようにスケジュールすることができました。

ステートマシン入出力の処理方法のカスタマイズ

Step Functionのコンソールに戻り先ほど作成したステートマシンの編集をしていきます。

先ほどWork complete!に書き換えたResultフィールドは次の状態に渡す出力の指定をしています。

ここにResultPathフィールドを追加することで状態の出力を変更することができます。例えば出力の状態をLambda関数からの出力などに置き換えることなどが可能です。

"ResultPath": "$.taskresult",

先ほど書いたコード7行目の下に上記コードを追加します。

これによってイベントの詳細の出力部分にPass状態の出力、つまり「Work Compleate!」が追加されるようになります。

テスト

Step Functionコンソールから作成したステートマシンの実行結果を確認します。

スケジューリング通りに1分ごとに実行が行われていることが確認できました。

実行したものの一つをさらに見ていくと、入出力の詳細を確認することができます。

出力部分で先ほどの編集が反映されて、「Do Something」状態の出力としてWork Compleate!が追加されていることが確認できました。

まとめ

今回のチュートリアルでAWS StepFunctionの使い方を学ぶことができたので、次は複数のLambda関数を順番に呼び出すワークフローの作成をしてみたいと思います。こちらの内容もブログにするつもりです!