メインコンテンツに移動
デベロッパーのためのクラウド活用方法

AWS Step Functions の機能を活用して、Lambda 関数無しで実現できることを確認してみよう !

2024-09-03 | Author : 青木 克臣

はじめに

こんにちは ! テクニカルインストラクターの青木です。
突然ですが、皆様は AWS Step Functions を使っていますか ?

AWS Step Functions は、分散アプリケーションの構築、プロセスの自動化などに役立つワークフローをサーバーレスで簡単に作成・実行できるサービスです ! 皆様の中には、AWS Step Functions のワークフロー内で、例えば何かロジックを書くために Lambda 関数を呼び出している、という方もいらっしゃるのではないでしょうか。

しかし、ワークフローから Lambda 関数を呼び出す場合は、Lambda 関数のコードの記述方法を理解し、ワークフローからイベントオブジェクトを受け取って処理をするような、連携用のコードを多く記述する必要があります。また、Lambda 関数を使う場合は、関数毎に設定、実行ロールなどの管理も必要になるうえ、実行時間に対しての課金も発生します。

ただ、AWS Step Functions の機能をうまく活用することで、Lambda 関数を使わずにワークフローを作成することも検討できます。

この記事では、既に AWS Step Functions を使っている方や概要は知っているという方を対象に、AWS Step Functions の便利な機能を活用し、Lambda 関数なしでこんなことができます ! というのを紹介します。

(注) このブログは、必ずしも Lambda 関数をなくすべきだという主張ではありません。AWS Step Functions には、ワークフローに条件付きロジックを追加できる Choice や組み込み関数、エラー処理などの機能が備わっており、Lambda 関数のプログラミングを置き換えやすいパターンがあります。今回は、そのパターンのうち 3 つのパターンを紹介します。


X ポスト » | Facebook シェア » | はてブ »

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

builders.flash メールメンバー登録

builders.flash メールメンバー登録で、毎月の最新アップデート情報とともに、AWS を無料でお試しいただけるクレジットコードを受け取ることができます。

今すぐ登録 »

1. AWS Step Functions とは

まずは簡単に、AWS Step Functions の概要を説明します。
AWS Step Functions とは、様々な AWS サービスから様々な AWS API アクションを視覚的に組み合わせてアプリケーションワークフローを設計・管理できるサーバーレスなワークフローサービスです。AWS Step Functions の具体的な使い方などについては こちらのブログ をご確認ください。

それではここから、Lambda 関数が使われている 3 つのワークフローに対して、Lambda 関数を使わないワークフローに書き換えていきます !

2. Lambda 関数を用いたワークフローを、Lambda 関数なしで実装していく

2-1. ケース 1 : 簡単なロジックを実装するために Lambda 関数を使っている場合

最初に、Lambda 関数内で簡単なロジックを実装しているケースを考えましょう。
例えば、リクエストに含まれる sentence の値の中に “evil“ という単語が含まれているかを判定する Lambda 関数を呼び出し、結果によって条件分岐をしているワークフローを考えてください。

図のようなイメージです。

A flowchart diagram illustrating an AWS Step Functions workflow for sentence validation, showing the sequence from checking a sentence, evaluating if it is valid, and ending in either success or fail states.

Lambda 関数内の処理

Lambda 関数の中では、下記のような処理を行っています。(今回は Python を使っています。)

python
isValid = 'evil' not in sentence.split(" ")
return {
    'statusCode': 200,
    'isValid': isValid
}

値の返却

例えば、下記のように値を返します。

python
入力 {"sentence": "This is a pen"} => isValid: True
入力 {"sentence": "This is an evil pen"} => isValid: False

AWS Step Functions の組み込み関数

さて、この Lambda 関数は本当に必要でしょうか ?

この処理は、AWS Step Functions の 組み込み関数を使えば、Lambda 関数が不要になります !

組み込み関数とは Task 状態を使用せずに基本的なデータ処理操作を実行するのに役立つ、プログラミング言語の関数のようなものです。組み込み関数では、配列に特定の値が存在するかの判定や UUID の生成などの処理が可能です。組み込み関数について、詳しくは こちらをご確認ください。

今回の場合、States.StringSplit 組み込み関数を使用して、文字列を配列に分割し、States.ArrayContains 組み込み関数を使用して、配列に特定の値が存在するかどうかを判定することで、Lambda 関数で行っている処理と同じ処理が実現できます。具体的には、Parameters フィルターを使用し、下記のように JSON ペイロードを構築します。

JSON ペイロード

下記のように JSON ペイロードを構築します。

json
{
    "isInValid.$": "States.ArrayContains(States.StringSplit($.sentence, ' '), 'evil')"
}

sentence の入力による結果

これによって、sentence という入力に “evil” という単語が含まれていれば isInValid は true、含まれていなければ false が入ります。

Lambda 関数が要らなくなりましたね ! 👏

Screenshot of an AWS Step Functions workflow for name validation, showing a process with Pass, Choice, Fail, and Success states. The user interface is in Japanese, illustrating how the validation logic is configured and displayed in the AWS Console.

ケース 2 : 他の AWS サービスを呼び出すために Lambda 関数を使っている場合

次に、Lambda 関数から他の AWS サービスを呼び出しているケースを考えましょう。

例えば、Lambda 関数から Amazon Bedrock の API にリクエストを送って、画像生成を行うワークフローを例に見てみましょう。

Amazon Bedrock について、詳しくは こちらのブログ をご確認ください。

1 つ目の Lambda 関数で、画像生成用のプロンプトを生成し、2 つ目の Lambda 関数でそのプロンプトから画像を生成します。

