GCE上のVMインスタンスを起動・停止できるDiscord botを書いた

これのちょっとしたオマケというか続き:

pione30.hatenablog.com

インスタンスを起動しっぱなしだと月に5000円くらいかかってしまいそうなので、このマイクラサーバで遊ぶ人達には遊ぶ時だけ起動して終わったら停止してもらうようにお願いしていて、運用としては最初の頃はインスタンスの起動と停止ができる権限だけをその人達に付与してGCPのWebコンソール画面上から起動・停止ボタンをポチポチ押してもらっていたのだけど、基本的に皆がコミュニケーションをとる起点はDiscordなのでDiscordから離れることなくコマンドを打つだけでインスタンスの起動・停止ができたほうが便利だと思い簡単なbotを書いた:

github.com

今はマイクラサーバ用にしか使っていないけど一応誰でも自分の権限があるプロジェクトに導入できるように汎用的に書いている。

Googleが公式に推奨しているGCE用のクライアントライブラリはNode.js実装しか存在しなかった 1 のと、discord.jsというDiscord APIのNode.jsクライアントライブラリがあったのでこれらを使ってNode.jsで書くことにした。

github.com

github.com

discord.jsのほうは型定義が充実していて体験は良かったけど @google-cloud/compute のほうは型定義が存在しなかったので、実際にAPIを叩いてみて戻り値を見ながら「あ〜インスタンスの外部IPアドレスはこれね……」みたいに確認していく作業があったりして非常につらかった。

認証方法はsecret tokenを環境変数で渡す形式かなと思っていた(discord.jsのほうはそうだった)けど @google-cloud/compute のREADMEを読むと、サービスアカウントというアカウントを作成して適切な権限を付与してから、そのサービスアカウントの認証情報を検出させる、という方式であることがわかった:

cloud.google.com

botはDockerコンテナ化しても良かったけど今はマイクラサーバ用にしか使ってないしCloud Storageの容量を消費するのが嫌だったので無料枠のf1-microインスタンスを立ててSSHログインしてリポジトリをgit cloneしてから直実行するという令和とは思えない運用で動かすことにした。また困ったらもうちょいクラウドネイティブな感じに頑張るってことで良いんじゃないでしょうか。