[アップデート]Step Functions Workflow Studioがリリースされて、ワークフロー作成が簡単になりました

2021.06.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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で作成して、リソース自体はあとから作成可能です。もちろん先に作っておいて選択することもできます。

元に戻す、やり直しが便利

undo-retry GUIのデメリットの一つとして、誤操作があると思います。ワークフローエリアで各ステートのパネルを誤って移動させてしまった場合などには、上部の「元に戻す」や「やり直し」機能があるので、こちらを利用して簡単に復旧することができます。

ブラウザバックしちゃダメ

ステートマシンの作成には、Workflow StudioでGUIでワークフローを作成するページ含め計4ステップの画面があります。途中で前の画面に戻って設定を修正したい場合は、必ず画面内の「戻る」ボタンを使ってください。ブラウザバックすると設定内容が飛んでしまいます… 私はWorkflow Studioでガッツリワークフロー作って次画面に遷移したあとにブラウザバックしてしまいました。。

やってみた

Workflow Studioについて書かれたAWS Blogで例として使われていたサンプルアプリケーションを私も構築してみようと思います。まずLambda関数を実行し、その返り値が真ならDynamoDBのItemを作成(PutItem)しSNSで処理成功の旨をメール送信します。もしLambda関数返り値が偽なら処理失敗の旨をメール送信します。

03_architecture_diagram

呼び出すリソースの作成

今回はステートマシン作成より前に、ステートマシンから呼び出す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のコンソールから「ステートマシンの作成」を選びます。「ワークフローを視覚的に設計」という選択肢が増えているのでそれを選択します。

sfn-create

Workflow Studioにやってきました! sfn-workflow-studio

Lambda関数

まずは最初のステートとしてLambda関数を設定しましょう。 左側のタスク一覧からLambdaのInvokeをドラッグしてワークフロー内にドロップします。

sfn-drug-drop

右側のフォームで、タスクの名前を設定(状態名)し、Function Nameで先程SAMで作ったLambda関数を選択します。 lambda-config

出力タブに移動します。このタスク結果の例が表示されてるやつ、助かりますね。関数の返り値はPayload以下に格納されます。

sfn-lanbda-output-example

今回は関数の返り値validatedがあれば十分なので、以下のように3点変更します。(関数のコードはこれです。)

  1. 一番下の「OutputPath で出力をフィルタリング」チェックを外します。
  2. その上の「入力と結果を ResultPath と組み合わせる 」にチェックを入れ$.Payloadと入力します。
  3. さらにその上の「ResultSelector を使用して結果を変換」にチェックを入れ以下のように入力します。
    {
       "validated.$": "$.Payload.validated"
    }

    sfn-lambda-task-output

ええと、この部分については少しStepFunctionsの仕組みを勉強しないと理解が難しいかと思います。詳しくは以下のブログがおすすめです。

もしくは、これも比較的最近の機能であるデータフローシミュレーターを使って色々試してみるのもおすすめです。

Choiceステート

次はLambda関数の結果を受けて分岐処理する部分を作成します。左側パネルのフロータブをクリックしてから、Choiceステートのパネルをドラッグして、Lambda関数の下にドロップします。

sfn-choice-drug-drop

次に右側のパネルで、まず状態名を入力します。 account-valid

分岐条件の設定の「Choice Rules」のところは、まず「Rule #1」のリンクをクリックしてから「Add conditions」ボタンを押すと、以下のようなモーダルが表示されるので、先程の関数の返り値validatedで判定するように書きます。 rule-1-modal

Then next state is:欄は一旦「新しい状態を追加」にします。

エラー発生時のメール通知

次は先程のChoiceステートでエラーと判定された(=Rule #1の判定が偽になった)場合の後段の処理を作ります。SNS Publishのパネルを左からドラッグドロップしてきます。 sfn-sns-error-drug-drop

また右側のパネルで、以下操作をします。

  • 状態名を入力
  • SAMで作成したSNSトピックを選択
  • メッセージ欄で以下JSONを入力
    {
      "Name": "$.Name",
      "AccountCreation": "false"
    }
  • 「次の状態」で「最後に移動」を選択

また、エラーと判定された場合はステートマシン実行ステータスを失敗で終わらせたいです。左側パネルでフロータブを選び、FailのパネルをSNS Publishの後ろにドラッグドロップします。

処理成功時1 - DynamoDBのItem登録

Choiceステートで成功と判定された場合の処理は、①DynamoDBにItem登録、②SNSで処理成功の旨をメール送信でした。まずDynamoDBの設定をやっていきます。

左側パネルからDynamoDB PutItemをドラッグして、ChoiceのRule #1の先にある空欄にドロップしてください。

sfn-ddb-drug-drop

例のごとく右側のパネルで細かい設定をしていきます。

  • 状態名を入力
  • API Parametersに以下を入力
    {
      "TableName": "<テーブル名>",
      "Item": {
        "id": {
          "S.$": "$.Name"
        },
        "mail": {
          "S.$": "$.Mail"
        },
        "work": {
          "S.$": "$.Work"
        }
      }
    }
  • 「次の状態」は(一旦)「最後に移動」のまま

処理成功時2 - メール通知

処理成功時のメール送信もSNSのPublishを使うので、先程作ったエラー発生時のメール通知のタスクとほぼ同じです。既存ステートの複製機能があるのでそれを利用しましょう。エラー発生時のメール通知のタスク「Send Faild Email」を2本指クリック(Macの場合です。Winならおそらく右クリック)して「状態を複製」を選択します。

workflow-studio-duplicate

作成された「Send Faild Email(1)」をDynamoDB PutItemのタスクの下にドラッグアンドドロップします。また右側のパネルで細かい設定をします。

  • 状態名を入力
  • Topic欄はそのまま
  • メッセージ欄で以下JSONを入力
    {
      "Name": "$.Name",
      "AccountCreation": "true"
    }
  • 「次の状態」も「最後に移動」のまま

ここまでできればワークフローが出来上がりですので、右上「次へ」から次に進みましょう。

生成されたコードを確認

ここで「次へ」ボタンを押して次に進もうとすると、日本語版コンソールを使っていた場合、以下のエラーが出ます。 message-is-not-supported 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です。 workflow-studio-example-step4

ここまででステートマシンが作成できました。

テスト

ステートマシン詳細画面右上「実行の開始」から実行のテストをしてみましょう。モーダルが表示されて入力値のフォームが出てきます。Lambda関数が真を返すにはName,Mail,Workプロパティが必要なので、例えば以下のような内容を入れます。

{
  "Name": "Name Value",
  "Mail": "sample@classmethod.jp",
  "Work": "Work Value"
}

正常終了したようです。 sfn-success

DyanmoDBにもデータ登録されていました! sfn-ddb

メールも無事届きました! sfn-sns

まとめ

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はますます便利になっていく模様です。楽しみですね。

あわせて読みたい

参考情報