s3とsnsで動画機能をつくる話
TRANSCRIPT
![Page 1: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/1.jpg)
S3 と SNS で動画機能をつくる話株式会社 Timers CTO椎名アマド
![Page 2: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/2.jpg)
椎名アマド株式会社 Timers Co-founder & CTO 28 歳趣味:サバゲー、 PS4(FPS, Minecraft) 、映画創業: 2012/05
![Page 3: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/3.jpg)
カップル専用アプリ Pairy
![Page 4: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/4.jpg)
子育て夫婦アプリ Famm
![Page 5: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/5.jpg)
https://aws.amazon.com/jp/solutions/case-studies/timers/
![Page 6: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/6.jpg)
動画のはなし
![Page 7: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/7.jpg)
今までのバイナリ(写真)の投稿方法
![Page 8: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/8.jpg)
Client Server AWS S3DB
HTTP Req: Upload* [binary file]* [metadata]
save [metadata]
save [binary file]
HTTP Response
![Page 9: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/9.jpg)
バイナリが Client -> App -> S3 と二度転送されるのはムダ(特に動画みたいな大きなバイナリの場合)
![Page 10: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/10.jpg)
直接 Client から S3 にアップロードしよう
![Page 11: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/11.jpg)
S3.putObject()
SNS Notification (HTTP)
S3 MetaData
STS.getFederationToken()
バイナリを S3 にアップロード
メタデータを渡したいから、putObject() 時にくっつける
putObject() が完了したらApp に HTTP 経由で通知
Client に直接認証情報を置かなくていいようにトークン発行
必要なもの
![Page 12: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/12.jpg)
Client Server AWS S3DB
save [metadata]
S3 PutObject [binary file] (with metadata)
[token]HTTP Req: getToken
SNS notification[metadata]
Push Notification
![Page 13: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/13.jpg)
$result = $s3->putObject(array( 'Bucket' => $bucket, 'Key' => $keyname, 'SourceFile' => $filepath, 'ContentType' => ‘video/mp4‘, 'ACL' => ‘private’, 'Metadata' => array( ‘video_date' => 1326190210, )));
Client :メタデータ付きで putObject
![Page 14: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/14.jpg)
S3 : putObject() したら SNS 通知
![Page 15: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/15.jpg)
$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 に保存
![Page 16: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/16.jpg)
$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 権限を付与
![Page 17: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/17.jpg)
アップロード完了!
![Page 18: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/18.jpg)
Client Server AWS S3DB
save [metadata]
S3 PutObject [binary file] (with metadata)
[token]HTTP Req: getToken
SNS notification[metadata]
Push Notification
![Page 19: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/19.jpg)
動画投稿まわりで他に考えたところ
![Page 20: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/20.jpg)
private object には、preSignedUrl を生成してアクセス
動画閲覧
![Page 21: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/21.jpg)
動画本体と全く同じロジック※ どの動画のサムネイルかがわかるように、MetaData に動画固有 hash を追加
動画サムネイル
![Page 22: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/22.jpg)
multipart-upload は SNS 通知が個別でバラバラに来るから注意※ サムネイルと同じく hash を追加することで同一の動画であることを判別
multipart-upload
![Page 23: S3とSNSで動画機能をつくる話](https://reader036.vdocuments.pub/reader036/viewer/2022062823/5875f1921a28ab006e8b503d/html5/thumbnails/23.jpg)
Thank you