Slide 1

Slide 1 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 1 FastlyとfalcoでNode.jsレスな Webサーバーの構築 : IPTV版 ABEMAアプリのインフラ刷新 2024-08-27 Tadahiro Noguchi Muddy Web #9

Slide 2

Slide 2 text

AbemaTV, Inc. All Rights Reserved
 野口 直寛 (Noguchi Tadahiro) 2018年新卒入社 株式会社AbemaTV Web-based TV チーム所属 Web 技術を使用したスマートテレビ (IPTV) 上で動く ABEMA アプリの 開発を行っています.特にパフォーマンスの改善を主務として担当し ています. 趣味は旅行,ダイビング,スキーです.最近北極に行きました. 2 Profile @nodaguti

Slide 3

Slide 3 text

AbemaTV, Inc. All Rights Reserved
 3 1. ABEMA と IPTV について 2. インフラ構成の問題点と解決策 3. Fastly と falco の導入 4. 導入の効果 5. 導入における muddy なできごと INDEX

Slide 4

Slide 4 text

AbemaTV, Inc. All Rights Reserved
 ABEMA と IPTV について 4

Slide 5

Slide 5 text

AbemaTV, Inc. All Rights Reserved
 ABEMA 紹介 5 テレビ × ビデオのハイブリッド型 24 時間 365 日完全編成型リニア配信と 見逃しや限定コンテンツを 登録不要で好きなタイミングに視聴できるビデオ配信を 楽しむことができます。 国内最大級のオリジナルエピソード数 オリジナルエピソード数は国内発の動画サービスで日本 No.1 ※ を誇り、 総エピソード数は常時約 30,000 本以上を配信しています。 ※ 2024 年 1 月時点、自社調べ 100%プロコンテンツ サイバーエージェントとテレビ朝日 それぞれの強みを活かした制作体制で 高品質なコンテンツを配信しています。 多彩なラインナップ 24 時間編成のニュース専門チャンネルをはじめ、 オリジナルのドラマや恋愛番組、アニメ、スポーツなど、 多彩なジャンルの約 20 チャンネルを 24 時間 365 日放送しています。

Slide 6

Slide 6 text

AbemaTV, Inc. All Rights Reserved
 ABEMA 紹介 6 複数デバイス対応・多彩なチャンネルラインナップ

Slide 7

Slide 7 text

AbemaTV, Inc. All Rights Reserved
 ABEMA 紹介 7

Slide 8

Slide 8 text

AbemaTV, Inc. All Rights Reserved
 IPTV とは 8 大きく4種類に分類できる ABEMA 対応のテレビデバイス ※1 ● ソニー BRAVIA ● シャープ AQUOS ● パナソニック ビエラ / プライベート・ビエラ / 4KDIGA ● 三菱電機 REAL ● 船井電機 FUNAI ● Hisense ● 東芝 REGZA ● TCL ● アイリスオーヤマ LUCA ● Fire TV ● Apple TV ● Chromecast ※1: https://help.abema.tv/hc/ja/articles/360013743211 ● Web-based TV ○ Linux を搭載し,Web 技術を使ってアプリケー ションを構築できるテレビ ● Android-based TV ○ Android OS を搭載し,Android 技術を使ってア プリケーションを開発できるテレビ ● Apple TV ● Chromecast

Slide 9

Slide 9 text

AbemaTV, Inc. All Rights Reserved
 Panasonic の開発者向けサイトでは, IPTV App を Panasonic の HTML5 SDK を使って開発可能であると読み 取れる記述がある Panasonic サイトには HTML5 / IPTV の文字 IPTV とは 9 (株)ACCESS が開発している Webkit / Chromium ベースの ブラウザ NetFront Browser が搭載されている Web-based TV はブラウザを搭載 REGZA X9400 取扱説明書より引用 https://www.regza.com/tv/lineup/x9400 https://developer.vieraconnect.com/

Slide 10

Slide 10 text

AbemaTV, Inc. All Rights Reserved
 IPTV とは 10 ● IP (Internet Protocol) 技術を使ってビデオコ ンテンツをテレビへ提供する技術 ● 日本では一般社団法人 IPTVフォーラムが IPTV サービスの仕様策定を行っている ● IPTV サービスとして ABEMA を提供する ためのテレビ向けアプリケーション ● ターゲットとなるテレビにはブラウザが搭載 されている IPTV版 ABEMA とは IPTV とは

