AWS Step Functionsを使ってみた

ワークフローシステムではTreasure Data社のDigdagを利用したことがあったのですが、Step Functionsの提案なんかもあったので、ちょっと使ってみました。使い道としてはLambdaは5分制限があるので、それを回避することも考えられますね。

##やりたいこと
・Step Functionsを使う
・Lambdaを呼ぶ

##前提
私のように初心者が初めて作るという方を前提としています。
Lambdaはある程度わかっていること。ちなみに私は実案件で使ったことないので、その程度で大丈夫です。

##すごく単純なフロー
こちらを作成します。単純に1Lambdaを実行させるだけです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/8918c6d7-1af4-4025-7ca3-61ba9e0e2146.png)

##1.LambdaのIAMロールを作成
Lambdaを作成するにはLambda用のロールを作成しとかないといけないので、まずは作成します。すでにロールがある場合は不要です。
IAMのサービスを開き、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/40d8f782-9029-8fab-7035-dc9c7a1770bf.png)

ロールタブからロールの作成をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/1a8cb74b-fd93-975d-6dfe-d84f012dbba0.png)

AWSサービスをクリックして、このロールを使用するサービスを選択で、Lambdaを選んで次のステップとします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/def671fa-9918-aac2-7177-37af0b76f514.png)

ポリシータイプは何も選択せずに次へのステップとします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/ec92a71b-9d46-d6c9-417f-b148bbd0fb18.png)

ロールの名前は適当に決めて、OKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/08a63061-ff83-a88c-7e4b-4a77b562c0ee.png)

##2.Lambdaを作成
Lambda関数を作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/c9752208-4c4d-a05d-1afa-1a6ecf5e8904.png)

関数の作成をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/6dc061a7-f760-1120-d06a-58ad27bca9c5.png)

関数の名前はなんでもよいです。ランタイムはNode.js 6.10、ロールはデフォルトの既存のロールのままで、既存のロールに上で作成したロールを設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/6e046d74-773f-45ef-3654-2e3d4d57450f.png)

Lambdaの画面ですが、トリガーは何も設定しません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/c6a4c668-cda6-bccf-cc54-89423c4f0ecd.png)

下の方のコードを以下のように書き換えます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/58c563ec-6eb1-7660-37a0-5d4ab29e7080.png)

##3.Step Functionsの作成
Step Functionsのステートマシンを作成します。ステートマシンとはまぁ簡単にいうとワークフローです。ワークフローを作成しますといっても同じです。JSONベースで出来ています。

検索からサービスを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/ac52d33e-99d7-b84a-5645-c0d05e3dda8b.png)

ステートマシンを初めて作る場合はこのような画面が表示されるので、「今すぐ始める」ボタンを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/a1aa9bcf-49f2-6671-abee-b8109018ade4.png)

ステートマシンの名前を付けます。ワークフローの名前ですね。とりあえず「HelloWorldStateMachine」と付けました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/5ec92aed-e259-bbf3-263a-68931a20b34d.png)

設計図では「Hello World」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/236507c4-8366-9cf5-a7d3-f2891fb91f81.png)

コードは以下のように設定します。
・Type→Taskに変更
・Result→Resourceに変更
・値を先ほどlambdaで作ったarnに変更
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/7d2ab9f4-3891-8321-ed87-e713176491d5.png)
arnはResultをResourceに変更して、値のところをクリックすると候補がいくつか出てくるので、関数名で判断できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/c8cd44fc-0b32-5f7a-109a-e1401a318774.png)

ビジュアルワークフローは以下のようになります。
今回は関数を呼び出しているだけのシンプルなワークフローです。
AWS Glueでも思ったのですが、ビジュアルワークフローからコードが生成されるとかなり使いやすいんですけどね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/8171097c-7ce1-a2e1-3d92-1376d6a1ca86.png)

すべて完了したら「ステートマシンの作成」ボタンを選択します。
実行ロールが自動作成されるため、デフォルトでOKを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/043d9002-818d-6192-fc82-895b2590fbd6.png)

##4.実行
新しい実行を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/a66ae374-edcb-656b-3113-bbbac0ba2ee1.png)
入力を修正して実行！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/1eda70f6-4b63-ca46-4fe9-124a074cda08.png)
実行の詳細で出力タブを確認すると、Lambdaで設定したcallbackが返ってきていることがわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/a6131e27-ecfa-73ff-f982-04b4dcad63ed.png)

##まとめ
今回は単純なフローを作成しましたが、次は分岐があるフローやもう少し意味のあるLambdaで試してみたいです。
参考：
[チュートリアル：Lambda ステートマシンを作成する](http://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/tutorial-creating-lambda-state-machine.html)
[AWS Step Functionsチュートリアル実践：Lambdaステートマシンの作成と実行 #reinvent](https://dev.classmethod.jp/cloud/aws/aws-step-functions-tutorial-lambda-state-machine/)