ツイキャスをサーバレスで録画できるようにした
動機
以前、GCEでツイキャスを録画できるようにしたものを停止させてしばらく放置していたのですが、推しがツイキャスを始めたのでまた動かすついでにCloudFunctionsに引っ越しました。
クラウドだと常にインスタンスを保持しておかなければならず、1日数時間程度しか動かないシステムには無駄が多く月300円ほどかかります。(GCPの無料枠ならば0円に収まりますが)
サーバレスならば起動時間だけで課金されるので安くなるかなと思いました。
構成
GCEのとき同様ツイキャスからのwebhookをトリガーにします。
使えそうなGCPのサービスはソースコードをアップして走らせてくれるCloudFunctions、コンテナを走らせてくれるCloudRunの2つがありました。ですが、どちらも連続して動かせる時間に制限があり、CloudFunctionsは9分、CloudRunは60分で録画に使うには足りません。
ですので、5分おきにCloudFunctionsを呼び出し、バトンタッチしながら録画するようにしました。
CloudFunctionsは、結局中身がコンテナでFlaskでWebサーバーを動かしているらしいです。
Functionは呼び出された後、連続して呼び出された場合に備えてしばらく起動されたままにされるらしいですが(コールドスタートとウォームスタート)、この構成だと同一配信の録画はすべてウォームスタートになるんでしょうか。今は数秒ダブらせてfunctionsを走らせることでバトンタッチ時の録画漏れを防いでいますが、ウォームスタートなのを信じて/tmpを使って重複を除去しても面白そうですね。
感想
Functionsを使ってちゃんとしたものを作ったのはじめてでしたが、とにかくデバッグがやりにくかったです。いちいちデプロイして動かさなければならないのでとてもつらい。
Cloud Functions をローカル環境で統合テスト可能にした話なんて記事もありましたが、そこまでするほどじゃないので困る。webで使われるシンプルなAPIのためのもので、関数から関数を呼ぶ設計をあまり考えてないのかなって印象を受けました。