Slide 11

Slide 11 text

AbemaTV, Inc. All Rights Reserved
 インフラ構成の問題点と解決策 11

Slide 12

Slide 12 text

AbemaTV, Inc. All Rights Reserved
 改善前の構成図 12 ● クライアントからのリクエストを Node.js で 受ける ● Node.js は HTML を動的生成して返却 ● HTML には Cloud Storage の URL で JS/CSS/画像のアセットが記載される ● クライアントはアセットを Cloud Storage から直接取得してアプリを起動する クライアント Node.js Cloud Storage リクエスト HTML JS/CSS/画像

Slide 13

Slide 13 text

AbemaTV, Inc. All Rights Reserved
 旧構成の問題点 13 ● Node.js が直に露出していることによる運用コスト ○ 負荷対策・セキュリティ対策 ● Cloud Storage が直に露出していることによる運用コスト ○ 負荷対策・セキュリティ対策 ● パフォーマンス ○ HTML / アセットが gzip 等で圧縮されていない ○ Node.js の物理的位置が固定されている CDN を導入して解決を図ることにした

Slide 14

Slide 14 text

AbemaTV, Inc. All Rights Reserved
 問題点の解消 14 ● Node.js が直に露出していることによる運用コスト ○ 動的生成していた HTML は,実は事前に静的ビルドできた ○ アプリ全体を静的生成して Cloud Storage から配信することで Node.js をなくせる ○ 動的生成部分のロジックは CDN のエッジで処理し,ファイルの出し分けを行う ● Cloud Storage が直に露出していることによる運用コスト ○ 前段に CDN を置くことで quota に抵触するリスクを排除 ○ Cloud Storage は private object にして CDN 以外からアクセスできないようにする ● パフォーマンス ○ CDN で透過的に gzip/br 圧縮をできるため,ビルド設定を複雑にせずに改善可能 ○ 地理的位置も最適なエッジサーバーが自動的に選択されるようになる

Slide 15

Slide 15 text

AbemaTV, Inc. All Rights Reserved
 改善後の構成図 15 ● クライアントからのリクエストを CDN で受ける ● CDN で静的ファイル出し分けのロ ジックを実行し,ファイルを返却 ● キャッシュになければ Cloud Storage から取得して CDN 経由で返却 クライアント CDN Cloud Storage HTML/JS/CSS/画像 HTML/JS/CSS/画像 リクエスト リクエスト

Slide 16

Slide 16 text

AbemaTV, Inc. All Rights Reserved
 Fastly と falco の導入 16

Slide 17

Slide 17 text

AbemaTV, Inc. All Rights Reserved
 Fastly の選定 17 ● すでに Web Browser で Fastly の契 約があり,相乗り可能 ● VCL でエッジにロジックを乗せられる ○ Compute@Edge は契約なし ● コードの正しさをどう担保するか ○ 公式の自動テスト基盤がない ○ ローカルで Fastly VCL を実行で きない ■ ローカル環境では Node.js でロジックを再現する必要 がある 懸念点 Fastly 選定の理由

Slide 18

Slide 18 text

AbemaTV, Inc. All Rights Reserved
 懸念点への対応 : falco の導入 18 ● ysugimoto さんが個人で開発してい る Fastly VCL の開発補助ツール ● 独自のパーサーを実装 ● Linter, Formatter, Simulator, Debugger, Unit Testing, REPL falco とは

Slide 19

Slide 19 text

AbemaTV, Inc. All Rights Reserved
 画像 19 https://speakerdeck.com/ysugimoto/getting-robust-vcl-with-falco ysugimoto さんによる falco の紹介 @ Fastly User Meetup

Slide 20

Slide 20 text

AbemaTV, Inc. All Rights Reserved
 20 https://github.com/fastly/vscode-fastly-vcl/ 公式提供の VSCode 拡張機能にも組み込まれている

Slide 21

Slide 21 text

AbemaTV, Inc. All Rights Reserved
 Unit Testing 21 サブルーチンごとにテストを書ける dev / prd 向けそれぞれにテストを実行

Slide 22

Slide 22 text

