Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Railsで4GBのデカ動画ファイルのアップロードと配信、どう実現する?
Search
Tomohiko SEO
November 08, 2024
Technology
1.2k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Railsで4GBのデカ動画ファイルのアップロードと配信、どう実現する?
Kaigi on Rails 2024事後勉強会
https://smarthr.connpass.com/event/331100/
でLTした内容です。
Tomohiko SEO
November 08, 2024
More Decks by Tomohiko SEO
See All by Tomohiko SEO
プログラミングが変える未来
asflash8
0
45
僕と小田原とRubyとRails
asflash8
0
150
Other Decks in Technology
See All in Technology
AI駆動で「他アプリの音を加工できる」アプリを作った
satomasahiro2005
0
110
遠藤な_めぐろLT #38 「社内のAI活用推進」@麻布台_20261009
endonanana
0
130
味覇で作るパスタが美味い - 20261001_yabaubuki.dev
livesense
PRO
0
130
しろおびから始める!ログ活用の第一歩
shumei_ito
0
940
USB PDを使ってスマホを労わりたい
raspython3
0
170
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
130
AIがコードを書く時代に、エンジニアは何で自分の価値を証明するのか / In an era where AI writes code how do engineers prove their value
carta_engineering
3
1k
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
0
190
10年後、Engineering 行為を剥奪されるとして、わたしたちは、どう、何を創ればいいだろうか。 / If Engineering Is Taken Away in 10 Years, How and What Should We Create?
bitkey
PRO
1
180
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
690
Code for Security プロジェクト紹介 2026年10月
yu23ki14
0
100
[JAWS-UG彩の国埼玉#12]そろそろ準備する?re:Invent2026をやさしく解説 / reinvent2026-sainokuni
sh_fk2
1
310
Featured
See All Featured
Become a Pro
speakerdeck
PRO
31
6.3k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
410
Product Roadmaps are Hard
iamctodd
55
13k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
300
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
780
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
480
The SEO Collaboration Effect
kristinabergwall1
1
590
Music & Morning Musume
bryan
48
7.4k
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
870
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
Paper Plane (Part 1)
katiecoart
PRO
2
12k
Transcript
Railsで4GBのデカ動画ファイルの アップロードと配信、どう実現する? 2024.11.08 Fri. Kaigi on Rails2024事後勉強会@SmartHR 瀬尾 智彦 SmartHR
プロダクトエンジニア
瀬尾智彦(theo)です。 2023年6月にSmartHR入社 スキル管理・学習管理というプロ ダクトの開発を担当しています。 Rails歴は12年くらい。 今日はプロポーザルを供養しにきました。
スキル管理・学習管理
https://smarthr.jp/function/skill/
https://smarthr.jp/function/learning/
「スキル管理」に学習の管理ができるフィーチャーを開 発することに。開発期間はおおよそ3ヶ月。 自前でスライドや動画の登録や配信ができる仕組みで 動画は1ファイル最大4GBまで扱えるようにしたい。 ※実際はもっと丁寧なコミュニケーションがありました
スキル管理に学習管理ができるフィーチャーを開発す ることに。開発期間はおおよそ3ヶ月。 自前でスライドや動画の登録や配信ができる仕組みで 動画は1ファイル最大4GBまで扱えるようにしたい。 ※実際はもっと丁寧なコミュニケーションがありました
最大4GB
落ち着いて状況を整理しましょう • スキル管理というプロダクトに新たなフィーチャーとして学習管理機能を作る • ユーザーが従業員の学習用にスライドや動画を登録・配信できるシステム • 動画の登録や配信はYouTubeなど外部サービスは利用せずに自前で作る • 開発期間はおおよそ3ヶ月 •
動画は1ファイルで最大4GBまで
動画は1ファイルで最大4GB
SmartHRって技術スタックが統一されているんですよね。 バックエンドはほぼすべてのプロダクトがRailsです。 動画を扱ったプロダクトが他にもあるかもしれない。
SmartHRって技術スタックが統一されているんですよね。 バックエンドはほぼすべてのプロダクトがRailsです。 動画を扱ったプロダクトが他にもあるかもしれない。 なかった😭
実現方法を考える
スキル管理には資格の証明書の写し(PDF or 画像) を保存する仕組みがあり、これを流用できないか?
スキル管理には資格の証明書の写し(PDF or 画像) を保存する仕組みがあり、これを流用できないか? Cloud Runにはhttp/1では最大リクエスト容量が32MBまでしか 受けられない制限が存在します。 https://cloud.google.com/run/quotas?hl=ja#request_limits
スキル管理には資格の証明書の写し(PDF or 画像) を保存する仕組みがあり、これを流用できないか? スキル管理ではサーバーにpumaを利用していて、http/2が利用 できません。nginxを前段に立てるなどすればhttp/2が利用でき ますが、なるべく既存のサーバー構成は変えたくない……。 ※後から気づいたのですがthrusterを利用するという手もあったかもしれません。
社内の有識者やGoogleのサポートエンジニアに相談
社内の有識者やGoogleのサポートエンジニアに相談 署名付きURL/Cookieを利用して、Cloud CDN経由でブラウザ からCloud Storageに直接アップロード&配信をする方式を採用 することにしました。
署名付きURL 署名付き URL は、リクエスト時における制限付きの権限と有効期限が設定された URL です。署 名付き URL のクエリ文字列には認証情報が含まれているので、認証情報を持たないユーザーで もリソースに対して特定の操作を実行できます。
https://cloud.google.com/cdn/docs/using-signed-urls?hl=ja 署名付きCookie 署名付き Cookie は、署名付き URL の代わりとなる手段です。アプリケーションでユーザーご とに数十、数百の URL に個別に署名するのが不可能な場合は、署名付き Cookie によってアク セスを保護できます。 https://cloud.google.com/cdn/docs/using-signed-cookies?hl=ja
ファイルアップロードをシーケンス図で書くと こんな感じです。 1. Rails(アプリケーションサーバー)で動 画ファイル管理用のデータを事前に作 成 2. Railsで署名付きURLを発行 3. ユーザー(管理者)がブラウザから直接
ファイルをアップロード 他にもなりすましを防ぐための仕組みを入 れたりしています。
before after
神資料 https://cloud.google.com/blog/ja/products/gcp/uploading-images-directly-to-clou d-storage-by-using-signed-url?hl=ja
これで4GBの動画ファイルでも無事にアップロードで きるようになりました。よかった。
これで終わりじゃなかった
ファイルは保存できるようになったが、Railsを経由 せずにストレージに保存するため、アップロードが終 わったかどうかを検知できない問題
ファイルは保存できるようになったが、Railsを経由 せずにストレージに保存するため、アップロードが終 わったかどうかを検知できない問題 💡Cloud StorageのfinalizeイベントトリガーでCloud Functionsを起動することでアップロードの検知できるようになり 解決
アップロード後処理をシーケンス図で書くとこ んな感じです。 1. Cloud Storage(GCS)からfinalize イベントをトリガーにCloud Functionsを起動 2. Cloud FunctionsからRailsに後処
理開始のリクエスト 3. Railsからステータス更新などの後処理 を実行 いきなり配信されないようにアップロード用と配信用 のバケットを分ける工夫をしています
これで動画アップロードの完了も無事検知できるよう になった。よかった。
これで終わりじゃな(ry
これでアップロードは検知できるようになったが、 ユーザーの環境に合わせて安全に動画を配信しなけ ればならない問題
突然ですが、動画の形式ってどのくらいあるかご存知 ですか?
コンテナとコーデック • 動画そのもの+音声+メタ情報をまとめたコンテナ(MP4とかWebMとか) • 動画を圧縮してエンコード・デコードするコーデック(H.264とかVP9とか) • 音声を圧縮してエンコード・デコードするコーデック(AACとか) MDN - ウェブ動画コーデックガイド
https://developer.mozilla.org/ja/docs/Web/Media/Formats/Containers
動画って200種類あんねん (CV:アンミカ)
動画のコーデックの深淵を覗いてしまった。 現時点で対応しているコンテナはMP4とMOVのみ。 コーデックは変換しないことに。 (興味がある方がいたら後でお話しましょう)
これでアップロードは検知できるようになったが、 ユーザーの環境に合わせて安全に動画を配信しなけ ればならない問題 配信そのものは署名付きCookieを利用して、CDN経由で CloudStorageから直接配信することで解決
署名付きURL 署名付き URL は、リクエスト時における制限付きの権限と有効期限が設定された URL です。署 名付き URL のクエリ文字列には認証情報が含まれているので、認証情報を持たないユーザーで もリソースに対して特定の操作を実行できます。
https://cloud.google.com/cdn/docs/using-signed-urls?hl=ja 署名付きCookie 署名付き Cookie は、署名付き URL の代わりとなる手段です。アプリケーションでユーザーご とに数十、数百の URL に個別に署名するのが不可能な場合は、署名付き Cookie によってアク セスを保護できます。 https://cloud.google.com/cdn/docs/using-signed-cookies?hl=ja 思い出すシリーズ
なぜ署名付きURLではなく、署名付きCookie? 署名付きURLだとつらいケースがあるからです。 HLSという動画配信の規格があり、雑に言うと動画ファイルを数秒単位で細かく分割し、順番に配 信していくことでネットワーク環境が悪い場合でも、快適に動画を視聴できること特徴です。 ファイルを分割して配信する関係で、ファイルごとに署名が必要になる署名付きURLとは相性が 悪く、将来的にHLSに対応することも考慮して、特定のパス配下のファイルは一括で署名してアク セス可能になる署名付きCookieを利用することにしました。
これで動画アップロード、完了検知、配信も無事できる ようになった。よかったよかった。
まとめ
• 巨大ファイルのアップロードやダウンロード は署名付きURL/Cookieを使おう • Railsは署名付きURL/Cookieの管理な ど適材適所で使おう
ありがとうございました! 今日の話の詳細を同じチームのメンバーがSmartHRのテックブログで公開しています! 学習管理機能の開発において使った技術 https://tech.smarthr.jp/entry/2024/07/31/171330