【GCP】マイクラのソロワールドをGCPでマルチサーバーにした話【minecraft】

# はじめに
MinecraftのJava版ソロワールドのデータを、GCPのCompute Engineを使用してマルチサーバーを立ち上げ、そちらに移す作業を行いました。

今回は鯖立てに至った経緯から、サーバーを立てて実際にワールドに参加するところまでの流れについてまとめていきたいと思います。

## 目的
もともとシングルプレイのワールドで遊んでおり、友人とマルチプレイをしようとなった際、そのワールドを使い都度`LANに公開`からポート番号の設定を行い公開し、別途ポート開放を行っていたのですが、その作業を毎回するのが面倒だと感じ最初からサーバーとして立てておけば毎回作業する必要もなくなると考えました。

その際、自宅鯖では常時PCを起動しておかなければいけないなどの問題から、クラウドの勉強を兼ねてGCPでサーバーを立てることにしました。

# 1.アカウント登録
以下のサイトからGCPのアカウント登録を行います。

https://cloud.google.com/

ニーズの説明を選択し利用規約に同意して続行を選択し、電話番号・クレジットカード情報などを入力して完了を押すとGCPが利用可能になります。

# 2.仮想マシンの作成
ダッシュボード画面左上に表示されるハンバーガーメニューより`Compute Engine`の`VMインスタンス`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/f838e77b-c61b-acd6-df23-cf76091a958c.png)

VMインスタンスの画面が表示されるので、`インスタンスを作成`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/ab91a5c3-969d-6c6e-82c3-9e0526001176.png)

インスタンスの作成画面になるので、設定を行います。
基本的な構成はお財布などと相談し、それぞれのお好みで設定してください。
今回私はできるだけ安くなるよう、リージョンには一番料金のかからない`us-west4(ラスベガス)`を選択し、マシンの構成も安価の`E2`とし、マシンタイプもサーバーに大人数が入るわけではないので、基本の`e2-medium`としました。
また、可溶性ポリシーのVMプロビジョニングモデルを、`標準`から`スポット`に変更しておくことでさらに価格を抑えることができるためおすすめです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/9ed61181-85af-a9cf-0fa0-f2ede7746d0d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/adcc7a4e-7ff5-5d31-44ce-47d3f5182a67.png)

ブートディスクなどの設定もお好みでいいと思います。
ファイアウォールはHTTP/HTTPSどちらのトラフィックも許可しておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/36f297be-7230-5cd5-6a78-496ba4771aa8.png)

デフォルトの設定ではVMを起動するたびにIPアドレスが変更されてしまうので、IPアドレスの設定もしておきましょう。
最下部の`詳細オプション`を展開し、さらにその中の`ネットワーキング`を展開します。そしたら、その中の`ネットワークインターフェース`を開き、`プライマリ内部IPv４アドレス`の中にある`静的内部IPV4アドレスを予約`を選択します。
そこで任意の名前をつけて`予約`を選択することで、静的アドレスを設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/abf2cb16-c458-ec61-121f-aa7fad93ce1a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/de23e4d1-6db5-dcb3-71f4-ec916937c928.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/38280a0d-f033-f89e-cdab-cf70ab039bc2.png)

ここまで出来たら下の`作成`をクリックしインスタンスを作成します。

# 3.作成したインスタンスの設定
## 3-1.サーバーの作成
インスタンスの作成後SSHを選択し、接続を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/124b829e-102b-1040-4350-e7d524974503.png)

接続が完了したらパッケージのアップデートとアップグレードを行います。
```
sudo apt update && sudo apt upgrade
```

次にサーバーを立てるためのserver.jarを動かすためのJREをインストールします。
```
sudo apt install -y default-jre-headless
```

それができたらminecraftのサーバーをインストールするために、ディレクトリを作成し移動します。
```
mkdir minecraft
cd minecraft
```
ディレクトリを移動したら以下のURLから。最新バージョンのserver.jarをダウンロードするURLをコピーして下記のコマンドを実行しダウンロードします。
今回であればバージョン`1.20.4`をダウンロードしています。

https://www.minecraft.net/ja-jp/download/server

```
curl -OL https://piston-data.mojang.com/v1/objects/8dd1a28015f51b1803213892b50b7b4fc76e594d/server.jar
```

ダウンロードができたらサーバーを一度起動します。

