LoginSignup
4
0

More than 3 years have passed since last update.

CloudFrontの署名付きURLをLambda@Edgeで発行する妄想

Last updated at Posted at 2019-12-16

はじめに

こちらはミクシィグループアドベントカレンダー17日目の記事です。

家族アルバム みてねというサービスの開発・運用を行っている尾関と申します。

今回は、全世界向けのサービスをAWSの単一リージョンで運用していることによる課題と、その解決案についてお話します。
あくまでまだ案レベルで本番導入する予定もないものですが、どなたかの参考になればと思い記事に残すことにしました。

「家族アルバム みてね」

スマホで撮った子どもの写真や動画をかんたん共有、整理できるアプリです。
今年はGoogle Playのベストアプリで2部門受賞しました。超おすすめです。

みてね年賀状という別アプリと連携して、年賀状もかんたんに作成できるので、まだ書いてないよ!という方にもおすすめです。

課題

みてねでは、ユーザーさんがアップロードした写真・動画はすべて東京リージョンのS3に保存されています。
これらはCloudFront経由で配信していますが、プライベートなコンテンツなので、家族内でしか見ることはできません。
また、家族の中でも公開範囲を分けることができ、誰が見ることができるかという情報はコンテンツ毎に違います。
通常は家族全体・夫婦のみの2種類ですが、プレミアム会員に入ると、任意のグループを作ることができます。便利ですね。ぜひプレミアム会員になってくださいお願いします。

話がそれてしまいましたが、公開範囲の制限をどうやっているかというと、下記のようなシンプルな実装になっています。

  1. 端末からみてねサーバのAPIにリクエスト
  2. DBにある権限管理テーブルを参照し、問題なければAPIがCloudFrontの署名付きURLを返す
  3. 端末から署名付きURLにリクエストを送り、写真を取得する

さて、みてねというサービスはグローバルに展開しており、海外からのアクセスだと、署名付きURLを発行するために遠く離れた日本のリージョンにアクセスしなければなりません。
こちらについてはフロントにキャッシュをOFFにしたCloudFrontを置くことで、ネットワークの最適化は図っていますが、それでもやはり物理的に遠いことは変わりありません。
こちらの資料でそのあたりの話に触れていますが、今ならGlobalAcceleratorがより便利に使えるかもしれません。

また、こちらの資料にあるようにバックグラウンドで先読み&端末にキャッシュしているため、ユーザーへのストレスはかなり軽減されているのですが、まだキャッシュされていないユーザーにとっては表示までにかなりの時間がかかってしまっているのが現状です。

また、膨大な画像・動画を扱っているため、この署名付きURLの発行処理というのがみてねのAPIの中で最も大きい処理となっており、全体の約3割を占めています。(NewRelicのMost time consumingにて計測)

解決案

AWSのLambda@Edgeという、CloudFrontのエッジロケーション上でLambda関数を実行するサービスがあります。
こちらで署名付きURLを発行する関数を用意すれば、ユーザーさんからのリクエストはエッジロケーションで返すことができ、ネットワークの距離の問題も解決しつつ、高負荷かつ重要な機能をより安定したインフラに移すことができ、結果的にシステム全体の安定性を上げることができそうです。

まとめると下記のメリットがあります。

  • 物理的な距離が近くなることでレイテンシが下がり、ユーザーからのレスポンス時間短縮
  • 高負荷な処理がスケールされやすくなり、急なアクセス集中にも耐えやすくなる
  • メインのAPIがメンテナンス状態でも写真だけは閲覧可能な仕組みを構築可能

いい事尽くめではないでしょうか

課題

一方、課題ももちろんあります

  • 認証はどうするか?
  • コストが余計にかかるのでは?

認証については、署名付きURLを発行する前にメタデータをAPIから一度取得しており、その時点で権限を持っていることが保証されています。ただし、写真毎に公開範囲を変更できるので、署名付きURLを発行する時点での権限は保証されません。この時点での権限の確認をどう行うかは課題となります。
AWS Cognitoという、AWSが提供するサインアップの仕組みがその解決策になりうるかもしれません。要検証です。

次にコストについてですが、これも余分にかかることは容易に予想できます。さらに言うと、AWS Cognitoを使うならそのコストも加わってきますので、コストに見合うことを説明する必要がありそうです。やはりこれもなかなか難しい課題です。

実装してみる

課題はいろいろありますが、Lambda@Edgeの実装を試してみたいと思います。

・・・と言いつつ、本当は署名付きURLを発行するところまで実装して記事にするつもりでしたが、自分の努力不足により間に合いませんでした。
言い訳すると、今週からオフィスが移転して浮かれていました。本当に申し訳ありません。

後日実装して追記します。

最後に

こんな中途半端な記事を読んでいただいてありがとうございました。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0