Closed7

重めなDiscord Botを格安で動かしたい

いちきゅーいちきゅー

使用人数は少ないけど重めなDiscord Botをなるべく安く動かすにはどうしたら良いのか

条件

・DB(NoSQL可)が使える
・処理時間制限に引っかからない
・コア部分をコンテナで動かしたい
なんかあったときにスッとサービスを乗り換えられるようにしておきたいのと、Container Appsで使う予定でGoでコードを書いてしまったので
・DWHを使いたい
まじでこれは僕の個人的なあれなんですけどDWHを使ってデータ分析とかしたい。BigQueryに無料枠があるから条件が同じならGCPを使いたい
・応答までが早い
FaaSを使ってWebHooksでInteractionを受信しようにもコールドスタートがあるからInteractionの応答制限である3sを超えてしまい返答できない事があるので、応答までが早いEdge FunctionかWSを常にListenできるサーバーが必要

現在の使用技術と問題点

・Azure Contaienr Apps
App Serviceからリクエストを受けて重ためな処理をする用
・Azure App Service
DiscordからのInteractionを受信してACAにリクエストを飛ばすだけ
・Cosmos DB NoSQL

問題点

・App Serivceの無料枠を使っているから定期的にBotが落ちる
15分に1回リクエストを飛ばすようにGASで設定したけど落ちてることがある
・スペック不足
同時に大量にコマンドが送られたらApp Serviceのスペックが足りずに処理が遅くなる/落ちる。完全試用枠なので仕方ない

いちきゅーいちきゅー

検討中リスト

Workers + Cloud Run + D1 or Firestore

Workers を使ってWebHooksでInteractionを受信してCloudRunにそれを投げるシステム
APIリクエストを除いても10ms以内に処理しないと落ちちゃうので時間内に動いてくれるか心配

Cloud Functions + Cloud Run + Firestore

さっきのEdgeFunctionsをCloud RunにしてDBはFirestoreにしてGCPに固めたい。これができたら最強。ただやっぱり応答速度がどうなのかなぁ~...とAzure FunctionsとLambdaはコールドスタートで返答ができないケースがしばしばあったからどうかなぁと
使ってみなきゃわかんない

EdgeFunctionサービス + Container Apps + Cosmos DB

現在動いているApp ServiceをEdgeFunctionに変える。ただ変えるならBigQuery使いたいしGoolgeで固めたいなぁという気持ちが強め
あとさっきも言ったようにEdge Functionには処理速度の問題があるから心配

使えないサービスたち

・Azure Functions
応答速度が足りない
・AWS Lambda
上同
・EC2などのVMサービス
ただ単に無料じゃ動かせない
・Google AppEngine無料枠
App Service同様スペック的な問題がある

いちきゅーいちきゅー

とりあえずそれ以外はそのままApp ServiceをCloudflare Workersに載せ替えてみた
一癖あったけどちゃんと動くようになったし、元々30秒かかってた処理も20秒前後で動くようになったし、リクエストが一気に飛んできても時間はかかれど処理落ちしなくなったのでめちゃくちゃ良.....

これなんで落ちないんだろう

いちきゅーいちきゅー

Firestoreってどんなもんじゃい!と思って使ってみたらエラー吐かれた

こちらのサイトによるとこういうことらしい
https://zenn.dev/ytr0903/articles/76386126e07549

V8エンジンで動いてるからこっちじゃないといけないと思ったけどだめらしい...
node版動くんかな

いちきゅーいちきゅー

とりあえずREST API叩いてデータ取るようにしてみた。Token作るのに苦戦してたけどサービスアカウントの権限の設定ミスってたみたいでアカウント変えたら一発だった

OAuth2のToken作って投げるだけだからすぐ失効するしもし万が一僕の不手際で漏れるようなことが合ってもなんとかなりそう
そのうち記事にしたいねー

FirestoreのAPIを叩く日本語記事があまりにもなさすぎて一生Firebaseのドキュメントとにらめっこしてた
https://firebase.google.com/docs/firestore/reference/rest/?hl=ja
https://firebase.google.com/docs/firestore/use-rest-api?hl=ja
https://blog.cloudflare.com/api-at-the-edge-workers-and-firestore/
https://developers.google.com/apis-explorer?hl=ja#p/
https://developers.google.com/identity/protocols/oauth2/service-account?hl=ja#httprest
今回使ったのは↑のoauth2トークン どっかにリクエストせずにToken作れるから楽

https://firebase.google.com/docs/auth/admin/create-custom-tokens?hl=ja#create_custom_tokens_using_a_third-party_jwt_library

いちきゅーいちきゅー

とりあえずCloudflare WorkersとCloudRun、Firestoreで作ることには成功したー
Cloud Functions版もそのうち作ってみたいけど落ち着いたらかな

ユーザーのデータとかはFirestoreでいいけどデカ目のマッチログを保管したり取り出したりできるようにしたいので、デカ目のDBが必要だけどどうしよう

今のところOCIのFree Tierで25GBのNoSQL DBとDWHが使えるらしいからそれ使ってみたいーーでもとりあえずBotを無料(ほぼ無料)でちゃんと実用的な速度で動くようにできたので目標達成ということで

ちなみに色々いじってたらコールドスタートでも10秒前後でレスポンスできるようになったのでラッキー
コード自体はほとんど変えてないどころか機能追加してるからやっぱりContainer Appsのコールドスタート長すぎる...

このスクラップは2023/11/20にクローズされました