Java版Minecraft 1.17.1のマルチサーバをGCPで建ててみた

## はじめに
今回`Minecraft`のJava版のマルチサーバをGCP上の`Google Compute Engine`に構築しました。
先人の記事があったものの、`1.17.1`を入れる上で少しハマりどころがあったので、備忘録として残しておきたいと思います。

いくつかGCPで記事を書いている方はいましたが、最小レベルでの記事はなかなか見つからなかったので、ここまでやれば取り敢えずバニラのMinecraftをみんなで遊べる！というところを目標とします。

GCPを使ったマイクラマルチサーバは、サーバ構築まで約30分ほどで完了しますので、非常に簡単にセットアップすることが可能です。

詳細な手順については、今回様々な記事を参照させていただいたため、そちらを参考に記述しておきます。

## 実行結果、料金
今回作成したGCEインスタンスに4人同時接続し、5〜6時間ほどプレイしてみましたが、ほとんどカクつくことはありませんでした。

発生した料金は以下のグラフのようになっており、日本円で約31円です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/c3af0ad8-a63e-bfc7-103e-e631919872c4.png)

Minecraftサーバ構築ではよくVPSサービスなど紹介されていますが、個人で友達とワイワイ遊ぶ程度であれば、少し知識は必要ですが、GCEはかなり有用な選択肢の一つなのではないかと思います。何よりも、GCPを触るきっかけにもなります。

# サーバ構築手順
今回は備忘録的な記事になりますので、GCPの登録などは済んでいる前提とします。
もしまだの場合は、以下のリンクからグーグルアカウントにログインの上、プロジェクトの作成を行ってみてください。
https://console.cloud.google.com/

## インスタンスの作成
GCPのサイドメニューから
`コンピューティング ＞ Compute Engine ＞ VM インスタンス`
を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/dc98d94e-37e4-f5df-a7d9-89aa3c3e81d7.png)

そうすると、以下の画像のようなリストが出てきます。今回私はすでにインスタンスを立ててしまっているので`minecraft-server`というのがリストに追加されていますが、最初は何も無いはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/aeba319e-5017-8501-41a6-1597930ed3ed.png)

上部ナビゲーションの`VMインスタンス`の右横、`インスタンスを作成`をクリックします。

画像の通りに新規VMインスタンスの各項目を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/055d3e15-af67-04a4-76c0-0c4a20541e9e.png)

### インスタンスの名前・リージョン
名前はわかりやすい名前にしておきます。今回は`minecraft-multi-server`とします。

| リージョン | ゾーン |
|:-:|:-:|
| asia-northeast1（東京） |  asia-northeast1-b |

にしてみます。近い方がラグとか少ないはずなので、東京にしました。

### マシンタイプ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/9ccf6c43-9118-6d91-8079-14d562f800a1.png)

マシンの構成は、マシンタイプをカスタムに設定すると好きなようにCPUとメモリを割り当てることが可能です。

シリーズについては`N1`でも十分だと思います。

メモリについては後でも変更できるのですが、人数が少なければ大体3〜4GBくらいメモリを割り当てておくとかなりサクサクになります。

初めは少なめに設定して後からカクついてるな〜と思ったら増やしていくのが一番いいかもしれません。（私は面倒だったので適当に設定しました）

### ブートディスク
続いて、ブートディスクの設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/53ed957f-6ba8-4c8f-ee5f-0de6c4382e59.png)
こちらの変更ボタンをクリックすると、ディスクを変更することが出来ます。

今回はコスパ重視で以下の設定にしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/625a94eb-08f9-b962-54ae-646ca92d8202.png)
サイズに関しては、バックアップを多めにとるなら変更したほうが良いかもしれません（Cloud Storageに保存するようにするとかが良いと思います）。ただ、個人利用レベルであればこの程度で十分です。

### プリエンプティブ
続いて、プリエンプティブを設定します。
まずは以下の画像の格納されているプロパティを表示させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/68b00493-cdea-b314-5ea9-f7258196b5b2.png)

すると色々なタブが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/95f7f292-af79-9ab5-4008-7d29ebe27a32.png)

`管理`タブ内のプリエンプティブをオンにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/66285dd3-0f1b-f17a-b732-cd1bc2c4773d.png)
この設定をオンにすると、GCEのインスタンスの余り部分が利用できるようで、
- 24時間でインスタンスが自動停止
- GCEの都合でシャットダウンの恐れがある
というデメリットが生じますが、相当額料金が安くなります。個人利用で24時間もマイクラサーバ起動させませんし、むしろ勝手に切れてくれて都合が良いまであります。付けておきましょう。

### ネットワーキング
続いて同様の場所からタブをネットワーキングに切り替えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/f9d3f7e8-2a6f-d9e2-00b7-12b93a441765.png)

