Serverless Architectureの可能性を広げる新サービス AWS Step Functions ~ AWS re:Invent Day4

こんにちは。ma2k8です。

今回のre:Inventで発表された新サービスの中で、個人的に一番テンションがあがったAWS Step Functionsについて紹介させていただきます。なお、本記事内のスライド画像は以下セッションものです。

CMP319 – NEW LAUNCH! Building Distributed Applications with AWS Step Functions

AWS Step Functionsとは?

screen-shot-2016-12-02-at-8-06-35-pm-thumb

ビジュアルワークフローを使用して分散アプリケーションを構築するツールです。TaskにLambda関数を定義できる点がすごく良いと思いました。

AWS Step functionsの利点

img_0393-thumb

生産性 分散コンポーネントとMicroServiceを接続して連携させることにより、
簡単にアプリケーションを作成できる
俊敏性 問題の切り分けとデバッグの迅速化により、変化に適応することができる
弾性 サービス調整のインフラとオペレーションを管理することにより、
スケール時や異常終了時の可用性を確保できる

指定できるStep

img_0399-thumb

Task 実行単位 ここでLambda関数やActivity ( 後述 ) を指定する
Choice 条件分岐
Parallel 並列処理
Wait 待ち ( 秒、日時での指定が可能 )
Fail 異常終了
Succeed 正常終了
Pass 処理をパス
InputのデータはOutputへそのまま渡される

条件分岐、並列処理もサポートしているようです。また、TaskではRetryCatchも定義できました。Serverlessを組む際に悩みがちな制御をStep Functionsへ委譲できそうです。

Activity

TaskではLambda関数以外にActivityと呼ばれるものが指定可能でした。Step Functions用の長時間実行用のWorkerを用意して実行するというものです。

セッションではTaskは Poll(Activity) or Push(Lambda) という紹介がされていました。ActivityはAWSへ接続できればどこでも良いので、オンプレにおけるのも大きな利点になりそうです。

img_0400-thumb

Worker上で実行するコードは以下の流れを無限ループで常駐させていました。

  1. ActivityのARNを指定してgetActivityTaskでStep Functions上のActivityを捕捉
  2. 行いたい処理を実行
  3. sendTaskSuccess|sendTaskFailureで処理結果をActivityへ送信

基本的にStep Functions側からActivityを実行する方法は用意されていないようなので、Wokerは常時実行が想定されているようです。LambdaでECSのコンテナを立ち上げるようなコードを書いてActivityの前のTaskとして定義してあげれば都度実行も可能でしょう。

例えば、Lambdaには実行時間が短いという制限があることからSQSのポーリングなどには不向きでしたが、Activityであれば行うことができます。

  • Taskの最大実行時間は 1年
  • Lambdaの最大実行時間は 300秒

Activityの作成手順はチュートリアルが公式ドキュメントにあったのでそちらをご参照ください。

screen-shot-2016-12-05-at-5-00-01-am

上記作成手順を基にWokerを起動しない状態でActivityのタイムアウトを指定して試してみました。StateMachineのステータスがTimeoutとなり、やがて起動するとSuccessになることが確認できました。

制限

アカウント制限

アカウントごとのStateMachine及びActivity数 10,000
APIコールリミット スパイクが頻繁に発生したときや、あまりに短時間での多数の実行の場合は制限される場合がある1)ドキュメント上では明確な数値の定義はされていませんでした。
リクエスト最大容量 1MB

実行制限

最大同時実行数 1,000,000
最大実行時間 1年
実行履歴の最大サイズ 25,000イベント
最大idle時間 1年 (実行時間によって制御される)
実行履歴の保持期限 90日

Taskの実行制限

Taskの最大実行時間 1年 (実行時間によって制御される)
Taskをキューに保持する最大時間 1年
オープンなActivity数 1,000 per execution(実行予定、実行中の数)
最大input/outputのデータサイズ 32,000 characters

スロットリング制限

前述のサービス制限に加え、Step Functionの特定のAPIコールはトークンバケット方式を使用してサービス帯域幅を維持するために抑制されます。なお、スロットリング制限はアカウント/地域ごととなります。

throttling-limits

料金

  • 毎月4,000回の状態遷移まで無料
  • その後は1,000回の状態遷移ごとに$0.025

利用可能リージョン

us-east-1 米国東部(バージニア北部)
us-west-2 米国西部(オレゴン)
eu-west-1 EU(アイルランド)
ap-northeast-1 アジアパシフィック東京

東京が対応しているのはうれしいですね。

試してみた

Lambda関数作成からStep Functions実行までの手順はAWSブログをご参照ください。

まとめ

Serverlessでサクッとやれることの幅がかなり広がりそうですね!このサービスは以下の点において最高だと思いました2)他にもまだまだあると思いますが

  • 単純なwait時に発生する実行時間の問題をWaitStepで解決
  • ポーリング系処理をはさむ際の実行時間の問題をServerありきなActivityで解決
  • フロー制御をInput/Outputをつなぐ処理をjsonで定義できるようにして解決
  • 並列処理制御をParallelStepで解決
  • それぞれのMicroServiceが接続先を意識しないといけない問題をChoiceStepで解決

Serverless Architectureを加速させてくれる存在になってくれそうで楽しみです!

脚注

脚注
1 ドキュメント上では明確な数値の定義はされていませんでした。
2 他にもまだまだあると思いますが