概要
- Nanitの動画パイプラインで S3コスト が大きな問題となり、 独自メモリ着地点N3 をRustで開発
- S3のPutObject課金 と24時間分のストレージ課金が主なコスト要因
- N3は 2秒以内 の短期保存、 S3はオーバーフロー時のみ 利用
- 導入により 年間約50万ドル のコスト削減
- 技術的検証・実装・運用ノウハウを詳細解説
Nanit動画パイプラインのコスト最適化事例
背景と従来構成
- カメラが動画チャンクを記録し、 S3のpresigned URL をCamera Serviceから取得し直接アップロード
- AWS Lambda がSQS FIFOキューにオブジェクトキーを投稿
- 動画処理ポッドがSQSから消費し、S3からダウンロードして処理
- S3+SQS 構成により、アップロードと処理の非同期化・高可用性・順序保証を実現
- S3ライフサイクルルールで自動GC(最短1日)のため、運用負荷低減
問題点
- PutObjectリクエスト課金 が最大のコストドライバー
- チャンク増加=リクエスト増加でコストが直線的に増大
- ストレージ課金 も無視できず、2秒で処理しても24時間分の課金が発生
- 高頻度・短命オブジェクトへの課金が非効率
改善方針
- アーキテクチャの単純化 で複雑さを排除
- 透過的な置き換え で既存カメラから見て変更なし
- 通常パスの最適化 と S3のフェールセーフ利用
- 順序保証 ・ 高スループット ・ マルチミリオンバックログ耐性
- 既存ファームウェア対応 ・ 小規模損失許容 ・ コスト最小化
N3アーキテクチャ概要
-
N3-Proxy (外部/内部API、stateless)と N3-Storage (RAM保存、stateful)に分離
-
動画は一時的にRAM保存、2秒以内にSQSへエンキュー&処理
-
N3-Storageが満杯時や障害時のみS3へ自動フォールバック
-
厳格な順序保証 はSQS FIFOのgroup IDで維持
- Tier1: N3-Storageが受け入れ不能時、N3-ProxyがS3へ代理アップロード
- Tier2: N3-Proxy/Storage障害時は全トラフィックをS3に切り替え
-
N3-Proxy/Storage分離の理由
- 障害時の影響範囲最小化
- CPU/ネットワーク(Proxy)とメモリ(Storage)のリソース最適化
- セキュリティ(Storageはインターネット非接続)
- Proxyのみ無停止で安全に更新可能
設計検証・PoC
- 合成負荷テスト で限界値・ボトルネック特定
- 本番PoC(ミラーモード) で実カメラ挙動を観測
- S3とN3両方へ書き込み、出力比較
- Unleashによるfeature flag で細粒度切り替え・即時ロールバック
- 主な発見
- TLS終端が最大CPUボトルネック
- RAMのみで十分なワーキングセット確保可能
- Delete-on-GETで再ダウンロード不要
- TTL GCの追加で処理漏れチャンクをクリーンアップ
実装詳細
-
DNSロードバランシング
- Route53 MultiValue Aレコード+ヘルスチェックで各ノードを動的に管理
- ノード障害時は自動で除外、ロールアウトも安全
- DaemonSet構成 で1ノード1Pod、TLS終端最適化
-
ネットワーク制限とインスタンスタイプ
- AWSインスタンスの「Up to」Gbpsはバースト型で継続利用に非適
- network-optimized c8gn.4xlarge (50Gbps)で持続高スループットを実現
-
HTTPS最適化
- stunnelから rustlsネイティブ に切替
- Graviton4 インスタンス+最適化ビルド
- これにより RPSが約30%向上
-
アウトバウンドトラフィック課題
- 各アップロード毎にTLSハンドシェイク(~7KB証明書送信)が発生
- カメラ側改修不可のため、現状は許容
- ACKパケット も意外な通信量要因
効果とまとめ
- 年間約50万ドルのコスト削減 を実現
- 高負荷・短命オブジェクト処理に最適な設計
- S3は信頼性確保のためのフェールセーフ としてのみ利用
- CPU/ネットワーク/メモリ最適化 による効率的運用
- TLS終端・GC・ロードバランシング などの運用ノウハウ蓄積
今後の展望と応用可能性
- 他の高頻度・短命オブジェクト処理パイプライン でも応用可能な設計
- コスト最適化と高可用性の両立 が求められる領域での導入事例
- Rust+クラウドネイティブ技術 の組み合わせによる新たな選択肢
参考情報・Tips
- Route53 MultiValue Aレコード による安価なロードバランシング
- Unleashなどのfeature flag 活用で安全な段階的リリース
- Delete-on-GET+TTL GC による効率的なメモリ管理
- AWSインスタンスタイプ選定の落とし穴 (バースト型vs継続型)
まとめ
- Nanitの事例は クラウドコスト最適化 と システム設計 の好例
- S3のコスト構造理解 と 独自着地点の構築 で大幅な効率化
- 設計・検証・運用の全プロセス が参考になる実践知見