s3とsnsで動画機能をつくる話

Post on 11-Jan-2017

4.189 Views

Category:

Engineering

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

S3 と SNS で動画機能をつくる話株式会社 Timers CTO椎名アマド

椎名アマド株式会社 Timers Co-founder & CTO 28 歳趣味:サバゲー、 PS4(FPS, Minecraft) 、映画創業: 2012/05

カップル専用アプリ Pairy

子育て夫婦アプリ Famm

https://aws.amazon.com/jp/solutions/case-studies/timers/

動画のはなし

今までのバイナリ(写真)の投稿方法

Client Server AWS S3DB

HTTP Req: Upload* [binary file]* [metadata]

save [metadata]

save [binary file]

HTTP Response

バイナリが Client -> App -> S3 と二度転送されるのはムダ(特に動画みたいな大きなバイナリの場合)

直接 Client から S3 にアップロードしよう

S3.putObject()

SNS Notification (HTTP)

S3 MetaData

STS.getFederationToken()

バイナリを S3 にアップロード

メタデータを渡したいから、putObject() 時にくっつける

putObject() が完了したらApp に HTTP 経由で通知

Client に直接認証情報を置かなくていいようにトークン発行

必要なもの

Client Server AWS S3DB

save [metadata]

S3 PutObject [binary file] (with metadata)

[token]HTTP Req: getToken

SNS notification[metadata]

Push Notification

$result = $s3->putObject(array( 'Bucket' => $bucket, 'Key' => $keyname, 'SourceFile' => $filepath, 'ContentType' => ‘video/mp4‘, 'ACL' => ‘private’, 'Metadata' => array( ‘video_date' => 1326190210, )));

Client :メタデータ付きで putObject

S3 : putObject() したら SNS 通知

$head = $this->client->headObject(array( 'Bucket' => $bucket, 'Key' => $object));$meta_data = $head['Metadata'];$video_date = $meta_data['video_date'];

/* insert into DB */$sql = “INSERT INTO video SET object_path=‘$object’, video_date=‘$video_date’”;$mysqli->query($sql);

SNS 通知された Request :メタデータを拾って、それを DB に保存

$policy = array( 'Statement' => array( 'Sid'=> ‘user1’, ’Effect'=>'Allow', 'Action'=> ‘s3:putObject’, ‘Resource’=> ‘arn:aws:s3:::bucket/user1/*’));$result = $sts->getFederationToken(array( 'Name'=> user1’, 'DurationSeconds' => 3600, 'Policy'=> json_encode($policy)));

Federation Token :対象ユーザーのディレクトリ以下のみにputObject 権限を付与

アップロード完了!

Client Server AWS S3DB

save [metadata]

S3 PutObject [binary file] (with metadata)

[token]HTTP Req: getToken

SNS notification[metadata]

Push Notification

動画投稿まわりで他に考えたところ

private object には、preSignedUrl を生成してアクセス

動画閲覧

動画本体と全く同じロジック※ どの動画のサムネイルかがわかるように、MetaData に動画固有 hash を追加

動画サムネイル

multipart-upload は SNS 通知が個別でバラバラに来るから注意※ サムネイルと同じく hash を追加することで同一の動画であることを判別

multipart-upload

Thank you

top related