A diagram illustrating an AWS Step Functions workflow that uses two Lambda functions, one to create a prompt and another to create an image, from start to end.

AWS Step Functions の AWS SDK 統合

さて、この Lambda 関数は本当に必要でしょうか ?

この処理は、AWS Step Functions の AWS SDK 統合という仕組みを使えば、Lambda 関数が不要になります !

AWS Step Functions の AWS SDK 統合を使用すると、ワークフローからほぼすべての AWS サービスの API アクションを呼び出すことができます。
AWS SDK 統合について、詳しくは こちら をご確認ください。

そして、2023 年 11 月に Amazon Bedrock の API も呼び出せるようになった ので、図のようにワークフローを構築できます。

A flowchart diagram illustrating the AWS Bedrock InvokeModel process, starting with 'Create Prompt' and followed by 'Create Image', representing a sequential workflow from start to end.

プロンプト生成用の Amazon Bedrock 呼び出し

プロンプト生成用の Amazon Bedrock 呼び出しでは、Anthropic Claude 3 Sonnet を利用しました。(この記事ではリージョンは us-east-1 を使っています。)
Screenshot of the 'Create Prompt' API parameter screen for Amazon Bedrock with Japanese interface, showing configuration options for invoking a foundation model, including the input of a model ARN and mode selection.

モデルに渡すパラメータ

モデルに渡すパラメータは下記のように設定してみました。入力で受け取った input の文字列から、プロンプトを作らせます。

画像生成用の Amazon Bedrock 呼び出しでは、Stability AI SDXL 1.0 を利用しました。

Screenshot of the Amazon Bedrock interface in Japanese, showing the 'Create Image' workflow with settings for invoking the Stable Diffusion XL v1 foundation model. The screenshot displays API parameters, model selection options, and a model ARN input field.

パラメータ設定

入力で受け取った input の文字列から、プロンプトを作らせます。

json
{
  "anthropic_version": "bedrock-2023-05-31",
  "max_tokens": 200,
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text.$": "States.Format('{}{}{}', 'あなたはプロンプト生成のプロフェッショナルです。これからテーマを与えるので、そのテーマをもとに生成 AI に画像を作らせたいです。そのためのプロンプトを英語で生成してください。生成した英語のプロンプト以外は何も出力しないでください。\n\n<テーマ>',$.input,'</テーマ>')"
        }
      ]
    }
  ]
}

画像保存設定

図のように設定を入力し、画像が S3 バケットに保存されました。
Screenshot of the Amazon Bedrock interface showing the 'Create Image' parameter settings in Japanese UI, including model parameter input fields, JSON example, S3 URI, and content type specification options.

ワークフロー実行

下記の入力でワークフローを実行し、画像を作らせてみました。

json
{
    "input": "100年後の東京の風景"
}

生成された画像

Lambda 関数が要らなくなりましたね ! 👏

画像生成の処理などは時間がかかる場合もあるため、それを呼び出す Lambda 関数の実行時間も長くなってしまいますが、ワークフローから直接呼び出すことで、Lambda 関数の実行時間にかかる課金も削減できます。

A sunset cityscape featuring futuristic green skyscrapers with eco-friendly designs and lush vegetation, representing an advanced sustainable urban environment.

2-3. ケース 3: SaaS を呼び出すために Lambda 関数を使っている場合

最後に、Lambda 関数から他の SaaS を呼び出しているケースを考えましょう。

例えば、Lambda 関数から Stripe という SaaS を呼んで決済の処理を行っているワークフローを考えてください。

A workflow diagram showing an AWS Step Functions sequence where a Lambda function is invoked to call the Stripe API. The flow starts with 'Start', moves through a Lambda invoke step labeled 'Call Stripe API', and ends at 'End'.

AWS Step Functions の HTTPS エンドポイント統合

さて、この Lambda 関数は本当に必要でしょうか ?

この処理は、AWS Step Functions の HTTPS エンドポイント統合を利用することで、Lambda 関数が不要になります ! 2023 年 11 月、AWS Step Functions は HTTPS エンドポイントのサポートを開始 し、あらゆる SaaS アプリケーションをワークフローから直接統合できるようになりました。

よって、図のようにワークフローを構築できます。

ただし、この HTTPS エンドポイントの統合では、Amazon EventBridge Connection を使用して外部 API にリクエストを送るため、設定が必要です。詳しい使い方については、こちらの記事をご確認ください。

Lambda 関数が要らなくなりましたね ! 👏

A diagram showing an AWS Step Function workflow that calls the Stripe API via an HTTP endpoint. The flow starts, sends a request to the Stripe API, and then ends.

まとめ

AWS Step Functions の機能を活用することで、Lambda 関数を使用せずに様々なタスクを実行できることがわかりました。
具体的には、組み込み関数や AWS SDK 統合、HTTPS エンドポイント統合を利用することで、Lambda 関数を使わずにワークフローを構築できました。

これにより、Lambda 関数の作成・管理する負荷を削減し、Lambda 関数の実行時間に伴うコストの削減も期待できます。

ぜひ、皆様の業務にもお役立てください !

筆者プロフィール

青木 克臣
アマゾン ウェブ サービス ジャパン合同会社
AWS トレーニングサービス本部 テクニカルインストラクター

”分かりやすい”をモットーに、日々 AWS のトレーニングの登壇をしています。
趣味はフットサル、筋トレ、サウナで、推しのサウナはウェルビー栄 (名古屋) です。
Portrait of an AWS employee standing with arms crossed, smiling, and wearing an AWS shirt in a modern office environment.