読者です 読者をやめる 読者になる 読者になる

プログラマでありたい

おっさんになっても、プログラマでありつづけたい

SWF ✕ Lambda

AWS Advent Calendarの7日目で、全部オレの7日目です。

 サーバーレス・アーキテクチャの重要な要素の1つが、Lambdaです。Lambdaは、イベント駆動でプログラムを実行するコンピュート基盤です。ユーザは、自分でサーバを管理しなくてもプログラムを実行できるため、ビジネスロジックに集中できるというメリットがあります。また、API Gatewayの登場によりHTTP Requestからの実行が容易になり、モバイルやIoTなどのバックエンジンの中核を担うようになりつつあります。

Lambdaに複雑な処理をさせたい場合



 一方で、Lambdaには幾つか課題があります。複雑な処理をしたい場合、実行時間の制約や処理の責務の分割を考えると幾つかのLambdaに別ける必要が出てきます。その際は、Lambdaの多段(カスケード)実行という形になります。イメージ湧きにくいと思うので、reInventのとあるセッションで出てきたLambdaを使ったシステムのアーキテクチャの例です。様々なイベント(直接コール、S3 Putイベント、SNS通知)からLambdaを呼ばれ、またLambda自身からもLambdaをコールしています。

f:id:dkfj:20151007151925j:plain

 自分で設計した場合、上記の例と同じようになってしまうため、よい設計例がないかreInventでLambdaやサーバレス・アーキテクチャのセッションを受けまくっていました。しかし、どれも同じような内容でした。運用保守を考えると、Lambdaの多段実行はかなり辛いのではと思います。なぜならば、途中で処理が終了した場合の追跡と再実行が困難だからです。
 個人的には、LambdaからSQSのPull型の実行ができれば80%くらいは解決できるのではと思っています。しかし、現時点では、Lambdaの対応リストにSQSはありません。とすると、SWFを使うしかないかという結論です。

SWF



 Simple WorkFlow(SWF)は、AWSのサービスの中で1,2位を争うややこしいサービスです。ややこしいのですが、SQSの上位互換で色々なことができます。例えば、下記のような例です。

  • タスクリストからのポーリング実行
  • 逐次処理/並列処理
  • 並列処理の終了を待って実行
  • 処理結果により分岐して実行

 詳細は、SWFのBlackBeltを参照してください。

www.slideshare.net

 ちなみにAWS界隈でも、SWFを喜々として使っていたのは@c9katayama氏と@tottokug氏しか知りません。reInventでも数多くのセッションを直接見て、その他のセッションの資料を読みましたが、SWFの文字を発見することは叶いませんでした。ということで、人類にSWFは早すぎたのではと少し疑っています。

SWF Flow Framework



 そんなSWFですが、Lambdaと連携可能になっています。ということで、試そうとしたのですが現時点でLambdaを利用可能なのはAPI経由もしくはJava版のFlow Frameworkだけです。Flow Frameworkとは、SWFのAPIをラッパーして使いやすくしたフレームワークで、Java版とRuby版のみ提供されています。正直、SWFはFlow Frameworkを使わないと面倒くさくてやってられません。また、Java版も随分とJavaを使っていない人間にはかなり辛いです。ちなみに過去にSWF Flow FrameworkのJava版を使ってハンズオンが開催されたことがあって、参加者の半分近くが環境のセットアップまででタイムアップしてしまったという話を聞いたことがあります。
 Ruby版のFlow Frameworkの使い方は、こちらをご参照ください。 www.slideshare.net

 

まとめ



 すいません。実装含めて紹介しようと思ったのですが、そこまで至れませんでした。Ruby版のFlow Frameworkを使えばすぐに出来ると油断していました。後日、再度アップします。もしかして、ついにSWFの時代が来るのかもしれません。

プログラマになりたい Advent Calendar 2015 - Adventar
プログラマになりたい Advent Calendar 2015 - Qiita
AWS Advent Calendar 2015 - Qiita