[アップデート]Step Functions Workflow Studioがリリースされて、ワークフロー作成が簡単になりました
AWS Step Functions Workflow Studioがリリースされました!東京リージョンで利用可能です。大阪リージョンではまだ利用できません。
機能概要
Workflow Studioは、簡単に言うとワークフローの中身がGUIで見れて、かつGUIで編集ができる機能です。
StepFunctionsを使えば、複雑なフロー制御をこのサービスに任せて、組み合わせるLambda関数等の他サービスはシンプルな状態を保つことができます。とても便利なサービスなので私も好きです。なのですが、その構築にはAmazon States Language(ASL)というJSON形式の独自言語を駆使する必要があり、なかなか覚えるのが大変です。
これまでも、AWS Toolkit for Visual Studio Code と AWS CloudFormation (AWS SAM を含む)ではYAML形式で書けるようになるアップデートがあったりなどその構築負荷を下げるアップデートはいくつかあったのですが、今回もそういった簡単に構築できるようにするアップデートです。
使ってみてわかったこと
権限まわりを自動設定してくれてらくらく
これはWorkflow Studioがリリースされる前から、コンソールでStepFunctionsを作成する際にはそうだったのですが、権限周りの設定を裏でAWSが勝手にやってくれるのがありがたいです。StepFunctionsステートマシン(ワークフローのことをこのように呼びます)から各種AWSリソースを呼び出す場合には、StepFunctionsステートマシンにアタッチするIAM Roleにその処理を許可するポリシーを設定する必要があります。例えばLambda関数を実行したかったらlambda:InvokeFunction
権限が必要です。「このサービスのこのアクション呼び出したかったら、どの権限を設定する必要があるんだっけ?」みたいなことがよくあるのですが、Workflow Studioで構築する場合この点をAWS側でやってくれるので気にする必要がなく、楽ちんです。
事前に呼び出すAWSリソースを作成しておかなくて良い
タスクで呼び出す他のAWSサービスのリソースは、Workflow StudioでStepFunctionsステートマシーンを構築するより前に作成しておく必要はありません。呼び出し処理だけ先にWorkflow Studioで作成して、リソース自体はあとから作成可能です。もちろん先に作っておいて選択することもできます。
元に戻す、やり直しが便利
GUIのデメリットの一つとして、誤操作があると思います。ワークフローエリアで各ステートのパネルを誤って移動させてしまった場合などには、上部の「元に戻す」や「やり直し」機能があるので、こちらを利用して簡単に復旧することができます。
ブラウザバックしちゃダメ
ステートマシンの作成には、Workflow StudioでGUIでワークフローを作成するページ含め計4ステップの画面があります。途中で前の画面に戻って設定を修正したい場合は、必ず画面内の「戻る」ボタンを使ってください。ブラウザバックすると設定内容が飛んでしまいます… 私はWorkflow Studioでガッツリワークフロー作って次画面に遷移したあとにブラウザバックしてしまいました。。
やってみた
Workflow Studioについて書かれたAWS Blogで例として使われていたサンプルアプリケーションを私も構築してみようと思います。まずLambda関数を実行し、その返り値が真ならDynamoDBのItemを作成(PutItem)しSNSで処理成功の旨をメール送信します。もしLambda関数返り値が偽なら処理失敗の旨をメール送信します。
呼び出すリソースの作成
今回はステートマシン作成より前に、ステートマシンから呼び出すLambda関数などの各AWSリソースを作成します。SAMテンプレートが用意されているのでこちらを使ってサクッと作成します。
SAMアップグレード
私は以前SAM CLIをインストール済みでしたのでアップグレードだけ行ないます。未インストールの方はこちらを参考にインストールしてください。
$ brew upgrade aws-sam-cli
アプリケーションの初期化
$ sam init --location git@github.com:mavi888/step-functions-blog-post.git
ビルド
$ npm install $ sam build
デプロイ
$ sam deploy --guided
デプロイ途中で色々質問されるので答えていきます。途中、処理成功/失敗の旨のメールの通知先も訊かれます。
最終的に以下のようなリソースが作成されます。また上記メールの通知先にSNSサブスクロプションの確認メールが届きますので、メール内の「Confirm Subscription」をクリックして承認してください。
CloudFormation events from changeset --------------------------------------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason --------------------------------------------------------------------------------------------------------------------------------- CREATE_IN_PROGRESS AWS::SNS::Topic NotificationSNSTopic - CREATE_IN_PROGRESS AWS::SNS::Topic NotificationSNSTopic Resource creation Initiated CREATE_IN_PROGRESS AWS::IAM::Role ValidateAccountDataFunctionRol - e CREATE_IN_PROGRESS AWS::DynamoDB::Table AccountTable - CREATE_IN_PROGRESS AWS::IAM::Role ValidateAccountDataFunctionRol Resource creation Initiated e CREATE_IN_PROGRESS AWS::DynamoDB::Table AccountTable Resource creation Initiated CREATE_COMPLETE AWS::SNS::Topic NotificationSNSTopic - CREATE_IN_PROGRESS AWS::SNS::Subscription NotificationSNSSubscription - CREATE_COMPLETE AWS::SNS::Subscription NotificationSNSSubscription - CREATE_IN_PROGRESS AWS::SNS::Subscription NotificationSNSSubscription Resource creation Initiated CREATE_COMPLETE AWS::IAM::Role ValidateAccountDataFunctionRol - e CREATE_IN_PROGRESS AWS::Lambda::Function ValidateAccountDataFunction - CREATE_COMPLETE AWS::Lambda::Function ValidateAccountDataFunction - CREATE_IN_PROGRESS AWS::Lambda::Function ValidateAccountDataFunction Resource creation Initiated CREATE_COMPLETE AWS::DynamoDB::Table AccountTable - CREATE_COMPLETE AWS::CloudFormation::Stack sam-app - --------------------------------------------------------------------------------------------------------------------------------- Successfully created/updated stack - sam-app in ap-northeast-1
ステートマシンの作成
Step Functionsのコンソールから「ステートマシンの作成」を選びます。「ワークフローを視覚的に設計」という選択肢が増えているのでそれを選択します。
Lambda関数
まずは最初のステートとしてLambda関数を設定しましょう。 左側のタスク一覧からLambdaのInvokeをドラッグしてワークフロー内にドロップします。
右側のフォームで、タスクの名前を設定(状態名)し、Function Nameで先程SAMで作ったLambda関数を選択します。
出力タブに移動します。このタスク結果の例が表示されてるやつ、助かりますね。関数の返り値はPayload
以下に格納されます。
今回は関数の返り値validated
があれば十分なので、以下のように3点変更します。(関数のコードはこれです。)
- 一番下の「OutputPath で出力をフィルタリング」チェックを外します。
- その上の「入力と結果を ResultPath と組み合わせる 」にチェックを入れ
$.Payload
と入力します。 - さらにその上の「ResultSelector を使用して結果を変換」にチェックを入れ以下のように入力します。
{ "validated.$": "$.Payload.validated" }
ええと、この部分については少しStepFunctionsの仕組みを勉強しないと理解が難しいかと思います。詳しくは以下のブログがおすすめです。
もしくは、これも比較的最近の機能であるデータフローシミュレーターを使って色々試してみるのもおすすめです。
Choiceステート
次はLambda関数の結果を受けて分岐処理する部分を作成します。左側パネルのフロータブをクリックしてから、Choiceステートのパネルをドラッグして、Lambda関数の下にドロップします。
分岐条件の設定の「Choice Rules」のところは、まず「Rule #1」のリンクをクリックしてから「Add conditions」ボタンを押すと、以下のようなモーダルが表示されるので、先程の関数の返り値validated
で判定するように書きます。
Then next state is:
欄は一旦「新しい状態を追加」にします。
エラー発生時のメール通知
次は先程のChoiceステートでエラーと判定された(=Rule #1の判定が偽になった)場合の後段の処理を作ります。SNS Publishのパネルを左からドラッグドロップしてきます。
また右側のパネルで、以下操作をします。
- 状態名を入力
- SAMで作成したSNSトピックを選択
- メッセージ欄で以下JSONを入力
{ "Name": "$.Name", "AccountCreation": "false" }
- 「次の状態」で「最後に移動」を選択
また、エラーと判定された場合はステートマシン実行ステータスを失敗で終わらせたいです。左側パネルでフロータブを選び、FailのパネルをSNS Publishの後ろにドラッグドロップします。
処理成功時1 - DynamoDBのItem登録
Choiceステートで成功と判定された場合の処理は、①DynamoDBにItem登録、②SNSで処理成功の旨をメール送信でした。まずDynamoDBの設定をやっていきます。
左側パネルからDynamoDB PutItemをドラッグして、ChoiceのRule #1の先にある空欄にドロップしてください。
例のごとく右側のパネルで細かい設定をしていきます。
- 状態名を入力
- API Parametersに以下を入力
{ "TableName": "<テーブル名>", "Item": { "id": { "S.$": "$.Name" }, "mail": { "S.$": "$.Mail" }, "work": { "S.$": "$.Work" } } }
- 「次の状態」は(一旦)「最後に移動」のまま
処理成功時2 - メール通知
処理成功時のメール送信もSNSのPublishを使うので、先程作ったエラー発生時のメール通知のタスクとほぼ同じです。既存ステートの複製機能があるのでそれを利用しましょう。エラー発生時のメール通知のタスク「Send Faild Email」を2本指クリック(Macの場合です。Winならおそらく右クリック)して「状態を複製」を選択します。
作成された「Send Faild Email(1)」をDynamoDB PutItemのタスクの下にドラッグアンドドロップします。また右側のパネルで細かい設定をします。
- 状態名を入力
- Topic欄はそのまま
- メッセージ欄で以下JSONを入力
{ "Name": "$.Name", "AccountCreation": "true" }
- 「次の状態」も「最後に移動」のまま
ここまでできればワークフローが出来上がりですので、右上「次へ」から次に進みましょう。
生成されたコードを確認
ここで「次へ」ボタンを押して次に進もうとすると、日本語版コンソールを使っていた場合、以下のエラーが出ます。 SNS Publishのステートが2つありますが、そのParameters欄を確認してください。
"Parameters": { "Message.$": "$", "TopicArn": "arn:aws:sns:ap-northeast-1:0123456789012:sam-app-NotificationSNSTopic-xxxxxxxxx", "メッセージ": { "Name": "$.Name", "AccountCreation": "true" } },
SNS PublishのParametersには「メッセージ」というパラメーターは無いのでエラーになってます。
メッセージ
をMessage
に書き換えてください。"Message.$": "$",
を削除してください。
ステートマシン設定を指定
任意のステートマシン名を入力してください。他はデフォルトでOKです。
ここまででステートマシンが作成できました。
テスト
ステートマシン詳細画面右上「実行の開始」から実行のテストをしてみましょう。モーダルが表示されて入力値のフォームが出てきます。Lambda関数が真を返すにはName,Mail,Workプロパティが必要なので、例えば以下のような内容を入れます。
{ "Name": "Name Value", "Mail": "sample@classmethod.jp", "Work": "Work Value" }
まとめ
StepFunctionsの新機能Workflow Studioをご紹介しました。初めてStepFunctionsを触られる方にはとっつきやすくておすすめですし、慣れている方でもプロトタイプを作るのには適していると思います。また、Workflow Studioで作成しても結局はASL形式のコードが作成されるので、ざっくりWorkflow Studioで作ってから吐かれたコードを微修正していく、みたいな使い方もありではないかと思います。
There are a lot of great features on our roadmap for Workflow Studio.
とAWS Blogに書かれていましたので、今後もWorkflow Studioはますます便利になっていく模様です。楽しみですね。