[レポート] CTD302:Running Serverless at The Edge #reinvent

re:Invent2018の「CTD302 Running Serverless at The Edge」のレポートです
2018.11.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

サーバーレス開発部@大阪の岩田です。 この記事はre:Invent2018のCTD302 Running Serverless at The Edgeのレポートになります。

概要

以下が公式の概要となります。

AWS Lambda enables you to run code without provisioning or managing servers in an AWS Region. Lambda@Edge provides the same benefits, but runs closer to your end users, enabling you to assemble and deliver content, on-demand, to create low-latency web experiences. Come and join us for examples of how customers can move significant workloads they previously managed with server fleets to truly serverless website backends. Sentient Technologies, an artificial intelligence technology company, will share how they use Lambda@Edge for solving various use cases such as leveraging AI to improve customer engagement and uplift website conversions, and many more.

Lambda@Edgeを活用したオンデマンドのコンテンツ生成と配信についてのセッションです。 前半でLambda@Edgeの様々なユースケースを、後半で「Sentient Technologies」社の事例について共有して頂きました。

レポート(前半)

概要

サーバーレスとは

  • プロビジョニング不要
  • 利用度に応じてスケールする
  • アイドル時間に課金されない AWSはサーバーレスのパイオニア

サーバーレスアプリとは?

  • イベントドリブン 様々なイベントソースをサポートしている
  • Lambda@EdgeはCloudFrontをイベントソースとするLambdaと同じようなもの
  • us-east-1で作成する必要があるが、パブリッシュするとは全部のロケーションにLambdaがデプロイされる
  • なぜCloudFrontとLambda@Edgeを使うのか?

DeepDive

  • プログラミングモデル
    • OriginはS3,ELB、EC2,HTTPServer等がある
    • キャッシュミスのシナリオ
    • キャッシュヒット時のシナリオ
    • Lambdaが発火するトリガ
      • Viewerリクエスト
      • Originリクエスト
      • Originレスポンス
      • Vieweレスポンス
      • Originへのリクエスト、レスポンスははキャッシュヒット時には発生しない
    • サポートされている言語
      • 今の所Node.jsしかサポートされていない
    • event,context,callbackについて
      • eventオブジェクトがリクエストに関わる諸々の情報を保持している
      • eventのサンプル 画像入れる HTTPヘッダやクエリストリング等を保持
    • Example
      • アクセス元の国によって別のOriginに振り分ける例

ユースケース(セキュリティ)

  • Inject Sercurity Headers
    • CORS,HSTS,CSP等のHTTPヘッダをLambda@Edgeで調整する
  • Securely access origin
    • 有料コンテンツへのアクセス制御
    • Presigned URLもしくはPresigned Cookieを使い、OriginはS3のOAI利用もしくはHTTPのカスタムヘッダでアクセスを制御
  • Stateless Authorization
    • viewerリクエストをトリガにJWTで認証認可する例
    • 処理をエッジにオフロードできるのでスケールしやすくなる
  • Stateful Authoirization
    • 外部サービスと組み合わせた認証認可の例

ユースケース(コンテンツ管理)

  • コンテンツの変更
    • template rendering
      • 動的なコンテンツ生成
      • DynamoDB等から取得したデータでコンテンツを動的に生成する
    • Website Personalization
      • OriginへのリクエストをトリガーにLambdaを実行
      • アクセス元のCountry Codeを見てリダイレクトする例
    • Dynamic Image Manipulation
      • PC、スマホ、タブレット、それぞれのデバイス向けに最適化された画像ファイルがなければ生成して保存
    • Visitor Prioritization
      • Cookieを見てバックエンドを振り分け
    • Cache key custmization
      • トラッキングのためにユーザーごとにURLは変えるけど、キャッシュは共通化したいようなケースでURLを書き換えて共通化することでキャッシュヒット率を向上させる。

ユースケース(ルーティング)

  • Content Based Routing
  • Data locality /LowLatence
    • OriginのS3バケットを振り分け
  • A/Bテスト
    • Cookie見てA環境とB環境に振り分け
  • Search Engine Optimazation
    • BotかリアルユーザーかでOriginを変更
  • Originフェイルオーバー
    • 先週ローンチされた新機能
    • 自動的にOriginをフェールオーバーさせる

レポート(後半)

ここからスピーカーが交代し、Sentient Technologiesの事例について

古いやり方

  • 元々は7つのリージョンにコンテナやElasti Cacheのクラスタを配置して運用していた
  • それを2つのLambda@Edgeに置き換えた
    • レイテンシが下がった
    • スケールも簡単になった
    • コストも下がった

Lambda@Edgeの利用例

  • Bot検出の例
  • コンテンツネゴシエーション
  • 100万/分のアクセスを捌くアーキテクチャの紹介
  • CloudFront -> Lambda@Edge -> CloudWatch -> Kinesis Data Firehose -> Lambda -> S3 -> Athena
    • 上記アーキテクチャにおけるTIPS
    • Lambda@EdgeのTIPSについて

まとめ

Lambda@Edgeの基本からユースケースまで分かりやすく網羅されていました。 個人的にはLambda@Edge->CloudWatch Logs->Kinesis Fire Hose->S3->Athena というデータの流し方が新鮮でした。 単にキャッシュヒット率を向上させる以外にも色々な応用が考えられるのがおもしろそうです。 こういったLambda@Edgeを応用したアーキテクチャについても考察していきたいと思います。