ブログ

ryuzeeによるブログ記事。不定期更新
アジャイル開発に取り組むチーム向けのコーチングや、技術顧問、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください(初回相談無料)

AWSを使ってスライドを公開するデモアプリを作ってみた話

なんか色々思いついたのでデモアプリを作ってみました。実際に動作しているデモは https://slide.meguro.ryuzee.com/ にあります。

ソースは以下に置いてあります。あくまでサンプルの延長線上なのでValidationが緩かったり、あぶない実装があったりするかもしれませんのでその点はご了承ください。なお、動かすためには、最低でもAmazon S3Amazon SQSが必要です。サーバについては自身の端末でVagrantを使って動作させることもできます。

  • ソース:https://github.com/ryuzee/open-slideshare
  • 開発環境(VagrantやChefのクックブックなど一式):https://github.com/ryuzee/open-slideshare-environment

アーキテクチャー

AWSを使う前提になっていて、以下のようなアーキテクチャーになっています。

  • スライド(パワーポイントやPDF)は、サーバではなく、直接Amazon S3にアップしています。ここではSignature V4のAPIを使って、S3に直接アップロードするためのフォームを生成しています。
  • こうしている理由は、一旦ファイルのアップロードをサーバ側にしてしまうと、そのサーバに状態を持つことになり、Auto Scalingしにくかったり、そもそも同時に多数のアップロードがあった場合に、サーバ側の負荷が高くなりやすいという問題を回避するためです。
  • Amazon S3へのアップロードではAjaxを使っていますが、CORSの制約を外すために、Amazon S3のバケット側での設定が必要です。
  • Ajax経由でのアップロードが完了すると、Amazon S3はステータスコード201を返します。これを受けてjavascriptでゴニョゴニョします。Ajaxを使っていない場合は、success_action_redirectというパラメータを設定してあげることで、アップロード処理の完了後に自動的に指定したURLにリダイレクトすることができます。
  • アップロードが終わると、スライドの変換処理を行ないますが、ここでは、変換のリクエストを蓄積するのにAmazon SQSを使っています。つまり非同期でキューに変換リクエストを溜めておき、ワーカープロセスがそのキューを順番に処理していくというアーキテクチャになります。こうすることでワーカーのサーバだけをたくさん横に並べたりといったスケールアウトが簡単にできるようになります。
  • 実際の変換処理では、OpenOfficeやxpdf、unoconvなどオープンソースのコマンド類をキックしています。そしてスライドの各ページを1枚ずつの画像に変換し、Amazon S3の変換ファイル保存用のバケットにアップロードします。この際、変換した画像は何回でも作り直せるので、低冗長化オプションを使うことで、料金を減らすようにしています。また併せて一覧表示用のサムネイルも生成してアップロードしておきます。
  • アプリケーションのセッション情報は全てMySQLに保存します。

このようにすることで、Webサーバ側では、状態を全く持たないため、負荷に応じてWebサーバの台数を簡単に増やせます。また、そもそもスライド閲覧用のデータは全てAmazon S3側においてあるので、負荷をオフロードするとともに、データの耐久性が向上しています。またキューを使って変換プロセスを疎結合化することで、この部分のスケーラビリティも向上しています。

(お約束ですが、この投稿はぼくが所属する会社とは関係ありませんー)