2018-12-25

Why Serverless? (ShanonAdventCalendar2018・22日目)

皆さんこんにちは。シャノンの開発エンジニア輝です。

AWS の lambda をご存知でしょうか?

AWS のサービスとして lambda を提供し始めてから、serverless architecture がますます話題になってきました。「AWS lambda はサーバーをプロビジョニングしたり管理する必要なくコードを実行できるコンピューティングサービスです。」という定義になり、最初はNodejs、あとはJava/Pythonなどの言語をサポートするようになりました。 nodejs でコードを書いて、リソースを作って、イベントが飛んでくるときに、予め作っておいたAWS lambda アプリケーションを AWS で実行できます。実行完了になったら、リソースが解放されます。lambda の実行は実行時間(timeout)と最大メモリ消費量の制限があります。なぜこのような制限されたサービスはこんなに人気がありますか?私が把握している限り、理由は3つがあり、1:安い、2:インフラの管理が不要、3:スーパースケール能力 のためです。

lambda を使ってイベント駆動仕組みを実現する

サーバー・サイドでは、多くの処理はイベントを処理するものです。

例えば:
・URIに対するリクエスト(ウェブページを開き、ボタンを押す)
・ユーザがログインした時にメールアドレスにメールを送信する
・ユーザがアップロードした画像ファイルのサイズを調整する
・ログファイルに 500 internal error が連続で発生した時に指定したメールアドレスに送信する
・データベースにデータが変更した時に実行する処理

実際に、イベントを処理する時に、また新しいイベントを発行する場合もあります。システムを設計する場合、データの流れとイベントの流れ、及びそれを処理するプロセスを整理できれば基本設計ができると思います。ウェブシステムでイベント駆動の分散システムを設計する場合、MQをベースにするものが多いです。既存のインフラの上に、イベントを管理・処理するBroker(MQ)とWorker(イベントを処理するプロセス)を追加する必要があります。もし AWS のサービスを使用している場合だと、SQS を Broker として、EC2 を Worker とする仕組みを作成できます。このような仕組みでは、もしイベントの生成するスピードが消化する処理スペードより遥かに速い場合、auto scaling groupを使ってqueueのサイズをscale up / downしたりする必要があります。これは面倒くさいだけではなく、一部のリクエストのDelayに対して特に厳しい場合は、EC2の起動時間が長すぎて向きません。
lambda を使用すれば、このような問題を解決できます。lambda は container の中で実行するため、起動スピードはとても速くて数十ms/数百msで済みます。あと、それがあるイベントでトリガーできるため、異なるコンテキストでも呼び出すことができます。MQ + worker の代わりに SNS(kenisis) + lambda を使って実現できます。

そのため、サーバー・サイドのイベント処理仕組みは下記のように改造できます:

・URI に対するリクエスト(ウェブページを開き、ボタンを押す)
 API gateway + lambda
・ユーザがログインした時にメールアドレスにメールを送信する
 メール送信処理は lambda で実現する
・ユーザがアップロードした画像ファイルのサイズを調整する
 S3 の Object Create Event の受けて lambda で画像を処理する
・ログファイルに 500 internal error が連続で発生した時に指定したメールアドレスに送信する
 kinesis でログを管理する場合、lambda で kinesis stream を使う
・データベース(例:dynamodb)にデータが変更した時に実行する処理
 dynamodb + lambda


lambda を使ってビッグデータを処理する


lambda のオートスケール能力を生かして、大量データの map/reduce を実現できます。ある lambda 関数から別の lambda 関数にデータをアサインできるので、大量の同じ実装のlambda 関数を実行できます。例えば、S3 に過去の一年間に一時間毎に生成したログ・ファイルを保存しています。これらの大量データを(security auditのためとか)集計する場合に、一日分のログ・ファイルを10個の lambda 関数で同時に実行してやれば、数百の lambda 関数を同時に実行して、一分以内で完了できます。もしこの作業を EC2 でやれば色んな設定が必要ですごく面倒な作業になってしまいます。


A Serverless Framework


最後に、1つの Serverless Framework をご紹介します。どうぞお試しください。
https://github.com/serverless/serverless

0 件のコメント:

コメントを投稿