re:Invent 2024: AWS Step Functions Workflow Studioでの ステートマシン構築方法
はじめに
海外の様々な講演を日本語記事に書き起こすことで、隠れた良質な情報をもっと身近なものに。そんなコンセプトで進める本企画で今回取り上げるプレゼンテーションはこちら!
📖 AWS re:Invent 2024 - Building state machines with AWS Step Functions Workflow Studio (API217)
この動画では、AWS Step FunctionsのビジュアルエディタであるWorkflow Studioの機能と活用方法について解説しています。データ処理、ITセキュリティの自動化、機械学習、マイクロサービスのオーケストレーションなど、Step Functionsの主要なユースケースを紹介した後、画像処理のワークフローを実際に構築するデモを行っています。AWS Lambda、Amazon Rekognition、DynamoDBなどのサービスを組み合わせ、コードを書くことなくビジュアルな操作だけでワークフローを作成できる点や、JSONPathやJSONataを使用したデータの入出力制御、実行履歴の詳細な確認機能など、Workflow Studioの具体的な使い方を示しています。ビジネスサイドの関係者とも共有しやすい視覚的なワークフロー設計の利点についても言及しています。
※ 画像をクリックすると、動画中の該当シーンに遷移します。
re:Invent 2024関連の書き起こし記事については、こちらのSpreadsheet に情報をまとめています。合わせてご確認ください!
本編
Workflow Studioの概要とStep Functionsの主要ユースケース
皆様、ご参加ありがとうございます。4日目の終わりに近い時間帯ですので、お集まりいただき感謝いたします。これからWorkflow Studioについてご紹介させていただきます。おそらく皆様は開発者やアプリケーションの設計者としてご参加されていると思いますが、最近では多くのアプリケーションにワークフローを組み込む必要性が高まっています。その実現方法は様々ありますが、今日はその1つをご紹介いたします。AWS Step Functionsサービスのための強力なビジュアルエディタであるWorkflow Studioの使い方について学んでいただきます。私はPrincipal Solutions ArchitectのBen Mosesです。それでは早速本題に入り、ライブデモに移らせていただきます。最後にQ&Aの時間を設けたいと思いますが、もし時間が足りない場合は、後ほど個別にご質問をお受けすることも可能です。
まず、Step Functionsをよくご存じない方のために簡単にご説明させていただきます。これはステートマシンを実行するワークフローエンジンで、主に4つの主要なユースケースがあります。データ処理では、Distributed Mapという機能を使用して、何万もの並列実行をデータセット上で行うことができ、大規模なデータ処理を迅速に行うことが可能です。多くのお客様がITやセキュリティの自動化、例えばインシデント対応の自動化やインフラストラクチャのスケーリング制御などにご利用されています。機械学習も increasingly人気の高いユースケースです。例えば、データセットの分割、トレーニング、自動テストなど、これらすべてのプロセスをStep Functions内で統合的に制御できます。もう1つの人気の高いユースケースは、マイクロサービスのオーケストレーションです。イベント駆動型アーキテクチャを使用して変更に関するメッセージを送信する場合、マイクロサービスに到達したときにそのペイロードで何かをオーケストレーションしたいことがあるでしょう。
ここで、非常にシンプルな例を見てみましょう。これをワークフローとして考えることができます。ここでは入力として画像を使用し、いくつかの処理を行う必要があります。画像のサムネイルを作成して処理を行いますが、同時にAWSのサービスを使用して特徴を識別し、そのメタデータを保存します。これにより、後でそのサムネイルと組み合わせて使用することができます。ここで何が起こっているかは非常に理解しやすいですね。私たちの多くは視覚的な学習者なので、何が起こっているかが一目で分かります。もちろん、ステートマシンをコードとして作成することもでき、Step Functionsはこれをサポートしています。
このコード自体を読む必要はありません。ここでお伝えしたいのは、Amazon States Languageと呼ばれるものがあり、これはJSONの上に構築された定義タイプで、プログラムでワークフローを作成することができるということです。しかし、ビジネスサイドの方、例えばプロダクトマネージャーや事業部門の方と一緒に作業する場合、このコードが何をしているのかを理解してもらうのは難しいものです。そこでWorkflow Studioの出番となります。
右側に表示されているのがWorkflow Studioのスクリーンショットで、左側で見たのと同じワークフローを表現しています。ここでコンポーネントやステップ、ステートに、ビジネス全体で使用される分かりやすい名前を付けると、何が起こっているのかを誰もが理解できるようになります。コードを見るよりもはるかに理解しやすいですね。さらに嬉しいことに、双方向の変換が可能です。Workflow Studioでビジュアルにワークフローを定義し、そのASLドキュメントをエクスポートしてコードベースにバージョン管理し、修正や拡張を行い、その後再びWorkflow Studioに読み込んでビジュアル編集を続けることができます。
Workflow Studioを使ったワークフロー構築のライブデモ
冒頭で申し上げたように、このデモでは入力としていくつかの画像を使用します。これらの画像は Amazon Bedrock を使って生成したものです。 ご覧のように、美しいビーチのシーンがあります。そしてここにはシティスケープがあり、さらに今日のプレゼンテーションには欠かせない可愛らしい犬の画像もあります。これらを入力として使用していきます。また、メタデータも保存する必要があると申し上げましたが、そのために DynamoDB のシンプルなテーブルを使用します。現時点ではテーブルは空の状態です。
では、この構築を始めるために、Step Functions コンソールに移動しましょう。ここで、左側のメニューを展開すると、State Machines のセクションまでスクロールできます。
後ほどご紹介する準備済みのものがありますが、まずは完全な白紙の状態から始めてみましょう。作成を開始すると、先ほど触れたような多くのユースケースがあり、クイックスタートとしてこれらを選択できます。これらを選ぶと、カスタマイズや追加、変更が可能な基本的なビルディングブロックが用意されます。今回は空のキャンバスから始めることにします。
さて、Studio に入りました。左側にはパレットがあり、すべてのステートが含まれています。これらには AWS サービスと連携するアクションが含まれています。Step Functions では220以上の AWS サービスが利用可能で、実際には10,000以上の API アクションにアクセスできます。分岐ロジックを実装する必要性について話しましたが、それにはこれらのフローコンポーネントを使用します。前のステートの出力に基づいて選択を行い、一方向または他方向に分岐するロジックを導入できます。また、並列ステートも可能で、ワークフローを直線的に進める必要がない場合は、並列で処理を実行できます。Map ステートでは、S3 バケットから読み込んだセットや、自分で渡した JSON オブジェクトの要素を反復処理できます。
最後のセクションはパターンです。これは、お客様がよく使用するユースケースを集めたものです。合理的なデフォルト設定で簡単にコンポーネントをドロップできるように設計されており、そこから機能を追加していくことができます。中央には無限にスクロール可能なキャンバスがあり、自由に移動やズームインアウトができます。コンポーネントを追加していくと、自動的にレイアウトが調整されます。右側にはプロパティダイアログがあります。現在はワークフロー自体のプロパティを表示していますが、コンポーネントを配置していくと、それぞれをカスタマイズしてアクションを設定できます。
ここで重要なポイントをお伝えしたいのですが、Step Functionsチームが1、2週間前に、従来のJSONPathに代わる新しい処理方式としてJSONataをリリースしました。今回のデモでは、あえてJSONPathを使用します。というのも、現時点で公開されている多くのサンプルがJSONPathを使用しているためです。ただし、このツールに慣れてきたら、JSONataを試してみることをお勧めします。JSONataについては充実したドキュメントが用意されており、サンプルも順次アップデートされていく予定です。今回はJSONPathを選択して、先に進めていきましょう。最初のステップは画像メタデータの抽出でしたので、そのために使用できるLambda関数を用意しています。
実に簡単で、AWS Lambda invokeをキャンバスにドラッグ&ドロップするだけです。設定については、このプロパティウィンドウを下にスクロールすると、最適化された統合タイプを使用していることがわかります。これをサポートするサービスは約15個あり、設定を簡単にすることを目的としています。ただし、ここにドロップできるすべてのサービスとアクションは、通常のAWS SDKパラメータを使用できます - JSONオブジェクトとして渡すだけです。Lambdaは最適化されたサービスの1つなので、私のIAMロールで参照できるすべてのLambda関数から選択できます。その中の1つが「metadata」という関数で、これを選択します。
これで完了です。ここから段階的に構築していきましょう。今から作成に進みますが、Step Functionsは、そのLambda関数を呼び出す権限を持つ実行ロールをステートマシン用に作成するかどうか尋ねてきます。もちろん「はい」と答えます。Step Functionsは、統合するほぼすべてのサービスについて、IAMロールを提案する機能を備えています。データの機密性が高いサービスの場合は、必要な設定を提供しますが、そのロールを自分で追加するよう求められることがあります。
作成が完了したら、実行する準備が整います。実行を開始する際には、初期ペイロードを指定できます。これが一般的な使用方法です。他のサービスから呼び出す場合、通常は何らかのデータを渡します。EventBridgeの状態やAPI Gatewayからのデータなどです。このデモでは、先ほど説明した画像それぞれに対応するデータをローカルに保存しています。ビーチの例を選んでみましょう。ここでは、画像が保存されているバケットの名前、DynamoDBテーブルの名前、そして先ほどお見せしたビーチ画像のオブジェクトキーを渡しているだけです。では実行を開始します。画面を整理して、作業スペースを確保しましょう。
画面上部には実行自体に関する情報が表示されます。中央部分にはグラフビューがあり、これが私たちが主に作業する場所になります。また、下部には発生したすべての事象がテーブル形式で表示されます。実行開始から成功で終了するまでの全てが記録されています。それぞれの項目は展開可能で、各ステートに入力されたデータ、ステートがそれをどのように処理したか、そして出力されたデータなど、すべての情報を確認できます。システムで何が起きているかをデバッグしたり理解したりする上で、非常に強力なツールとなっています。
現時点では Lambda invoke のステップが1つだけあります。 これを選択すると、右側にいくつかのタブが表示されます。ここで input and output タブを選択してみましょう。 JSON ファイルから与えた実行入力と、Lambda 関数から返された状態が確認できます。この結果は、画像が JPEG か PNG のいずれかであるため有効であることを示しています。
では、このステートマシンからの出力をどのように取得するのでしょうか?それを確認するためにエディターに戻って説明させていただきます。というのも、ワークフローを構築する際の重要な要素の1つは、 データの流れ方を決めることだからです。Lambda 関数では、設定に加えて、ここにも input and output タブがあります。 実行中のデータを操作することができます。ここでは、実行されたバージョン、Lambda 関数から返されたペイロードなど、すべての情報を確認できます。さらに、 メタデータもすべて含まれています。
通常のワークフローでは、これらのメタデータすべてを必要とすることはありません。下にスクロールすると、いくつかの項目が表示されます。デフォルトでは、Lambda invoke アクションブロックを使用すると、output path というフィルターが自動的に設定されます。これは、返されたオブジェクトのルートから、基本的に Lambda から返されたペイロードだけを取り出すという意味です。Step Functions では最近、変数という機能が導入され、返された値をグローバル変数として実行内に保存し、後で参照することができるようになりました。
変数が存在する前は、入力と出力を連鎖させるのが一般的なパターンでした。最初に渡したテーブル名や画像キーなどの変数が必要な場合は、それらを保持し続ける必要がありました。これを実現するのが result path です。これを使用すると、最初に渡したルートオブジェクトを保持し、 返された値をサブオブジェクトとして追加することができます。では、実際にやってみましょう。パスを dollar dot にして、 image metadata と名付けてみましょう。
重要な点として、output path は このペイロードを操作する最後のステップとなります。そのため、これは別の場所に移動されるため、もう使用できません。では、これを削除して保存し、もう一度実行してみましょう。beach JSON を読み込んで実行させます。 inputs and outputs を見ると、元の入力(バケット名、イメージテーブルなど)が保持されていることがわかります。 image metadata という新しいプロパティができましたが、実行全体が含まれてしまっています。私たちが必要なのはペイロードだけだったのですが。
この問題は簡単に解決できます。先ほどの入出力の部分に戻って、Result Selectorと呼ばれる機能を使います。構文はドキュメントでよく定義されており、JSONによく似ています。プロパティを設定します。この例では「image valid」というプロパティでしたが、値を動的に設定したいので、末尾に「.dollar」を付ける必要があります。そして値を設定しますが、これは先ほど見たものと似ていて、「$.payload .image valid」となります。
完成したワークフローの実行と結果の確認
これを保存して、元のJSONを忘れずに渡して最後の実行をしてみましょう。すると ステートの出力がクリーンアップされたバージョンが表示されるはずです。実際には、元の入力として受け取った ペイロード全体がありますが、新たにimage metadataというプロパティが追加され、そのオブジェクト内にimage validがtrueとして表示されています。
入出力の設定を含む他のブロックをすべて配置して説明することもできますが、Step Functionsコンソールに戻って、 事前に用意しておいたバージョンを開いた方が分かりやすいかもしれません。これは この画像で見たものと同じはずです。ズームインして、一部を非表示にして、十分なスペースを確保しましょう。
上部にLambda関数があり、これは 先ほど一緒に作成したものとよく似ています。その後、Choiceステートの1つに進みます。ここでのデフォルトでは、Choiceステートが何も判断しない場合、このnot supported image typeに進みます。ただし、image dataがtrueの場合は、ここに来てデータを保存するというルールがあります。 これはDynamoDBのput itemブロックを使用しており、最適化された統合タイプで、保存したいアイテムを指定するだけのシンプルなものです。今のところ、S3オブジェクトのキーとテーブル名だけを指定すれば、そのアイテムがDynamoDBに書き込まれます。
その後、いくつかのタスクを並列で実行します。これらは先ほどスライドで見た部分です。一方では、サムネイルを作成するためにLambdaを呼び出します。また、Rekognitionを直接呼び出すこともします。これにはカスタムコードやSDKを書く必要はなく、ブロックをドラッグ&ドロップして設定プロパティを渡すだけです。バケット名とオブジェクトキーを指定するだけでシンプルです。 このデモでは、シンプルに保つために、最上位のカテゴリー、つまりトップラベルだけを取得して、その1つの文字列を出力するようにしています。これが完了すると、DynamoDBテーブルのアイテムが更新されます。
それでは、ビーチのシーンを使って実行してみましょう。より多くの分岐ロジックがある場合や、例えば無効な画像を渡した場合は、異なるパスを通ることが確認できます。実行履歴では、各実行がどのように進んだかを確認できます。ここで見ると、StoreImageMetadataが成功していることがわかります。DynamoDBからの出力は必要なかったので保持していません。そして並列処理に進み、サムネイルが作成され、Rekognitionが実行されました。ここでは最上位のカテゴリとして「nature and outdoors」が検出され、テーブルが更新されています。
結果を確認するためにDynamoDBに戻ると、1つのアイテムが格納されています。S3オブジェクトキーをIDとして使用しています。Rekognitionのラベルとして「nature and outdoors」が付けられており、新しく作成されたサムネイルのS3キーも確認できます。バケットを見ると、サムネイルが作成されており、元の画像の小さいバージョンができています。これは、このような処理をコードを1行も書くことなくプログラム的に実現できることを示しています。また、ステークホルダーにも使い方を視覚的に分かりやすく示すことができます。
これで今回のセッションは終了です。Step Functionsには、まだまだ深く掘り下げられる要素がたくさんあります。このリソースを持ち帰って学習することを強くお勧めします。これは自分のペースで進められるハンズオン・ワークショップで、基礎から応用的なユースケースまで、フィルタリングやInput/Output操作などをより詳しく学べる内容となっています。残り30秒となりましたので、Q&Aの時間は取れませんが、私は横で待機していますので、質問のある方はぜひ声をかけてください。アンケートにもご協力いただければ幸いです。お役に立てていれば嬉しく思います。ありがとうございました。
※ こちらの記事は Amazon Bedrock を利用することで全て自動で作成しています。
※ 生成AI記事によるインターネット汚染の懸念を踏まえ、本記事ではセッション動画を情報量をほぼ変化させずに文字と画像に変換することで、できるだけオリジナルコンテンツそのものの価値を維持しつつ、多言語でのAccessibilityやGooglabilityを高められればと考えています。
Discussion