AWS Step Functions のユースケース
AWS Step Functions で何を自動化できるのでしょうか? 最も一般的なユースケースをいくつかご紹介いたします。AWS Step Functions を使用すると、ワークフローを構成する一連のステップとしてビジネスプロセスを実装できます。
ワークフローの個々のステップは、ビジネスロジックを持つ Lambda 関数またはコンテナを呼び出したり、DynamoDB などのデータベースを更新したり、そのステップまたはワークフロー全体の実行が完了すると、メッセージをキューに発行したりできます。
AWS Step Functions には、Standard と Express の 2 つのワークフローオプションがあります。ビジネスプロセスの 1 回の実行に 5 分以上かかると予想される場合、Standard を選択する必要があります。長時間稼働するワークフローの例としては、ETL オーケストレーションパイプラインや、ワークフロー内のいずれかのステップが次のステップに進むために人からの応答を待っている場合などがあります。
Express ワークフローは、所要時間が 5 分未満のワークフローに適しており、1 秒間に 10 万回の呼び出しなど、大量の実行が必要な場合に最適です。Standard と Express のいずれかを個別に使用することも、それらを組み合わせて、より長い Standard ワークフローが複数の短い Express ワークフローをトリガーして並行して実行することもできます。
マイクロサービスオーケストレーション
Lambda 関数を組み合わせて Web ベースのアプリケーションを構築
この単純な銀行システムの例では、お客様の名前と住所を検証した後、新しい銀行口座を作成します。ワークフローは、2 つの Lambda 関数 CheckName とCheckAddress がタスク状態として並行して実行されるところから始まります。両方が完了すると、ワークフローは ApproveApplication Lambda 関数を実行します。タスク状態からのエラーを処理するために、retry 句と catch 句を定義することができます。ワークフローでは、定義済みのシステムエラーを使用したり、これらの Lambda 関数によってスローされたカスタムエラーを処理したりできます。ワークフローのコードがエラー処理を行うため、Lambda 関数はビジネスロジックに集中でき、コードも少なくて済みます。Express ワークフローは、この例により適しています。Lambda 関数が、外部依存関係がなく、合わせて 5 分もかからないタスクを実行しているためです。
人の承認を得て、Lambda 関数を組み合わせて Web ベースのアプリケーションを構築
ワークフローが次のステップに進むことができるように、人がビジネスプロセスのステップを確認して承認または拒否ことが必要な場合があります。ワークフローが人を待つ必要がある場合や、外部システムが応答するのに 5 分以上かかるような処理には、Standard ワークフローの使用をおすすめします。ここでは、新しいアカウント開設のプロセスを拡張し、間に承認者への通知ステップを入れます。ワークフローは、CheckName とCheckAddress のタスク状態が並行して実行されるところから始まります。次の状態 ReviewRequired は、NotifyApprover タスクで承認者に SNS 通知メールを送るか、ApproveApplication の状態に進むかの 2 つの可能なパスを持つ選択状態です。NotifyApprover タスク状態は、承認者にメールを送信し、次の選択状態「承認済み」に進む前に、その応答を待ちます。承認者の決定に基づき、アカウント申請は Lambda 関数を通じて「承認」または「拒否」されます。
Express ワークフローを使用して、イベントに応答してビジネスプロセスを呼び出す
この例では、カスタム Eventbridge バスのイベントがルールを満たし、ターゲットとして Step Functions ワークフローを呼び出します。有効期限切れの顧客サブスクリプションを処理する必要があるカスタマーサービスサービスアプリケーションがあるとします。EventBridge ルールは、サブスクリプションの有効期限切れイベントをリッスンし、それに応じてターゲットワークフローを呼び出します。サブスクリプションの有効期限切れワークフローは、のサブスクリプションが所有するすべてのリソースを削除せずに無効にし、有効期限切れのサブスクリプションについて顧客に通知する E メールを送信します。この 2 つのアクションは、Lambda 関数を使って並行して行うことができます。ワークフローの最後に、Lambda 関数を介して新しいイベントがイベントバスに送信され、サブスクリプションの有効期限が処理されたことを示します。この例では、Express ワークフローを使用することをおすすめします。ビジネスが成長し、より多くのイベントをイベントバスに置くようになると、Express ワークフローで毎秒 10 万のワークフロー実行を呼び出す能力が強力になります。この Github リポジトリで、実行中の例をご覧ください。
セキュリティと IT オートメーション
IAM ポリシー作成のためのセキュリティインシデント対応のオーケストレーション
AWS Step Functions を使用すると、手動承認ステップを含む自動化されたセキュリティインシデント対応ワークフローを作成できます。この例では、IAM ポリシーが作成されると、Step Functions ワークフローがトリガーされます。ワークフローは、ポリシーのアクションを、制限されたアクションのカスタマイズ可能なリストと比較します。ワークフローは、ポリシーを一時的にロールバックし、管理者に通知して、承認または拒否を待ちます。このワークフローを拡張して、代替アクションの適用や特定の ARN へのアクションの制限など、自動修復することができます。実行中のこの例は、こちらでご覧ください。
AWS アカウントでのオペレーションイベントへの対応
AWS リソースのオペレーションイベントへの対応方法を自動化することで、AWS クラウドストラクチャのメンテナンスにかかるオペレーションのオーバーヘッドを削減できます。Amazon EventBridge では、AWS リソースに関するほとんどの変更と通知を記述したほぼリアルタイムのシステムイベントのストリームを配信します。このストリームから、特定のイベントを AWS Step Functions、AWS Lambda、その他の AWS のサービスにルーティングし、さらなる処理と自動化アクションを行うルールを作成できます。この例では、AWS Health から発生したイベントに基づいて、AWS Step Functions ワークフローがトリガーされます。AWS は、公開されている IAM アクセスキーの一般的なコードリポジトリサイトを積極的に監視しています。IAM アクセスキーが GitHub で公開されたとします。AWS Health は、公開されたキーに関連する AWS アカウントで AWS_RISK_CREDENTIALS_EXPOSED イベントを生成します。設定された Amazon Eventbridge ルールがこのイベントを検出し、Step Functions ワークフローを呼び出します。AWS Lambda 関数を利用して、ワークフローは公開された IAM アクセスキーを削除し、公開されたキーの最近の API アクティビティを要約し、要約メッセージを Amazon SNS トピックに送信してサブスクライバーに通知する、という順序で行われます。実行中のこの例は、こちらでご覧ください。
ソースと宛先の S3 バケット間でデータを同期させます
Amazon S3 を使用して静的ウェブサイトをホストし、Amazon CloudFront を使用してコンテンツを世界中に配信できます。ウェブサイトの所有者として、ウェブサイトのコンテンツをアップロードするために 2 つの S3 バケットが必要になる場合があります。1 つはステージングとテスト用、もう 1 つは本番用です。ウェブサイトを更新するたびに新しいバケットをゼロから作成することなく、ステージングバケットからのすべての変更で本番バケットを更新したいと考えています。この例では、Step Functions ワークフローは 2 つの並列かつ独立したループでタスクを実行します。1 つのループは、ソースバケットから宛先バケットへすべてのオブジェクトをコピーしますが、宛先バケットに既に存在するオブジェクトは除外します。2 番目のループは、ソースバケットで見つからない宛先バケットのすべてのオブジェクトを削除します。AWS Lambda 関数のセットは、入力の検証、ソースと宛先の両方のバケットからのオブジェクトのリストの取得、オブジェクトのコピーや削除を一括して行うという各ステップを実行します。この例とそのコードの詳細は、こちらをご覧ください。ステートマシンで並列実行のブランチを作成する方法については、こちらをご覧ください。
データ処理と ETL オーケストレーション
ストリーミングデータのデータ処理パイプラインを構築
この例では、Freebird は、データ処理パイプラインを構築し、複数のソースからの Webhook データをリアルタイムで処理し、データを変更する Lambda 関数を実行します。このユースケースでは、複数のサードパーティアプリケーションからの Webhook データが、Amazon API Gateway を介して Amazon Kinesis データストリームに送信されます。AWS Lambda 関数は、この Kinesis ストリームからデータを取得し、Express ワークフローをトリガーします。このワークフローは、このデータを検証し、処理し、正規化するための一連のステップを進みます。最後に、Lambda 関数は SNS トピックを更新し、SQS キューを介して次のステップのためにダウンストリーム Lambda 関数にメッセージをトリガーします。データ処理パイプラインをスケーリングするために、このワークフローを 1 秒あたり最大 10 万回まで呼び出すことができます。
ETL プロセスのステップを自動化
Step Functions を使用して、ETL プロセスのすべてのステップをさまざまなデータソースと宛先でオーケストレーションできます。
この例では、ソース S3 バケットで新しいデータが利用可能になるたびに、Step Functions ETL ワークフローは、Amazon Redshift を更新します。Step Functions ステートマシンは、AWS Batch ジョブを開始し、完了またはエラーの状態をモニタリングします。AWS Batch ジョブは、ソース (Amazon S3) から ETL ワークフローの .sql スクリプトを取得し、PL/SQL コンテナを介して宛先 (Amazon Redshift) を更新します。.sql ファイルには、データ変換の各ステップの SQL コードが含まれています。ETL ワークフローは、EventBridge イベントを使用してトリガーするか、AWS CLI を介して手動でトリガーするか、AWS SDK またはカスタム自動化スクリプトを使用してトリガーすることができます。ワークフローの任意のステップまたはワークフロー実行の終了時に、失敗の E メールをトリガーする SNS で管理者に通知できます。この ETL ワークフローは、Standard ワークフローを使用できる例です。この例の詳細は、こちらでご覧ください。サンプルプロジェクトを通じて AWS Batch ジョブを送信する方法の詳細については、こちらを参照してください.
複数のジョブを並行して ETL パイプラインを実行します
抽出、ロード、変換 (ETL) オペレーションは、生データを有用なデータセットに変換し、データを実用的な洞察に変えます。
Step Functions を使用して複数の ETL ジョブを並行して実行できます。この場合、ソースデータセットが異なる時間に利用可能になり、対応するデータセットが利用可能になったときにのみ各 ETL ジョブをトリガーさせることができます。これらの ETL ジョブは、AWS、Glue、Amazon EMR、Amazon Athena などのさまざまな AWS サービスまたはその他の AWS 以外のサービスによって管理できます。
この例では、販売データセットとマーケティングデータセットを処理する 2 つの個別の ETL ジョブが AWS Glue で実行されています。両方のデータセットが処理されると、3 番目の ETL ジョブは前の ETL ジョブからの出力を結合して、結合されたデータセットを生成します。Step Functions ワークフローは、データが S3 で利用可能になるまで待機します。メインワークフローが予定どおり開始されている間、EventBridge イベントハンドラーは Amazon S3 バケットで設定され、セールスまたはマーケティングのデータセットファイルがバケットにアップロードされると、ステートマシンは、どちらのデータセットが利用可能になったかに応じて ETL ジョブ「ProcessSales Data」またはProcessMarketingData」をトリガーできるようにします。
AWS アカウントに ETL オーケストレーションアーキテクチャを設定するには、こちらからこのアーキテクチャの詳細を確認してください。Step Functions から AWS Batch ジョブを管理する方法はこちらをご覧ください。
大規模データ処理
Step Functions を使用して、JSON 配列、S3 のオブジェクトのリスト、S3 バケット内の CSV ファイルなど、データセット内の数千万の項目を反復処理することができます。これにより、高い並行性でデータを並列処理することが可能です。
この例において、Step Functions ワークフローは、分散モードの Map 状態を使用して、S3 バケット内の S3 オブジェクトのリストを処理します。Step Functions は、オブジェクトのリストを反復処理し、何千もの並列ワークフローを起動し、同時進行でアイテムを処理していきます。Lambda などのコンピューティングサービスを利用すると、サポートされているあらゆる言語でコード作成が容易になります。また、Map 状態のワークフローに含めるために 220 以上の目的別 AWS サービスから選択できます。子ワークフローの実行が完了すると、Step Functions はその結果を S3 バケットにエクスポートし、レビューやさらなる処理に利用することができます。
機械学習オペレーション
ETL ジョブの実行と機械学習モデルの構築、トレーニング、デプロイ
この例では、Step Functions ワークフローが、EventBridge をトリガーとして 1 日に 1 回実行されるスケジュールで実行されています。ワークフローは、S3 に新しいデータがあるかどうかを確認することから始まります。次に、ETL ジョブを実行して、データを変換します。その後、SageMaker のジョブをトリガーする Lambda 関数を用いて、このデータで機械学習モデルをトレーニングおよびデプロイし、完了後、ワークフローは次のステップに進みます。最後に、ワークフローは Lambda 関数をトリガーして、S3 に保存される予測を生成します。このワークフローを作成するためのステップバイステッププロセスは、こちらからご覧ください。
AWS Step Functions Data Science SDK を用いた機械学習ワークフローの自動化
AWS Step Functions Data Science SDK は、Amazon SageMaker と AWS Step Functions を使用して機械学習モデルを処理・公開するワークフローを作成できる、オープンソースライブラリです。SDK は、機械学習パイプラインのすべてのステップ (エンドポイントのトレーニング、調整、変換、モデリング、設定) をカバーする Python API を提供します。これらのワークフローは、Python や Jupyter Notebook で直接管理および実行することが可能です。以下の例は、機械学習ワークフローのトレーニングと変換のステップを示したものです。トレーニングのステップでは、Sagemaker トレーニングジョブを開始し、モデルアーティファクトを S3 に出力します。モデルの保存のステップでは、S3 からのモデルアーティファクトを使用して SageMaker 上にモデルを作成します。変換のステップでは、SageMaker 変換ジョブを開始します。エンドポイント設定作成のステップでは、SageMaker 上のエンドポイント設定を定義します。エンドポイント作成のステップでは、トレーニング済みモデルを設定されたエンドポイントにデプロイします。ノートブックはこちらからご覧ください。
メディア処理
PDF や画像からデータを抽出・処理
この例では、AWS Step Functions、AWS Lambda、Amazon Textract を組み合わせて、PDF 形式の請求書をスキャンしてそのテキストとデータを抽出し、支払い処理を行う方法を学びます。Amazon Textract は、請求書のテキストとデータを分析し、ジョブが正常に完了するごとに SNS、SQS、Lambda を通じて Step Functions のワークフローをトリガーします。ワークフローは、まず Lambda 関数で請求書分析に成功した結果を S3 に保存するところから始まります。これをトリガーとして、別の Lambda 関数が分析したドキュメントを処理して、この請求書に対して支払い処理が可能かどうかを確認し、DynamoDB の情報を更新します。請求書が処理可能な場合、ワークフローは請求書の支払いが承認されているかどうかを確認します。承認されていない場合は、SNS を通じてレビュー担当者に通知し、手動で請求書を承認してもらいます。承認されている場合、Lambda 関数が処理された請求書をアーカイブし、ワークフローを終了します。この例とそのコードの詳細は、こちらをご覧ください。
大規模な並列化を使用して動画を分割およびトランスコード
この例では、Thomson Reuters 社が AWS Step Functions と AWS Lambda を使ってサーバーレスの分割動画トランスコーディングソリューションを構築しました。1 日あたり約 350 本のニュース動画クリップを、それぞれの動画クリップごとに 14 種類のフォーマットに、できるだけ早くトランスコードする必要がありました。このアーキテクチャは、メディアファイルを連続的に処理するだけの、オープンソースの音声/動画エンコーダー、FFmpeg を使用しています。スループットを向上させ、最高のカスタマーエクスペリエンスを提供するために、AWS Step Functions と Amazon S3 を使って並列に処理することがソリューションとなりました。各動画は 3 秒のセグメントに分割され、並行して処理され、最後に統合されました。
最初のステップでは、Locate keyframes という Lambda 関数で、動画のチャンクに必要な情報を特定します。その後、Lambda 関数 Split video がキーフレームを元に動画を分割し、セグメントを S3 バケットに格納します。その後、各セグメントは Lambda 関数によって並列処理され、宛先バケットに入れられます。ステートマシンは、N 個のセグメントがすべて処理されるまで、この処理に従います。そして、処理したセグメントを連結する最後の Lambda 関数をトリガーし、結果の動画を S3 バケットに保存します。
Amazon MediaConvert を使ったサーバーレスな動画トランスコーディングパイプラインの構築
この例では、AWS Step Functions、AWS Lambda、AWS Elemental MediaConvert をどのように連携させて、フルマネージド型オンデマンドコンテンツトランスコーディング機能を実現するかを学びます。このユースケースは、動画コンテンツをクラウドで処理したい、あるいは将来的にワークロードをクラウドに移行したい、ソース動画コンテンツの量が多い企業や様々な量のソース動画コンテンツを持つ企業に応用できます。
このビデオオンデマンドソリューションには、メインの Step Functions ワークフローがトリガーする 3 つのサブワークフローがあります。
- 取り込み: Express ワークフローの場合があります。S3 にドロップされたソースファイルをトリガーに、データを取り込むワークフローです。
- 処理: このワークフローでは、動画の高さと幅を調べ、エンコーディングプロファイルを作成します。処理後、AWS Elemental MediaConvert を介してエンコーディングジョブが起動します。
- 公開: 最後のステップでは、宛先の S3 バケットにアセットがあるかどうかをチェックし、ジョブが完了したことを管理者に通知します。
AWS Step Functions の使用を開始する