AWS Step Functions がAPI Connectorsの実装でLowCodeになったので触ってみる

# Low-Code/No-Code Advent Calendar 2018

みなさんこんにちは。

本記事は、[「Low-Code/No-Code Advent Calendar 2018」](https://qiita.com/advent-calendar/2018/lowcodenocode)の18日目の記事です。

今回は、Amazon Web Services上のサービスである「Step Functions」について間単に触ってみたいと思います。

# Step Functions とは

[AWS Step Functions (分散アプリケーションとマイクロサービスの構築) | AWS](https://aws.amazon.com/jp/step-functions/)

AWS の複数のサービス処理を、ビジュアルフローとして定義できる管理サービスです。１関数ごとの処理が比較的短めで、ともするとロジックの全体像が分かりにくくなりがちなサーバレスアプリケーションにおいて、
全体のロジックをわかりやすく管理できるメリットがあります。
主にシステムのバックエンド側の処理に用いられるもので、例えば

1. バッチ処理の管理
2. Webサービスの内部処理
3. チャットボットの内部処理

などなど。様々な場面で利用できます。 

# Low Code?

Low-Code/No-Codeの文脈で言うと、Low Codeに分類されます。
下記のように、各処理の定義の設定は、状態を記述するASLという独自仕様の言語(JSONフォーマット)で記述します。
例えば[Node-Red](https://nodered.org/)のような、ビジュアルなパーツを繋ぐような機能は、現時点ではありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47081/2edab484-437f-3814-2f15-9acd75cc546f.png)

また、パーツとなる各処理についても、実際の処理内容については、別途定義されたLambda FunctionなどをARN(リソースのID)で指定して呼び出す必要がありました。


# AWS Step Functionsのアップデート

re:Invent 2018にて、Step Functionsが新たに8つのマネージドサービスと連携可能になることが発表されました。

1. クラメソさんのブログ　[[神アップデート]Step Functionsが新たに8つのマネージドサービスと連携可能になりました！ #reinvent ](https://dev.classmethod.jp/cloud/aws/step-functions-8-service/)
2. Amazon 公式のブログ　[New – Compute, Database, Messaging, Analytics, and Machine Learning Integration for AWS Step Functions](https://aws.amazon.com/jp/blogs/aws/new-compute-database-messaging-analytics-and-machine-learning-integration-for-aws-step-functions/)
 
# 何ができるようになったの？

何か新しいサービスができたわけではなく、特定のAWSサービスを、Lambda 無しで操作(一部)できるようになっただけです。

統合できるAWSサービスは、下記ドキュメントに記載があります。

[AWS Step Functions 開発者ガイド - Step Functions でサポートされる AWS サービス統合](https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/connectors-supported-services.html)

本記事執筆時点では、re:Invent発表時点と同様、下記のサービス(の一部操作)が対象です。なお、元々は１．のAWS Lambdaファンクションのみでした。

1. AWS Lambda
2. AWS Batch
3. Amazon DynamoDB
4. Amazon ECS/Fargate
5. Amazon SNS
6. Amazon SQS
7. AWS Glue
8. Amazon SageMaker

# 触ってみる

AWSのコンソールにサインインした状態であれば、サンプルを間単に試すことができます。下記の例では、東京リージョンで実行しています。

[AWS Step Functions](https://ap-northeast-1.console.aws.amazon.com/states/home?region=ap-northeast-1#/homepage)

「今すぐ始める」ボタンから、新たにサンプルのプロジェクトを作成してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47081/38621896-31c3-42cc-4ec2-77dcf933d948.png)

サンプルプロジェクトからの作成を選び、「データレコードの転送」というプロジェクトを選択します。下のほうに今から作るプロジェクトの定義が表示されます。詳細は後で確認するので、「次へ」で進みます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47081/1839ae5d-212b-fa8a-26e3-d12df07838ca.png)

選択したサンプルを、実際の環境で使えるようにデプロイ(配備)します。サンプルで作られるリソースを確認すると、Lambda 関数のほかに、SQSのキューとDynamoDBのテーブルも作成されることがわかります。
今回、Lambda関数を介さなくても利用できるのは、この２つのリソースになります。

「リソースのデプロイ」を実行すると、CloudFormationが実行されて、実際のリソースが展開されます。数分待ちましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47081/d18452db-8bb9-ae07-cdc5-0133004de17e.png)

数分待つと、Step Functionsのコンソールに、１つステートマシンが作成されているのが確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/47081/07f0617e-5344-08ae-8bda-6e86906115f8.png)


中を開いて、「定義」を確認してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/47081/c014035a-398b-581c-d616-59f6a50d5a21.png)


まず最初のステート「"Seed the DynamoDB Table"」ですが、こちらは、サンプルのためのテーブルを作る処理で、従来通りにLambda関数を呼び出しています。
指定しているARNの部分も、別途定義済みのLambda関数を呼び出す、標準的な形式のARNですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47081/07204657-5cb9-4602-bcf5-ff08be947095.png)


一方、DynamoDBから値を読む「"Read Next Message from DynamoDB"」とSQSキューにメッセージを送る「"Send Message to SQS"」の処理では、“MagicARN”形式と、付随するパラメーターの指定になっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47081/0b26d74c-9660-09f4-544d-54704c63316b.png)


実際に実行してみます。結果を見ると、「"Read Next Message from DynamoDB"」のステップで、DynamoDBから読み取ったデータがJSON形式で表示されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47081/2ded9107-9967-b026-13c5-848ec9c683ad.png)


パラメーターの指定だけで、Lambda関数を介さなくても、DynamoDBやSQSとデータのやり取りができていることが確認できます。

# まとめ

Low Code/No Codeの観点から見ると、だいぶCode寄りのサービスではありますが、
コードの記述量を減らし、アプリケーションの改修速度を向上させることができる、非常に素晴らしいアップデートだと感じました！

まだまだ統合サポートされているAPIやサービスの数は少ないですが、今後の拡充に期待したいところです。
チャットボットや、VUIサービスのバックエンドに使って、開発効率を上げていきたいと思います。