[アップデート]AWS SAM CLIがAWS環境上のAWS Step Functionsを実行できるようになりました

2023.11.15

初めに

本日AWS SAM CLIのv1.102.0がリリースされました。

今回のアップデートでsam remote invokeを経由してSAMでデプロイした実際のAWS環境上のStep Functionsを実行できるようになりました。

これまでStep FunctionsはAWS::Serverless::StateMachineとしてSAM専用の拡張要素は存在するもののremote invoke(リモート実行)やlocal invoke(ローカル実行)に対応していないため、テストするためにはAWS APIやマネジメントコンソールなど別ツールからの操作が必要となっておりました。

現在もまだローカル実行には対応していませんがリモート実行ができるようになったことでよりSAMでの開発が行いやすくなります。

一応ローカルの実行はSAM単体では実現できませんがStep Functions LocalやAWS CLIといった別サービスを組み合わせることで実現可能です(従来より)。

今回はremote invokeの追加ですのでそちらの方を試してみます。

セットアップ

sam initでサンプルのプロジェクトを生成します。

テンプレート選択時に4を選択することでStep Functionsが初期で設定されているテンプレートを利用可能です(11もおそらく該当)。

% sam init

You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.

Which template source would you like to use?
	1 - AWS Quick Start Templates
	2 - Custom Template Location
Choice: 1

Choose an AWS Quick Start application template
	1 - Hello World Example
	2 - Data processing
	3 - Hello World Example with Powertools for AWS Lambda
	4 - Multi-step workflow
	5 - Scheduled task
	6 - Standalone function
	7 - Serverless API
	8 - Infrastructure event management
	9 - Lambda Response Streaming
	10 - Serverless Connector Hello World Example
	11 - Multi-step workflow with Connectors
	12 - Full Stack
	13 - Lambda EFS example
	14 - DynamoDB Example
	15 - Machine Learning
Template: 4

今までStateMachineやStep Functionsのような単語でイメージしていたので完全に存在を見落としていました。

コードは以下となりますが、ざっくりDynamoDBを作成して簡単な在庫処理をするようなものとなるようです。

デプロイしたものをビジュアルエディタで見るとわかりやすいですね。

こちらのスタックをsam deployでデプロイしておきます。

マネジメントコンソールから実行

デフォルトの動きをイメージするためにまずはマネジメントコンソールから実行します。

入力値は利用しないので適当な値で問題ありません。

実行すると乱数でstock_priceの値が決まり、その値に応じでDynamoDBに書き込みに行く処理となります。

DynamoDB側のテーブルを確認します。

SAMからの実行

せっかくなので引数を受け取るようなパターンを見ておきたいのと乱数だと実行確認がわかりづらいのでShack Stock Valueで実行する関数はStockPriceを受け取り固定値で処理できるようにしておきます。

from random import randint

def lambda_handler(event, context):
    ...
    # Check current price of the stock
    # 変更前
    # stock_price = randint(0, 100)  # Current stock price is mocked as a random integer between 0 and 100
    stock_price =  event['StockPrice'] if 'StockPrice' in event else randint(0, 100)
    return {"stock_price": stock_price}

sam build && sam deploy実行後sam remote invokeを実行します。

実行にはStep Functions用のオプションが存在するわけではなくLambda関数同様のコマンドで実行できます。

今回はテンプレート上にremote invokeで実行可能なリソースが複数あるので実行するリソース名の指定、前述の引数で受け取る仕組みの追加を行っている関係でその指定を行いますが、ステートマシン単体であればsam remote invokeのみで問題ありません。

# 実行可能なLambda関数、Step Functionsが複数存在するためエラー
# これはStep Functionsが存在するからではなく従来でもLambda関数が複数存在すれば発生する
$ sam remote invoke
Error: sam-app-sfn contains more than one resource that could be used with remote invoke, please provide resource_id argument to resolve ambiguity.

$ sam remote invoke StockTradingStateMachine -e '{"StockPrice": 101}'
Invoking Step Function StockTradingStateMachine
{"SdkHttpMetadata":{"AllHttpHeaders":{"Server":["Server"],"Connection":["keep-alive"],"x-amzn-RequestId":["xxxxxx"],"x-amz-crc32":["2745614147"],"Content-Length":["2"],"Date":["Wed, 15 Nov 2023 02:56:29 GMT"],"Content-Type":["application/x-amz-json-1.0"]},"HttpHeaders":{"Connection":"keep-alive","Content-Length":"2","Content-Type":"application/x-amz-json-1.0","Date":"Wed, 15 Nov 2023 02:56:29 GMT","Server":"Server","x-amz-crc32":"2745614147","x-amzn-RequestId":"xxxxxx"},"HttpStatusCode":200},"SdkResponseMetadata":{"RequestId":"xxxxxx"}}%

元々処理されるコードとしてはPriceの値がランダムに0~100の間で生成されますが今回はその値を超える101を指定しており、その値が設定されているため渡されたイベント値で処理されていることも確認できました。

sam remote invoke自体の出力はステートマシン側の出力の値となっているようです。Step Functions自体あまり使ったことないのですぐにできなかったのですが定義を調整すれば直前の結果を最終の出力部分にも渡したりできるのでしょうか?

終わりに

リモート上のみとはなりますがStep Functionsが実行できるようになったことでよりSAMでの開発がしやすくなりました。
実はStep Functionsあまり使ったことないのでこの機会に色々試してみようかなと思っています。

実はこのアップデートv1.91.0の時点のアップデートの内容に含まれていたのですがユーザ側に機能が解放されていない状態でした。
(マネジメントコンソールの実行はその当時に先走って実行した為DynamoDBに格納されている日付が2023/7/19とやや古めのものになってます)

しばらく間が空いてしまったので凍結されたかどうかが若干心配でしたが無事リリースされて良かったです。