ドワンゴ 坂井様 ws-summit-tokyo-2016...ドワンゴはオンプレだけでなく、aws...
TRANSCRIPT
Born in the net, Connected by the net
ドワンゴがAWSで メディアストレージ基盤を開発してみた
ニコニコ統括事業本部 フロンティア開発部 第二セクション 坂井 薫平
Born in the net, Connected by the net
このセッションは
の提供でお送りします
Born in the net, Connected by the net
ドワンゴアドベントカレンダー2015の初日の記事についてのお話
http://qiita.com/namusyaka/items/e805d1098827a4bd6835
Born in the net, Connected by the net
自己紹介名前: 坂井 薫平
所属: 株式会社ドワンゴ フロンティア開発部
職種: インフラエンジニア兼アプリケーションエンジニア
趣味: OSS。Padrino・Grapeメンテナ
Born in the net, Connected by the net
自己紹介名前: 坂井 薫平
所属: 株式会社ドワンゴ フロンティア開発部
職種: インフラエンジニア兼アプリケーションエンジニア
趣味: OSS。Padrino・Grapeメンテナ
Born in the net, Connected by the net
フロンティア開発部
Born in the net, Connected by the net
簡潔にいうと、新規プロダクトを ガンガン作ってリリースしていく部署
Born in the net, Connected by the net
部署の軌跡
2015年 2月 部署発足
2015年10月 プレゼン共有サービス「ニコナレ」 リリース
2016年 4月 N高等学校 関連システムリリース
Born in the net, Connected by the net
新規プロダクトを 効率良く開発していくためには
何が大事か
Born in the net, Connected by the net
車輪の再発明を防ぐこと
Born in the net, Connected by the net
サービスを開発するにあたって 必要となってくる一連の処理を、チームを問わず使えるように共通化・基盤化する
Born in the net, Connected by the net
AWSをつかって実現してみた
Born in the net, Connected by the net
本題
Born in the net, Connected by the net
メディアストレージ基盤?
Born in the net, Connected by the net
メディアファイルに関連する 一連の処理を共通化するための
ストレージ
Born in the net, Connected by the net
メディアファイル画像ファイル
PDFファイル
音声ファイル
動画ファイル
Born in the net, Connected by the net
これらのファイルのアップロード・変換処理・配信を一手に引き受けたい!
Born in the net, Connected by the net
イメージ図
Born in the net, Connected by the net
イメージ図
基本的にユーザーからのアップロードを受け付け、validation・変換を終え配信状態にあるファイルのURLを
基盤の利用サービスに通知するという流れ
Born in the net, Connected by the net
メディアストレージ基盤内の独自概念・処理内容について見ていきましょう
Born in the net, Connected by the net
ジョブアップロード権限の発行時に内部的に作成するファイル変換・配信処理の取り扱いのための情報群の名称。 DynamoDBを使って管理が行われる。 すべての処理はこのジョブという概念をベースに行われる。
Lambda
各種EC2DynamoDB
Born in the net, Connected by the net
ジョブを扱うためにDynamoDB用ORMを
開発してみた
Born in the net, Connected by the net
Ruby製 DynamoDB ORM 「dinamo」 https://github.com/namusyaka/dinamo
Born in the net, Connected by the net
メディアストレージ基盤が 採用しているOSS
Grape (API) dinamo (ORM) rabl (View) shoryuken (SQS) aws-sdk-ruby (All)
Born in the net, Connected by the net
メディアストレージ基盤が 採用しているOSS
Grape (API) dinamo (ORM) rabl (View) shoryuken (SQS) aws-sdk-ruby (All)
Lambda以外は全てRuby!
Born in the net, Connected by the net
アップロード権限の払い出し
Born in the net, Connected by the net
アップロード権限の払い出し
AWS独自のSTSと呼ばれる仕組みを用い、一時的に特定のS3バケットの特定のキーにのみアップロードできるテンポラリクレデンシャルを払い出す(フェデレーティッドユーザー)。
本基盤では、アップロード用のS3を配信用のものとは別に用意しており、アップロードユーザーはそのS3へアッ
プロードする権限を一時的に手に入れる。
Born in the net, Connected by the net
画像ファイルの処理の流れ
Born in the net, Connected by the net
画像ファイルの処理の流れ
アップロード用S3にファイルがアップロードされると、S3 Notificationにより同期的にLambdaを起動する
Lambda上ではアップロードされたファイルの数バイトを読み込み、ファイルのヘッダに含まれる情報からvalidationを行う。問題がなければ配信用S3にファイルをコピーする。
Born in the net, Connected by the net
PDFファイルの処理の流れ
Born in the net, Connected by the net
PDFファイルの処理の流れ
Lambda上でvalidationを行うまでは画像ファイルと同様の処理。 validation後にはジョブを一意に特定する情報をメッセージとしてSQSにenqueueする。
独立して稼働しているバッチサーバはSQSをポーリングしており、enqueueされたメッセージを取り出し、アップロードされたファイルを取得。再度validationを行い、pdfを画像に切り分けて配信用S3にコピーする。
Born in the net, Connected by the net
音声ファイルの処理の流れ
Born in the net, Connected by the net
音声ファイルの処理の流れ
ジョブを一意に特定する情報をメッセージとしてSQSにenqueueするところまでは、PDFと同様。
バッチサーバ上でenqueueされたメッセージをSQSから取り出し、ファイルのvalidationを行う。
validation通過後はElastic Transcoderにジョブを作成し、本基盤の利用サービスが期待する音声ファイルにエンコードを行い、配信用S3上にファイルを出力させる。
Born in the net, Connected by the net
動画ファイルは音声ファイルと ほぼ同様の扱いのため割愛
Born in the net, Connected by the net
利用サービスへの通知の流れ
Born in the net, Connected by the net
利用サービスへの通知の流れファイルの種類によって、通知イベントを発火させる場所が異なってくる。 本基盤では、どの通知イベントについてもジョブを一意に特定する情報をメッセージとしてSNSにpushする。 SNSは予めsubscriptionとして登録されている本基盤の通知用サーバのエンドポイントにメッセージを送信する。
通知用サーバはそれを受けて、利用サービスへ通知を行う。
Born in the net, Connected by the net
ファイル配信の流れ
Born in the net, Connected by the net
ファイル配信の流れ
すべてのファイルはCloudFrontを 経由して配信される。
原則的にはoriginに設定されたS3のファイルを返す。
特定のプレフィックスが付与されているケースでは、 サムネイル作成サーバのLoadbaracerに対しリクエストが移譲され、適宜画像変換処理を施した上で返す。
Born in the net, Connected by the net
ほかにも様々な機能をaws-sdkで実装してみた
リトライAPI サスペンドAPI プライベートコンテンツ配信API
Born in the net, Connected by the net
リトライAPI
処理がなんらかの理由で成功しなかったジョブ向けのAPI
AWS::Lambda::Client#invoke
Lambda起動のタイミングから処理をやり直す。
Born in the net, Connected by the net
サスペンドAPI
ファイルの配信を停止するためのAPI
特定ファイルをS3からバックアップ用S3に退避させる。
同じタイミングでCloudFront Invalidationを実行する。
Born in the net, Connected by the net
プライベートコンテンツ配信API
読んで字の如く、プライベートなコンテンツの配信機能。 CloudFront 署名付きCookie & URLの活用。
Born in the net, Connected by the net
絶賛稼働中
Born in the net, Connected by the net
この基盤を使って開発された プロダクトを紹介
Born in the net, Connected by the net
プレゼン共有サービス
http://niconare.nicovideo.jp/
Born in the net, Connected by the net
N高等学校 https://nnn.ed.jp/
Born in the net, Connected by the net
どちらもAWS上で運用。 もちろんメディアストレージ基盤をガンガン活用中!
Born in the net, Connected by the net
AWSをつかってみて
Born in the net, Connected by the net
よかった点AWSのリソース・サービスを活用すれば、この規模のものでも一人で設計・開発・運用ができる。 オンプレよりも融通が利くため、インフラの変更が容易。 EC2を使わず、AWS フルマネージドなサービスを用いることでコストの大幅削減が可能。 アプリケーション担当者がインフラに触れるハードルが大きく下がった。
Born in the net, Connected by the net
よかった点Multi-AZなどを用いることで可用性・耐障害性が容易に担保できる。
サポート体制が充実している。
各種リソース・サービスに対応したSDKが提供されている。
Born in the net, Connected by the net
苦労した点サーバレスなアーキテクチャを実現するにはAWS固有のリソース・サービスへの理解・前提知識が必要となるため、事前の学習は必須。
アプリケーションエンジニアがインフラに触れる際のハードルは大きく下がるがVPC・ネットワーク周りなど、その分野に対する知識は必要(その学習コストを削減するようなものではない)。
Born in the net, Connected by the net
苦労した点フルマネージドサービスを前提としたアプリケーションのテスト実装は今後も課題。サードパーティ製のモックだと厳しいものがある。
CloudFormationについては整備が足りてない部分も。
今回aws-sdkをフルに活用したが、ドキュメントからは読み取れない部分もいくつかあった。実際の検証が大事。
Born in the net, Connected by the net
さいごにドワンゴはオンプレだけでなく、AWSもどんどん活用しています。
この基盤は作者である私が新卒1年目にひとりで勝手に設計して作った物。新卒・新人にもチャンスはたくさんある!