```
java -Xmx1024M -Xms1024M -jar server.jar nogui
```
これにより作成されるeula.txtをnanoやvimなどのエディタで開き、その中の`eula=false`を`eula=true`に書き換えます。
```
vi eula.txt
```
再度サーバーを起動するとワールドなどのデータが作成されます。
これでサーバーの作成は一旦完了です。
新規ワールドでプレイしたい場合、インスタンスの設定はここまでで大丈夫です。

## 3-2.シングルプレイのワールドを移動
ここからは、既存ワールドをローカルからインスタンスへの移動を行います。
事前にローカル上のシングルプレイで利用しているワールドのデータを、zipファイルに圧縮しておきます。
SSH接続をしている画面上部にある`ファイルをアップロード`をクリックし、`ファイルを選択`で先ほど作成したzipファイルを選択し、ファイルを`アップロード`をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/f3edb6ce-a1b2-3a2f-678a-75bbf2964dbf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/a4fe9510-2681-42f6-0e8e-00a88b61ead3.png)

アップロードが完了すると`/home/user(ユーザー名)`にzipファイルが追加されていると思います。そしたら、ディレクトリminecraft内にあるworldフォルダを削除し、zipファイルをminecraftディレクトリに移動させます。
```
cd minecraft
sudo rm -rf world
cd ..
sudo mv world.zip minecraft
```
移動が完了したらzipファイル解凍のためにunzipをインストールします。
```
sudo apt install -y unzip
```
インストールが完了したらmincraft内に移動し解凍し、解凍したフォルダ名をworldに変更してください。
これによりワールドデータの移動が完了です。
```
cd minecraft
sudo unzip world.zip
sudo mv ファイル名 world
```

# 4.ファイアウォールの設定
作成したインスタンスに外部から接続できるように、minecraftサーバーで使用するポートを開放します。
`VPCインスタンス`の`ファイアウォール`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/b39de276-ad79-5a44-e742-fc4881e0748f.png)

新しくルールを追加するために`ファイアウォールルールを作成`をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/fae58c28-5f02-109f-4967-6b0ceb62da5a.png)

名前は各々任意のわかりやすいものにします。
下へスクロールし、`ターゲットタグ`に分かりやすいような任意のタグ名を付け、`送信元IPv4範囲`に「0.0.0.0/0」を設定して、`プロトコルとポート`にminecraftのデフォルト値の`tcp:25565`を設定します。
以上の設定を行ったら`作成`をクリックすることでルールが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/a7d3def1-f069-f86a-898f-19850ccd5b36.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/bc99694c-1a2f-6780-8f6b-b6edc5687299.png)

次に、このファイアウォールルールを仮想マシンに適用します。
`VMインスタンス`に戻り適用する仮想マシンを指定し、`編集`をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/57bf01b7-5d45-add7-5479-9eae5eed5b74.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/a406db64-9212-46bc-95f6-2a179da47213.png)

`ネットワークタグ`の設定部分にターゲットタグで設定したものと同じタグを設定して保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/0b3b1860-9b2d-3265-3283-ed3f7a1a00ad.png)

これでアクセスができるようになったはずです。

# 5.minecraftに接続
## 5-1.screenコマンドを使用しサーバーの起動
SSH接続でサーバーを起動した後、接続が切れた後でもサーバーが持続できるように、`screen`コマンドを使用してサーバーを起動します。
```
screen -S minecraft java -Xmx1024M -Xms1024M -jar server.jar nogui

起動後：ctrl + a -> d
```

現状のセッションを確認する場合は
```
screen -ls
```
起動している内部に入る場合
```
screen -r minecraft
```
などのコマンドを使ってください。

これでサーバーが立ち上がったはずです。
## 5-2.サーバーに接続
`マルチプレイ`から`サーバーを追加`をクリックし、サーバーアドレスに今回構築した仮想マシンのIPアドレスを入力し、完了をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/731df73e-9d1c-eec1-cd76-bd795520e7be.png)

追加したサーバーへ接続可能になっていれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/6385c749-9870-dbf7-ae8d-532ad832fc4a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/e293093c-437d-a724-3c68-7a4f51d51582.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697258/390db1f1-5b36-c45a-e598-1a8d15089e61.png)

# まとめ
今回GCPを使用してminecraftに接続するまでを行い、クラウドコンピューティングの基礎的な何となくの知識は得ることができたのではないかと感じました。
スペック等がどれくらい負荷をかけても大丈夫なのかなどのことは、追々行っていこうと思います。

# 参考にさせていただいた記事

https://qiita.com/go_kitchen/items/465bf17e4b79ee3415c7

https://zenn.dev/okayuuuuu/articles/034777523c33fa