🔇

GCP の永久無料枠を使って無料で Among Us のミュートボットを運用したかった

5 min read

はじめに

Among Us というゲームをご存知ですか?人狼に代表される正体隠匿系ゲームのひとつです。有名な配信者さんがやっていますよね。
Among Us ではボイスチャットが必須です。また、ゲームの状況に合わせて喋ってよいときと喋ってはいけないときがあります。この切り替えを手動でやるのは面倒な上に間違える危険性があるので、 Discord に AutoMuteUs という Bot を入れると便利です。この Bot は無料でホスティングされているものもありますが、 Discord の API 制限の関係で利用できない場合があるようです。

API 制限を回避するためには、 AutoMuteUs Premium に課金するか、 self host すればよいです。この記事では GCP の永久無料枠で AutoMuteUs を低価格で self host する方法を説明します。

GCP で無料インスタンスを起動する

適当な名前でプロジェクトを作成します。

Compute Engine -> VM インスタンスから「インスタンスを作成」します

  • リージョン: us-west1
  • マシンタイプ: N1 シリーズ -> f1-micro
  • ブートディスク: 20GB の標準永続ディスクに変更する[1]。 ここでは CentOS 7 を利用します

ファイアウォールの設定をする

GCP ではトラヒックに対しても課金されます。そのため、GCP のファイアウォールでできるだけ通信を制限してあげるとよいです。
ここでは、

  • AutoMuteUs で利用する 8123 ポートへの上りの通信
  • 自宅の Global IP アドレスからの 22 ポートへの上りの通信
  • 自宅の Global IP アドレスからの ICMP
    のみを許可し、それ以外を拒否するように設定します。

まずは自宅の Global IP を調べます。ローカルの端末でターミナルを開き、

$ curl ifconfig.me

のようにすると A.B.C.D のような形式で Global IP を確認できます

ネットワーキング -> VPN ネットワーク -> ファイアウォールから以下の 3 つのルールを作成します

名前: disallow-everything
ログ: オフ
ネットワーク: default
優先度: 1000
トラフィックの方向: 上り
一致したときのアクション: 拒否
ターゲット: ネットワーク上のすべてのインスタンス
ソースフィルタ: IP 範囲, 0.0.0.0/0
プロトコルとポート: すべて拒否

同様に、

名前: allow-home-access
ログ: オフ
ネットワーク: default
優先度: 900
トラフィックの方向: 上り
一致したときのアクション: 許可
ターゲット: ネットワーク上のすべてのインスタンス
ソースフィルタ: IP 範囲, A.B.C.D/32
プロトコルとポート: 指定したプロトコルとポート
  tcp: 22
  その他のプロトコル: icmp
名前: allow-automuteus
ログ: オフ
ネットワーク: default
優先度: 900
トラフィックの方向: 上り
一致したときのアクション: 許可
ターゲット: ネットワーク上のすべてのインスタンス
ソースフィルタ: IP 範囲, 0.0.0.0/0
プロトコルとポート: 指定したプロトコルとポート
  tcp: 8123

も追加します。

VM に SSH ログインする

https://cloud.google.com/sdk/docs/quickstart-macos?hl=ja を参考にして gcloud コマンドをインストールします。

$ cloud init

-> Google アカウントにログイン
-> プロジェクト AmongUsMuteBot を選択
-> デフォルトのリージョンを us-west1-b に

$ gcloud compute ssh <ユーザー名>@automuteus
-> 新しく公開鍵/秘密鍵をつくる場合は秘密鍵のパスフレーズを入力する
-> 確認のため何回か秘密鍵のパスフレーズを入力する
-> インスタンス上に <ユーザー名> のアカウントが作成される

swap を追加する

f1-micro はメモリが 600 MB くらいしかありません。このインスタンスで Docker を動かすとメモリが足りなくなるので、 1 GB くらい swap を追加します。

$ sudo /bin/dd if=/dev/zero of=/var/swapfile bs=1M count=1024
$ sudo chmod 0600 /var/swapfile
$ sudo /sbin/mkswap /var/swapfile
$ sudo /sbin/swapon /var/swapfile
$ sudo bash -c 'echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab'

Docker をインストールする

https://docs.docker.com/engine/install/centos/

に従って Docker をインストールします

$ sudo yum install -y yum-utils
$ sudo yum-config-manager     --add-repo     https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install -y docker-ce docker-ce-cli containerd.io
$ sudo systemctl enable docker --now
$ sudo docker run hello-world

次に、

https://docs.docker.com/compose/install/

に従って docker-compose をインストールします

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose
$ sudo chmod +x /usr/bin/docker-compose
$ docker-compose -v

Discord の Bot を作成する

https://github.com/denverquane/automuteus/blob/master/BOT_README.md

を参考にして Discord の Bot を作成します。

https://discord.com/developers/applications にアクセスして、 New Application をクリックし、適当な名前を入力します

Bot から Add Bot をクリックします

TOKEN の Copy をクリックして Token を控えておきます

OAuth2 から OAuth2 URL Generator までスクロールし、 Scope を Bot にします

Bot Permissions は Administrator にするか、下の画像のようにします

Scope の下のほうに https://discord.com/api/oauth2/authorize? から始まる URL が表示されていると思うので、これをブラウザで開いてください。適当な Discord サーバーに Bot を招待することができます。

automuteus の設定をする

https://github.com/denverquane/automuteus#docker-compose

このあたりを参考に作業します

$ sudo yum install -y git
$ git clone https://github.com/denverquane/automuteus.git
$ cd automuteus/
$ cp sample.env .env
$ vim .env


以下の 4 つの変数を設定する
AUTOMUTEUS_TAG=6.12.1
GALACTUS_TAG=2.4.1
DISCORD_BOT_TOKEN=<Discord Bot の Token>
GALACTUS_HOST=http://<インスタンスのパブリックIPアドレス>:8123


$ sudo docker-compose up -d

Bot を使う

Discord で .au new とすると作成した Bot が反応してくれて以下のようなメッセージを返してくれます。

ブラウザで http://<インスタンスのパブリックIPアドレス>:8123 にアクセスして

{"activeConnections":0,"activeGames":0,"commit":"c457af0","totalGames":82,"totalGuilds":2,"totalUsers":31,"version":"6.15.1"}

のような応答が得られれば正しく設定できています。

無料ですか?

筆者はディスクを標準永続ディスクに変えるのに失敗したので月額200円程度課金されました(一敗)。それ以外のネットワークの課金は1円に満たない程度でした。
標準永続ディスクに変更したので一ヶ月程度程度運用して再度報告します

参考資料

GCP の使い方はこちらの記事も参考にしてみてください

https://qiita.com/riku-shiru/items/a870edd9dc0b132e092c

脚注
  1. デフォルトだとバランス永続ディスクが選ばれます。バランス永続ディスクの場合は月200円程度課金されてしまいます ↩︎

Discussion

ログインするとコメントできます