GCP の Cloud Functions は引数と戻り値をちゃんと書かないとハマる話
FaaSを使ってみる
タイトルが全て。
サークルの体験入部管理用に作ったBotでバッチ処理をさせているが、Botのコードに無理やりgoroutineを入れてバッチ処理をさせている微妙なコードだった。 Oracle Cloudの無料枠に乗せているため、サーバの余力がなくコンテナを新たに立てるのが厳しかったので、そんな感じの無茶苦茶なコードになっていた。
サークルの先輩からIssuesが飛んできたりしてて、流石にそろそろ放置するのも忍びないのでBotの修正ついでに Cloud Functions に移行してみた。言語はGo。
6時間ぐらいハマった
色々困った部分はあったが、特にハマったのは以下の部分。
- メインで動かす関数の引数、戻り値はイベントに応じてちゃんと設定する必要がある
- package は main が使えない (ビルド時に main パッケージが自動追加されるらしい) ので、他の名前にする
- メインで動かす関数は開始を大文字にする (Go で、package を分けることを考えれば妥当)
gcloud コマンドで行ったが、基本的にデプロイ時のエラーメッセージはあてにならないと思った方が良い。
エラーメッセージの内容で調べても情報は(英語であっても)基本出てこなかった。
Cloud Scheduler
バッチ処理の発火のためのスケジューラ。こっちは crontab とか書いたことあれば簡単で、ものの2, 3分あればできる。
Pub/Subで指定した時間にトピックを指定してやれば、ちゃんと Cloud Functions でトピックで発火する設定ができていれば動いてくれる。
感想
大体実行時間は3~4s/回ぐらい。一日一回のバッチ処理で、実行環境はメモリ128MBの最小サイズなので、1か月0.1円もしない。無料枠にも勿論収まるため超お手軽。
ちょうど良い FaaS 入門で面白かった。
通知Botとかも作れそうだし、最近 Discord も slash コマンドが使えるようになって、FaaS にコマンド処理を置けるようになったらしいので作ってみたい。