(レポート) ARC308: The Serverless Company Using AWS Lambda #reinvent

2015.10.09

こんにちは、せーの@ラスベガスです。Re:Invent2015現地よりセッション「The Serverless Company Using AWS Lambda」をレポート致します。

このセッションの目標

このセッションは「どうすればLambdaを使ってリアルタイムアプリケーションを作れるのか」について学びます。

最初はインフラから始まった

最初はサーバーにインスタンスを立てるスタイルでした。アプリケーションの管理、スケールはdeveloperが管理する必要がありました。

arc308_1

コンテナを最初にデプロイすることで早く簡単にスピンアップ、ダウンが出来るようになりました。

arc308_2

そのうちみんなが気にしているのはアプリケーションコードだけで他のことは気にしたくない、ということに気が付きました。そこでサーバーレスの登場です。

arc308_3

lambdaとは

Lambdaの特徴

  • イベント・ドリブンでサーバーレス
  • 新しいイベントが走るとキャパシティのプロビジョニングはAWSがする。
  • 1秒以下の課金ができる。イベントが走らない間は課金はされない。

labmdaは沢山の言語をサポートしたいと思っています。現在はnode.js、 java、 scalaをサポートしています。

ユーザーが気にすべきこと

  • メモリだけ管理する必要がある。
  • 起動パス、同期、非同期関わらず
  • IAMによるきめ細かい権限調整
  • lambdaはstateless。共有することがないので素早いスケールが可能になる

データプロセスアーキテクチャ

サーバーを使った場合

arc308_4

  • ソースデータ - 様々なものがある
  • サーバーのフリート群にキュー形式でリクエストし、内部で更に後ろにリクエストを行う
  • オートスケールを管理する

サーバーレスになったら

arc308_5

  • Lambdaにリクエストをなげるだけ

事例紹介 - PlayOn!

PlayOn!とは高校生にスポーツのストリーミングを使ってもらうためのサービスです。 例えば金曜の夜300名の高校生があるサッカーの中継を配信し、2万人が見る、というようなことを簡単に可能にします。

従来のアーキテクチャ

arc308_6

  • RTMPからHLSに変換
  • オンデマンドではディスクを沢山使う
  • ライブ配信なのでエラーは許されない

課題

  • RTMPでは難しいのでHLSのストリームが好ましい
  • ビデオをWebで見る時にデバイスにあったビットレート変換が必要
  • スタートアップなのでコストを削減する必要がある

新しいアーキテクチャはLambdaベース

arc308_7

  • 10秒のかたまりの動画を管理する
  • Lambdaは「今ない機能」をすぐに付け足す事ができる。新しい機能が必要になったらこの下に新たなLambdaをつけるだけ

感想

  • Lambdaは使いやすい。時間はほとんどかからなかった。
  • 小さなストリームでしか使っていない。大きなストリーム、複数のストリームの場合はどうなるのか、Lambdaが終わらなかった場合はどうなるのかはわからない。
  • S3よりSNSを使ったほうが効率が良かった
  • コストは一桁くらい違う

リアルタイムデータプロセッシングワークフロー

ここからはリアルタイムにデータを動かす方法を色々と考えていきます。

サンプル

arc308_8

S3からイベント通知でLambdaをキックします。その後は何をしたいかみなさん次第です。加工をしてS3に戻しても良いですし、DynamoDBにデータ形式を整えて保存しても良いのです。 サムネイル、crop, watermark、他のビデオチャネルを作ることもできます。ログデータであれば圧縮することもできます。 全てのファイルのインデックスを作り、つまりS3からmetadataをlambdaで取ってファイルの重複の検知、圧縮を行ったりします。 S3のデータが動画ならLambdaを使って加工することができます。その場合Tipsとしてファイルをローカルディスクに一時的に書きます。なぜならffmpegを使うのにはローカルでしかできないからです。

ストリームのデータプロセッシング

arc308_9

KinesisのストリームからLambdaをキックします。リアルタイムデータを加工してRedShiftに流したり、エラーとなっているデータをSNSで通知したりもできます。

DBデータをトリガーにしたワークフロー

arc308_10

DynamoDB StreamsからLambdaをキックします。データの移行記録が書かれているのでそれから色んなアプリをアンロックすることができます。データをDynamoDBにクロスリージョンでレプリケートしたり、分析用にRedshiftに流したりします。

メッセージデータをハンドリングする

arc308_11

SNSからlambdaをキックすることによりトピックごとにユーザーごとにカスタマイズします。 全てのデータをkinesisに流します。またLambdaを使って分類、フィルタリングして重要なものだけをKinesisに流すこともできます。

CRUDのバックエンドシステム

arc308_12

スロットリング、認証、キャッシングを行ってLambdaに引き渡します。データストアはファイルベースでもDBでも、両方でも構いません。モバイルのバックエンドのソリューションとしても使えます。 S3をstaticなwebサイトとして公開し、Webサイトにアクセスした時だけ課金されるような仕組みが作れます。

このようにLambdaは色々なアクションから起動することができます。

arc308_13_before

Lambdaを使ったTips & Tricks

監査をかける

arc308_14

例えばこのユーザーはこの時間に読む権限がある、IAMのcredentialsを書き換える等AWSへのアクセスデータを見ながら柔軟に権限を変更することが出来ます。

インフラを自動管理する

arc308_15

特定のインスタンスの様子をCloudWatchで監視し、それによりLambdaが別のコンテナを開始することでECSサービスをオートスケーリングさせたり、様々なAPIをコールすることができます。

外部サービスのエンドポイントをコールする

arc308_16

AWS環境の監視状況によりLambdaをキックし、そこからIFTTTのMaker channelが使えます。 これによりIFTTTを通じてオンプレ環境に何かを返すこともできます。

新たなLambdaをデプロイする

arc308_17

Github repoからのcommitをフックして新しいLambda functionをデプロイできます。また自身をアップデートすることも可能です。

他にも

  • Lambdaの中で任意のバイナリを組み込む
  • コンテナ環境に押し出しECSを作成

など、様々な方法でLambdaを使用することができます。

まとめ

いかがでしたでしょうか。Lambdaの様々な活用事例を見て新たなアイデアが膨らみそうですね。