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 つのパターンを紹介します。


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 関数を呼び出し、結果によって条件分岐をしているワークフローを考えてください。

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

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

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

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

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

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

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

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

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

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

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

画像をクリックすると拡大します

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


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

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

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

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

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

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

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

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

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

プロンプト生成用の Amazon Bedrock 呼び出しでは、Anthropic Claude 3 Sonnet を利用しました。(この記事ではリージョンは us-east-1 を使っています。)

クリックすると拡大します

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

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

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

クリックすると拡大します

図のように設定を入力し、画像が S3 バケットに保存されました。

クリックすると拡大します

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

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

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

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

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

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

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

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

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

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

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

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


まとめ

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

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

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


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

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

”分かりやすい”をモットーに、日々 AWS のトレーニングの登壇をしています。
趣味はフットサル、筋トレ、サウナで、推しのサウナはウェルビー栄 (名古屋) です。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する