AWS上で処理を実行する...というと Lambda が思い浮かびますが、Step Functions という非常に便利なサービスがあります。Step Functions は名前の通り、複数の処理を繋げて段階的に実行することができるサービスです。
Step Functions は様々なサービスと連携でき、EC2を起動したり、DynamoDBからデータをエクスポートしたり、Lambda を実行したり、別の Step Functions を実行したり...などいろいろなことができます。ただ実行するだけでなく、条件分岐やエラーハンドリング機能まで備えている優れものです。
今回はそんな Step Functions について、実際の使用例をもとにご紹介していきます。
ステートマシン作成
コンソールで「Step Functions」の管理画面を開き、「ステートマシンの作成」をクリックします。
以下のような作成画面が開きます。今回は一から作るため「空白から作成」、ステートマシンのタイプは「標準」としています。
「続行」をクリックすると、ステートマシンの編集画面が開きます。
画面中央部に表示されているのが視覚化されたワークフローで、ここに左側のメニューのアクションやフローをドラッグ&ドロップして処理を構築していきます。簡単にご紹介すると、それぞれ以下のような内容です。
種類 | 説明 |
---|---|
アクション | EC2やLambdaの起動、API呼び出し、DBからのデータエクスポート、通知など |
フロー | 条件分岐、並列実行、Wait設定、成功/失敗のステータス設定など |
パターン | S3のデータ処理やジョブポーリングの雛形 |
今回は、DynamoDB にある社内のナレッジデータを S3 にエクスポートする処理を作成します。DynamoDB から S3 へのエクスポートを実行し、10分おきにエクスポート状況を確認して完了していれば正常終了とします。
作成したワークフローの完成形がこちら。
ひとつひとつ詳しく見ていきます。
DynamoDB からのエクスポート部分は、アクションで「DynamoDB: ExportTableToPointInTime」を選択しています。
「引数と出力」タブで、エクスポートAPIに渡す引数を設定します。TableArn
、S3Bucket
などを設定しています。
どういう項目が設定できるの?と疑問に思われるかもしれません。引数欄に「""」を入力すると候補が出てくるので、それをヒントに設定することができます。より詳細な情報については、こちらのようなAPIリファレンスが参考になります。
次はWaitの設定です。Waitは処理を一定時間待機させることができます。今回の場合、10分毎にエクスポート状況の確認をしたいので「一定の時間間隔を待機」で600秒としています。
次は「DynamoDB: ListExports」によるエクスポート状況の監視です。maxResults
に1
、TableArn
に対象テーブルを指定することで、最新のエクスポート状況を取得することができます。
ここで注目いただきたいのが「変数」部分です。今回、エクスポート状況をもとに監視を継続するか終了するかを決定したいので、後続の条件分岐で使うための変数を設定しています。
今回はexportStatus
という変数を設定し、$states.result.ExportSummaries[0].ExportStatus
の値を割り当てるようにしました。
$states.result
というのは成功したAPIの応答を表すものであり、JSON形式のレスポンスからExportStatus
の値を取り出すようにしています。{% ... %}
はJSONata式といい、ワークフロー内の変数を参照するためのものです。
レスポンスの内容などは、右上の「テスト状態」をクリックして確認することができます。
※APIのレスポンスは、公式ドキュメントで確認可能です。例えば、DynamoDB のエクスポートステータスの値を知りたい場合、こちらに記載があります。
上記で定義した変数exportStatus
は、後続の任意のノードで参照することができます。
次が監視の継続判断を行う条件分岐です。フローから「Choice」を選び、条件を設定しています。
今回設定した条件は以下の通りです。
- デフォルト:Fail
exportStatus
がCOMPLETED
の場合:SuccessexportStatus
がIN_PROGRESS
の場合:Wait1に戻る
上記により、10分毎にエクスポート状態を確認して完了なら正常終了、実行中なら継続監視、エラーが発生した場合は異常終了という処理が実現できます。
動作確認
ステートマシンの作成が完了したら、「実行を開始」で実行できます。
実行が開始すると、実行履歴に記録が追加されます。
まとめ
Step Functions の使い方についてご紹介しました。
Step Functions は多くのサービスと連携しており、複数の処理を繋げて段階的に実行することができます。単純なタスクから条件分岐やポーリングを伴う複雑なタスクまで幅広く対応しており、様々なユースケースに適用可能です。
今回は詳しく触れませんでしたが、エラー発生時のリトライや例外処理、タイムアウトやハートビートの設定なども処理ごとに細かく設定することができます。
特別な要件がなければ Lambda を使わずともたいていの処理はできてしまうので、今まで Step Functions を使ったことがなかったという方はぜひ試してみてください。