GCP上でDiscord用ダイスボットを動かしてみる＆設定を自動化する

# はじめに

サイコロによる判定（ダイスロール）をオンラインで実行できる神ツール、**BCDice**。
これをDiscordのチャットで使えるようにする神Botがあります。

これがあればDiscord内でもTRPGセッションができる！さっそく導入してみました。

> **BCDice**
https://bcdice.org/

> **discord-bcdicebot**
https://shunshun94.github.io/discord-bcdicebot/index.html

このBotを使用するには、Botが稼働するコンピュータが１台と、BCDiceのAPIが稼働しているサーバが必要になります。

APIサーバの方は使用可能なものが幾つか公開されているため、そちらをお借りすればOKです。
（自分でHerokuに構築する手順も公開されています）

Botの方はファイルをダウンロードしてbatかshファイルを実行すればよいので、自分のPCでも問題はないのですが、
せっかくなので今回はGCP上に構築してみました。

## 準備

discord-bcdicebotのリンク先にある「ダイスボットを登録する」に従い、DiscordにBotを作成します。
最後のURLアクセスまで完了すると、Dicebot君がサーバにやってきます。
Botのトークンは後で使うので、開発者画面は開きっぱなしにしておいてください。
![ss5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255659/f634fc08-71bb-04ea-d363-d79baa928093.png)

## Botを動かすためのサーバを用意する

### プロジェクト作成

まずは大枠となるプロジェクトから作っていきます。
「リソースの管理」ページか、ダッシュボードからでも作成できます。
![ss1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255659/4e1df4f1-6d6c-9733-9c1b-ba623d055062.png)

> **プロジェクトの作成と管理**
Google Cloud プロジェクトは、API の管理、課金の有効化、共同編集者の追加と削除、Google Cloud リソースに対する権限の管理など、すべての Google Cloud サービスの作成、有効化、使用の基礎となります。
https://cloud.google.com/resource-manager/docs/creating-managing-projects

## Computed Engine作成

Compute Engineは、ざっくりいうとGCPのサーバインスタンスです。
「VMインスタンスの作成」から作成していきます。

料金は性能と使用時間、それとリージョンによって決まります。
東京に置くとちょっとだけ高いので、デフォルトのus-central1にしておきましょう。

シリーズは第2世代「E2」の最小（e2-micro）にします。
月間予測を見てみると、$6.52。停止中は時間単位の課金は発生しないので（やさしい）、
必要な時だけ立ち上げておけば更に安く済みそうです。[^1]
[^1]: **インスタンスの停止と起動** https://cloud.google.com/compute/docs/instances/stop-start-instance
![ss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255659/9c0cd720-b055-bddf-7203-e9073d3e5f5e.png)

DicebotはJavaで動作するため、VMにもJavaをインストールしておく必要があります。
以下リンク先にJavaの起動スクリプトがあるので、これをコピーして起動時にインストールが走るようにします。

なお、起動スクリプトの欄はデフォルトでは表示されません。
「管理、セキュリティ、ディスク、ネットワーキング、単一テナンシー」をクリックすると「自動化＞起動スクリプト」の欄が出てくるので、ここに貼り付けます。

> **Compute Engine での Java スタートガイド**
https://cloud.google.com/java/docs/tutorials/getting-started-on-compute-engine?hl=ja

![ss3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255659/cfdc5104-582f-1d1f-b511-ec3db82583eb.png)
![ss4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255659/0f26f353-c248-7f65-ea3a-a86b834a1cc6.png)

また、起動後にファイルのダウンロード・解凍、設定ファイルの編集が必要なのですが、**面倒なので全部自動化します**。
（※discord-bcdicebot v1.14.4で動作確認済ですが、うまく動作しない場合は手動で実施してください）

まず、上の起動スクリプトは2回目以降だと途中で終了してしまうようなので、javaが未インストールのときのみ実行されるようにIF文で囲います。

```shell
if ! java -version COMMAND &> /dev/null; then
# （元のスクリプト）
fi
```

そして、スクリプトの末尾に以下を追記します。

```shell
# カスタムメタデータ取得
DISCORD_BOT_TOKEN=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/DISCORD_BOT_TOKEN" -H "Metadata-Flavor: Google")
BCDICE_API_URL=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/BCDICE_API_URL" -H "Metadata-Flavor: Google")
BCDICE_PASSWORD=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/BCDICE_PASSWORD" -H "Metadata-Flavor: Google")

cd /
if ! [ -d "discord-bcdicebot" ]; then
  apt-get install wget
  apt-get install unzip

  # ファイルがGoogle Drive上にあるため、gdown(https://github.com/circulosmeos/gdown.pl)でダウンロード
  echo "Dicebot Downloading..."
  wget https://raw.githubusercontent.com/circulosmeos/gdown.pl/master/gdown.pl -O gdown.pl
  chmod +x ./gdown.pl
  ./gdown.pl "https://drive.google.com/u/0/uc?id=0BwmXeRuZhw9oUzBINlJUdEp2eGM&export=download" discord-bcdicebot.zip

  echo "Extracting..."
  unzip discord-bcdicebot -d discord-bcdicebot
fi

# 起動設定を編集
cd discord-bcdicebot
sed -i -e "s/DISCORD_BOT_TOKEN=.*$/DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN}/g" start.sh
sed -i -e "s,BCDICE_API_URL=.*$,BCDICE_API_URL=${BCDICE_API_URL},g" start.sh
sed -i -e "s/# BCDICE_PASSWORD=PleaseChangeMeIfYouUseThis/BCDICE_PASSWORD=${BCDICE_PASSWORD}/g" start.sh

# バックグラウンドで実行
nohup sh start.sh &

echo "Dicebot Started"
```

トークンなどの設定値はベタ書きにしたくないので、カスタムメタデータとして設定します。[^2]
[^2]: **インスタンス メタデータの保存と取得** https://cloud.google.com/compute/docs/storing-retrieving-metadata#custom
起動スクリプトのすぐ下に「メタデータ」の欄があるので、以下のパラメータを追加してください。

- DISCORD_BOT_TOKEN: Bot作成時に取得したトークン
- BCDICE_API_URL: BCDice-APIのURL
- BCDICE_PASSWORD: 任意のパスワード（Botの管理者コマンドを実行するときに要求されます）

![ss6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255659/c9464f26-584c-f8ca-f44f-3b878d55081e.png)

設定が終わったら「作成」ボタンをクリックします。
ちゃんと動いているか確認するため、ログを表示してみましょう。（結構時間かかります）

![ss7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255659/87434d60-4105-71c0-523f-dd89090dd162.png)
![ss8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255659/1e6330cf-f5f1-04cf-b5a7-d9114491ea0f.png)
スクリプトの最後まで行ってくれたようです。
Discordの方を確認してみましょう。
![ss9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255659/b3ad8a71-45bb-3136-295d-cf461f5a6fd3.png)
![ss10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255659/0c37e538-2886-a44e-9f91-1249b612799e.png)
無事にBot君がオンラインになってくれました。
出目も大変縁起が良いです。

停止／再起動でBot君を叩き起こせることも確認できたので、ひとまず目的は達成です。
それでは、ツール制作者様に感謝しつつ、さっそく遊んできます。