AbemaTV, Inc. All Rights Reserved
 Linting 22 ファイルごとに lint を実行

Slide 23

Slide 23 text

AbemaTV, Inc. All Rights Reserved
 Simulator を使ったローカルサーバーの構築 23 ● falco simulate で VCL を指定して 起動すると,レスポンスを受け付け てくれるようになる ● override_backends で Cloud Storage をローカルの静的ファイル 配信に置き換える

Slide 24

Slide 24 text

AbemaTV, Inc. All Rights Reserved
 ローカル環境の構成図 24 ● Fastly を falco でシミュレート ● Cloud Storage を http-server でシ ミュレート ● http-server で max-age=0 を指定 して,falco のキャッシュを無効化し て Hot Reload が効くようにする クライアント falco http-server HTML/JS/CSS/画像 HTML/JS/CSS/画像 リクエスト リクエスト

Slide 25

Slide 25 text

AbemaTV, Inc. All Rights Reserved
 導入の効果 25

Slide 26

Slide 26 text

AbemaTV, Inc. All Rights Reserved
 オリジンへのリクエスト減少 26 キャッシュヒット率 100%を達成

Slide 27

Slide 27 text

AbemaTV, Inc. All Rights Reserved
 パフォーマンスの向上 27 起動時間が 0.7秒短縮

Slide 28

Slide 28 text

AbemaTV, Inc. All Rights Reserved
 リリース手順の簡略化 28 ● Node.js サーバーをデプロイする手順が不要になった ● 一回のリリースにかかる時間は30分から15分と半分に短縮

Slide 29

Slide 29 text

AbemaTV, Inc. All Rights Reserved
 導入における muddy なできごと 29

Slide 30

Slide 30 text

AbemaTV, Inc. All Rights Reserved
 Fastly の VCL アップロードの仕組み構築の話 30 ● VCL アップロードは公式で 4通りサポートされているが,どれも一長一短 ○ Web UI ■ 手作業が必要 ○ Fastly CLI ■ サービスバージョン管理や差分アップロードは自前で構築する必要あり ○ Fastly API ■ サービスバージョン管理や差分アップロードは自前で構築する必要あり ○ Terraform Provider ■ Terraform の運用が必要 ● 今回は Fastly API を使って自前でアップロード用スクリプトを TS で作成した

Slide 31

Slide 31 text

AbemaTV, Inc. All Rights Reserved
 Fastly の VCL アップロードの仕組み構築の話 31 ● npm に fastly パッケージがあり Fastly API をラップしてくれている ○ https://www.npmjs.com/package/fastly ● しかし ○ 型がない ○ GitHub Copilot でうまく補完してくれない ■ メソッド名も引数も存在しないものを提案してくる ○ 公式ドキュメントもパラメータの説明が不足している

Slide 32

Slide 32 text

AbemaTV, Inc. All Rights Reserved
 Fastly から GCS private object へ接続する方法の話 32 ● Fastly のドキュメントに HMAC key を使って認証を行う方法が書かれている ○ https://docs.fastly.com/en/guides/google-cloud-storage ● 認証方式の違い ○ HMAC v2 と v4 がある ○ Fastly は v2 メイン,Cloud Storage は v4 メインで解説していて微妙に情報が噛み 合わない ● AWS 互換モード ○ Fastly のドキュメントをそのまま適用すると AWS S3 互換モードとなる ○ Cloud Storage から返ってくるヘッダーが X-Amz-Meta- など AWS 互換に

Slide 33

Slide 33 text

AbemaTV, Inc. All Rights Reserved
 おわりに 33

Slide 34

Slide 34 text

AbemaTV, Inc. All Rights Reserved
 おわりに 34 ● アプリケーションの静的生成と Fastly 導入 ○ Node.js サーバーを廃止できた ● falco のローカル環境導入 ○ Fastly 上で動かす VCL と同じものをローカルで動かすことができる ○ 安心してデプロイできる環境を構築できた ● 一石三鳥の効果 ○ パフォーマンス ○ セキュリティ ○ 開発生産性

Slide 35

Slide 35 text

AbemaTV, Inc. All Rights Reserved
 中途採用再開しました! 35 https://hrmos.co/pages/cyberagent-group/jobs/16949

Slide 36

Slide 36 text

AbemaTV, Inc. All Rights Reserved