Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Step_Functions_をはじめよう_JSONataによる進化_.pdf

Avatar for Hiroshi Kato Hiroshi Kato
August 09, 2025
74

 Step_Functions_をはじめよう_JSONataによる進化_.pdf

Avatar for Hiroshi Kato

Hiroshi Kato

August 09, 2025
Tweet

Transcript

  1. 自己紹介 加藤 寛士 (かとう ひろし) NECソリューションイノベータ株式会社 • JAWS-UG 北陸新幹線 2回目

    • JAWS-UG 名古屋 の運営をしています! • JAWS Festa 2025 参戦予定! (実行委員会にも入ってます)
  2. Step Functions とは? サーバレスなワークフローオーケストレーション • ステートを定義して、ワークフローを構築 • Workflow Studio(GUI)を使用し、ワーク フローをドラッグ&ドロップで構築可能

    • ASL(JSON)を使用してワークフローを 記述することも可能 ASL:Amazon States Language • 分岐、並列、リトライ、タイムアウト、 エラーハンドリングなど、豊富な制御機能 • 200+ のAWSサービスと統合 Workflow Studio 特徴 ドラッグ&ドロップで構築 ASL記述 Step Functions DynamoDB S3 SNS SQS EventBridge Athena Bedrock Lambda 200+ のAWSサービス
  3. Step Functions の主なステートと制御機能 主な制御機能 主なステート ステート種別 説明 Task Lambdaなどの呼び出し Choice

    条件分岐(if/else 相当) Parallel 複数処理の同時並行実行 Map 配列要素の処理繰り返し Wait 一定時間/指定時刻の待機 Pass 入力データをそのまま出力、 または定数値を出力 Succeed/Fail ワークフローの成功/失敗終了 フィールド名 説明 Retry ステート実行失敗時の自動再試行 設定 Catch ステート失敗時の代替フロー指定 TimeoutSeconds ステートの最大実行時間制限 ASL (Amazon States Language) を用いて記述
  4. Step Functions をどこから呼び出す? 主な呼び出し元 主な用途・特徴 Lambda 関数 StartExecution APIを使ってどこからでも呼び出し可能 EventBridge

    イベントトリガーで自動実行(S3アップロード・スケジュール・ログ検出など) API Gateway REST API のバックエンドとして使える外部システムから直接呼び出し可能 AWS SDK / CLI Boto3 や SDK 経由で実行。バッチやWebアプリからも活用しやすい Lambda EventBridge API Gateway AWS Tools and SDKs Step Functions AWS 内のさまざまなサービスから呼び出し、連携することができる DynamoDB S3 SNS SQS EventBridge Athena Bedrock Lambda 200+ のAWSサービス
  5. データアクセスの進化 JSONataの登場で、劇的に実装が簡潔に! • 合計4ステート必要 • JSONPathは「読み取るだけ」で演算不可 • Step Functions用ロールが必要 さらに

    Lambda用ロールが必要 • 合計2ステートで完結 • Step Functions用ロールのみ 入力JSONから firstName と lastName を取得 それらを結合して フルネーム(姓名) を作成 名前に “加藤" が 含まれていたら "VIP" 判定 JSONPath (従来) JSONata(+ Assign) データ取得 データ結合 データ整形 条件分岐 データ取得 ・結合・整形 条件分岐 例
  6. データアクセスの進化 JSONataの利用は、多くのメリットを生み出す! 項目 JSONPath(従来) JSONata(+ Assign) データ取得方法 パス指定(InputPath 等) JSONata

    式(Arguments, Output) データ加工 Lambda or Pass JSONata 式1行で完結 条件分岐 Lambda or Choice Choice + JSONata 式 ステート数 多くなりがち(Pass・Lambda併用) 少ない(整形・演算を内部処理) ロール構成 StepFunctions用 + Lambda用ロール StepFunctions用ロールのみ コスト Lambda実行回数 × ステート数 ステート数削減でコスト最適 実装・保守性 煩雑・ステートが多くて見づらくなる シンプル・視認性がよい テストのしやすさ Lambda側でロジック分離の必要あり ASL内で完結、TestStateで確認可能 Lambdaを利用することで発生していた、実装規模、複雑さ、コストを大幅にカット可能
  7. JSONata(+ Assign)の真価 • QueryLanguage: “JSONata” を指定するだけ • Assign ステートで変数定義 →

    $変数名 で他ステートから参照可能 • 値の整形・演算・条件分岐・文字列操作・日付処理など、式で完結 • 構文: {% <JSONata式> %} • 演算:+, &, ==, $sum(), $contains() など • 文字列:{% $states.input.user.lastName & ' さん' %} • 条件式:{% $contains($fullName, ‘加藤') %} • グローバル変数: Assign ステート内の変数は、後続のすべての ステートから参照可能 • ローカル変数:Map / Parallel内で定義 → ブロック内のみ有効 { "QueryLanguage": "JSONata", "StartAt": "SetFullName", "States": { "SetFullName": { "Type": "Pass", "Assign": { "fullName": "{% $states.input.user.lastName & ' ' & $states.input.user.firstName %}" }, "Next": "CheckName" }, "CheckName": { "Type": "Choice", "Choices": [ { "Condition": "{% $contains($fullName, '加藤') %}", "Next": "VIP" } ], "Default": "Normal" }, "VIP": { "Type": "Succeed" }, "Normal": { "Type": "Succeed" } } } 基本仕様 JSONata式の書き方 スコープ仕様 JSONata(+Assign)はとても簡単!
  8. 処理内容 Lambda JSONata(+ Assign) JSON整形・リネーム Python等で実装 Argumentsに1行で記述 合計値や平均値の算出 for 文で配列処理

    sum()、avg()などの関数 文字列結合・テンプ レート 連結処理やテンプレートライ ブラリ '{% 'Hi, ' & $.name %}' 形式で 表現 条件分岐の判定 if 文で実装 Choiceステートに式を記述 日付フォーマット変換 datetimeライブラリ使用 toMillis()などの関数 定数や値の保持 Lambda+Passステートの組 み合わせ Assignで変数を定義し $変数 名で参照 Step Functionsから実装を考えてみるのもあり Lambda EventBridge Step Functions Lambda EventBridge DynamoDB S3 S3 DynamoDB Before After JSONata(+Assign)は、簡潔な実装で様々な処理を実現! JSONata(+ Assign)の真価
  9. Step Functions First Lambda起点ではなく、まずワークフローから考える 項目 Lambda起点の考え方 Step Functions First 設計アプローチ

    Lambda中心に処理を実装 ワークフローから処理を組み立てる 分岐・制御 /データ整形・変換 Lambdaに分岐・整形・連携をコーディング 分岐・整形・連携を、Step Functionsで定義 処理の見直し Lambdaが増えると全体像がつかみにくくなる ステートマシンで可視化・全体の整合性の確保が容易 • 視覚的にワークフローを管理できる • 各ステートの粒度で機能を容易に差し替え可能 • 非エンジニアも把握しやすい なぜ、 Step Functions First が有効なのか?
  10. ワークフロータイプとコスト 2つのワークフロータイプの適切な利用がポイント ワークフロータイプ Standard Workflows Express Workflows 実行モデル Exactly-once(重複なし・冪等でない操作) At-least-once(重複の可能性あり・冪等な操作)

    保存期間 最大 1年(永続化) 実行後は非永続、ログのみ 実行時間上限 1年 5分 適用シーン 長期処理、業務ワークフロー 高頻度イベント、リアルタイム処理 料金体系 状態遷移数:$0.000025/遷移 無料枠:月間4,000状態遷移まで無料 リクエスト数:$0.000001/リクエスト 実行時間:$0.00001667 per GB-Second 料金目安 100万実行:25$ 100万実行:1$+メモリ量×実行時間 • Lambda排除 → JSONata + Assignで実装 • Retryや冗長なPass削減で、遷移数を抑制 • 適切なワークフロータイプを選択 • Express × Standardのネストで柔軟に最適化 コスト削減Tips サービス 軽量処理 (64MB、0.5秒) 重い処理 (1GB、5秒) Standard Workflows $25.00 $25.00 Express Workflows $1.53 $84.35 Lambda $0.73 $83.55
  11. Step Functions Firstで構築してみる ブルワリーコンシェルジュ@長野駅周辺 EventBridge API Gateway Step Functions DynamoDB

    Bedrock Step Functions Bedrock ブルワリー Table 定期実行 リサーチ依頼 最新メニュー 本日のオススメ 登録 情報 取得 今日の オススメ店舗 最初の一杯 情報 今日の オススメ店舗 最初の一杯 人数、時間帯、 気分など
  12. Step Functions Firstで構築してみる ブルワリーコンシェルジュ@長野駅周辺 EventBridge API Gateway Step Functions DynamoDB

    Bedrock Step Functions Bedrock ブルワリー Table 定期実行 リサーチ依頼 最新メニュー 本日のオススメ 登録 情報 取得 今日の オススメ店舗 最初の一杯 情報 今日の オススメ店舗 最初の一杯 人数、時間帯、 気分など
  13. Step Functions Firstで構築してみる ブルワリーコンシェルジュ@長野駅周辺 EventBridge API Gateway Step Functions DynamoDB

    Bedrock Step Functions Bedrock ブルワリー Table 定期実行 リサーチ依頼 最新メニュー 本日のオススメ 登録 情報 取得 今日の オススメ店舗 最初の一杯 情報 今日の オススメ店舗 最初の一杯 人数、時間帯、 気分など 54Line 84Line Lambda (python) 176Line 相当 Lambda (python) 200Line 相当
  14. まとめ • APIGateway+StepFunctionsのワークロードの構築 • JSONataの構文、関数の深掘 • コスト最適化、ワークフロータイプのネスト検証 • ステート設計のベストプラクティス、アンチパターン •

    ローカルIDE統合 • サービスクォータ • ログ記録、モニタリング • テスト、デバッグ • バージョニング、デプロイ管理 • JSONata(+Assign)により 、Step Functions はより強力で簡潔なツールに進化 • ASLの表現力が大幅に向上し、従来よりも少ないLambda、ステートで実装が可能に • 処理内容によっては、Lambdaよりも簡易に、低コストで機能を実現できる さらに学びたいこと