ネットワークタグに適当な名前を設定します。今回は`minecraft-server`としてみました。

ここの名前は後でポート開放に必要となります。

また、minecraftからサーバにアクセスするときに毎回IPアドレスが変わると面倒なので、固定のアドレスを設定します。
名前は適当に、`minecraft-multi-server`と、インスタンスの名前と揃えてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/d7554624-3243-e2b9-c373-63c0fe6b219f.png)

最終的には以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/70a3eb8b-2cf5-9f7a-70f4-af77de25d4a5.png)
### インスタンスの作成
ここまで設定できたら、インスタンスを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/8fb6d0c9-98ae-9df5-e806-ff92ddad31e5.png)
作成ボタンをクリックします。

これで、インスタンスが作成されました。
以下のようにリストに増えているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/fd65a253-9797-1b91-f1c3-72f4df7f3f17.png)


# インスタンスの停止
そのまま次の設定に行くなら不要ですが、もし作業を中断したり、実際にマルチサーバを終了するときは、必ずインスタンスを停止しておきます。
インスタンス起動時間単位で課金されるため、コツコツ止めておくだけでもかなりお財布に優しいです。
停止する場合は、停止したいインスタンスにチェックを入れた上で、上部メニューの停止をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/55131696-8375-80a6-b0e1-00e848750ee1.png)
横幅が狭いときは`…`に格納されているため、注意してください。

# ポート開放
続いて、建てたインスタンスにMinecraftからアクセスできるように、ポート開放を行います。
`GCP左上のナビゲーションメニュー > ネットワーキング > VPC ネットワーク > ファイアウォール`
をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/47265a5a-0a13-4de2-f1a9-6ba56f958728.png)

ここでは、先程インスタンスを作成したときに付けたネットワークタグを指定して、ポートを開放します。
ファイアウォールルールを作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/311c9546-300c-c7fe-1ed1-13e581d2580f.png)

このファイアウォールルールに名前を付けます。
今回は`minecraft`と命名します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/088fb18c-3159-fdfb-e48c-cbe4a59b20d2.png)

そうしたら少し下にスクロールし、ターゲットタグに先程指定した`minecraft-server`というターゲットタグを付けます。
また、ソースIPの範囲は特に指定しないため、`0.0.0.0/0`を入力します。
プロトコルとポートでは、Minecraftデフォルトの設定である、`tcp`にチェックを入れ、`25565`を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/2040f11d-aee9-993d-98ca-8a315a105c87.png)

これでルールを作成するだけで、ポート開放は完了です。
以前自宅のルータでサーバを作ってポート開放したことがありましたが、そのときはかなり煩雑な設定が必要だったことに対し、GCEでは非常に簡単に設定できることに感動を覚えました。

# インスタンス内にMinecraftサーバを設定
ポート開放まで設定が終わったら、あとはサーバを建てるだけです。
インスタンスの画面に戻り、ブラウザ上のSSHターミナルを用いてインスタンスにアクセスします。
もし先程インスタンスを停止していたら、チェックを入れて開始をクリックします。

インスタンスリスト内の接続部分の`▼`をクリックし、`ブラウザウィンドウで開く`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/eb8db3b2-586b-49a4-d16c-93fa02094814.png)

少し待つと、下のような黒い画面になると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/46c01a67-e784-39a7-bae8-be023a4cf2bf.png)

ここで
- 必要なパッケージのインストール
- Java版Minecraftのマルチサーバをインストール
- サーバの初期設定
を行います。

## 必要なパッケージのインストール
以下の順番にコマンドを実行していきます。$マーク以外を一行ずつコピペするとうまく実行できるはずです。


```
$ sudo add-apt-repository ppa:linuxuprising/java -y
$ sudo apt update
$ sudo apt install openjdk-16-jre -y
```

最後の行を実行すると、なにやら同意画面が出てきます。
それぞれ矢印キーとEnterキーで`OK`、`Yes`を選択すると無事インストール出来るはずです。

## Java版Minecraftのマルチサーバをインストール
続いて、マルチ用に提供されているMinecraftのサーバファイルをインストールします。
今回は分かりやすいように、`root`にそのまま必要ファイルを展開しますが、整理する場合は適宜ディレクトリを作成してください。

まず、以下のリンクからMinecraft公式サイトに飛びます。

https://www.minecraft.net/en-us/download/server

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/d128a700-3d08-e656-1f24-b8c93dddd402.png)

`Download minecraft_server_x.x.x.jar and ...`
のリンクを右クリックしてコピーします。

そのまま、先程のインスタンスのターミナルに、以下のコマンドを入力します。

```
$ wget <今コピーしたURLをペーストする>
```

これで`server.jar`ファイルをインスタンス上にダウンロードすることが出来ました。
そうしたら、先程の公式サイトに再び戻り、ダウンロードリンクの下のコマンドをコピーします。
サーバを起動するときは毎回このコマンドを実行します。
しかし、サーバファイルの名前が変わっているので、以下のように書き換える必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/1a12452d-e3fb-ce73-cb14-98805379c55a.png)

```
$ java -Xmx1024M -Xms1024M -jar server.jar nogui
```

ちなみにこのまま実行するとメモリが1GBしか割り当てられないことになるので、3GB分使用可能にしておきます。
`-Xmx1024M`の部分が最大使用可能メモリ量ですので、ここを1024 * 3の`3072`に設定しておきます。
今回私が実行したコマンドは、以下のものになります。

```
$ java -Xmx3072M -Xms1024M -jar server.jar nogui
```

## サーバの初期設定

コマンドを実行すると、ERRORが出るはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/19f8094e-ef85-e502-6e1a-c22362f9b97f.png)

これは、EULAの規約に同意していない場合に出るエラーです。
server.propertiesファイルの中身を編集する必要があります。

以下のコマンドを実行します。

```
$ vim eula.txt
```

`vim`エディタにより`eula.txt`ファイルが開かれます。
この`vim`は一癖あるエディタなので、詳しい使い方は以下の記事を参考にしていただけると良いと思います。

https://qiita.com/hide/items/5bfe5b322872c61a6896

今回は最低限の書き換えを行います。
コマンドを実行すると、このような画面になるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/15f3bf58-17bd-3b24-866f-f49bede035aa.png)

そうしたら、そのまま`i`キーを押し、画像の位置まで矢印キーでカーソルを動かします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/2e68f9da-2f03-00a3-e94f-c5a2bcd0e05e.png)
そのまま`false`を削除し、`true`に書き換えます。
完了したら、`esc`キーを2回押し、`:wq`と入力し、`Enter`キーを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/54782da3-f9b5-19db-8ba7-201c85303290.png)

途中でうまく行かなかった場合は、`esc`キーを2回押し、`:q!`と入力し、`Enter`キーを入力するともとの画面に戻れますので、もう一度`vim`コマンドの実行から行ってみてください。

これで、先程のコマンドを再度実行すると、少し待った後にMinecraftサーバを建てることが出来ます。

```
$ java -Xmx3072M -Xms1024M -jar server.jar nogui
```

以下の画面になれば、サーバ建ては成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/398b2ee5-a4c5-236a-e4d1-2393e654b449.png)



ちなみに、このウィンドウを閉じてしまうとMinecraftのサーバは停止してしまいます。
もし閉じた後もサーバを動かしたままにする場合は、`screen`コマンドを利用する必要があります。
今回は開きっぱなしを想定しますので、興味ある方はこちらの記事を参考に`screen -r`を実行してみてください。

https://qiita.com/hnishi/items/3190f2901f88e2594a5f

# Minecraftからサーバにアクセスする
ここまででMinecraftサーバを建てることは完了しています。
それでは、いよいよ作成したサーバにMinecraftから入ってみます。

まず、先程のインスタンスの画面から外部IPアドレスをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/da7ee04c-340c-dba2-9e32-f466864d816f.png)


サーバと同じバージョンのMinecraftを起動し、メインメニューのマルチプレイを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/cf0eaa5f-db68-252d-6b07-9136bece5d66.png)

`サーバーを追加`ボタンをクリックし、サーバー名は分かりやすい名前にします。
そして、サーバーアドレスにコピーしたIPアドレスを入力し、完了をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/8755bcb6-dd52-cb0e-1d35-02a0831aee61.png)

すると、サーバーに新しく項目が増えているはずです。選択し、`サーバーに接続`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/e75d308b-224b-804e-c089-ed66db5843ee.png)

無事、マルチサーバに接続できました。お疲れさまでした！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/17bc4e75-c3fb-1fb9-6ef3-8fa196083ee8.png)

先程の外部IPアドレスを友人に教え、接続してもらってください。一緒にプレイできるはずです！


# おわりに
今回GCPで簡単にサーバを建てられたことは非常に驚きました。
慣れてしまえばほんの数十分で新しいサーバを建てられると思います。
コストも（停止さえ忘れなければ）かなり抑えられますし、VPSとかは高いなぁ…と思っている方で友人とマイクラしたい方はぜひ試してみてはいかがでしょうか。




## 参考記事
今回、以下の記事を参考に環境構築をしました。

http://ayati.cocolog-nifty.com/blog/2017/08/gcpgoogle-cloud.html


また、自分は`Java`のインストールで少しハマりました。原因としては、`1.17.1`では`Java 16`が必要なのですが、`Ubuntu 18.04 LTS`で `upgrade`や`update`を行っても`Java 16`インストール用のパッケージが存在しないためです。
そのため、以下の記事を参考にしました。非常に分かりやすかったです。

https://blog.takunology.jp/entry/2021/07/18/004048