AzureでMinecraftサーバー構築する。料金比較もしてみた。

こんにちは。GxPの2年目の小林です。
この記事は[グロースエクスパートナーズ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/gxp)の19日目の記事となります。
本日の記事はAzureでMinecraftサーバーを作成したことを記事にしました。
Azureの仮想マシン作成から設定、利用までの流れを理解するための参考になればと思います。

# はじめに

社内で行っているAzure勉強会で学んだことを何かに使ってみたかったので、自分の好きなゲームであるMinecraftでサーバーを立ててみようと思いました。
また、クラウドの利点として必要な時に起動して使用した時間だけ料金が発生するので、使い方によってはvpsサーバを借りるよりも安くなるのではと思い、料金の比較もしてみました。

# 手順
### AzureでLinuxサーバを作成

Azure Portalから仮想マシンの新規作成画面を開きます。
以下の様に内容をパラメータを設定しました。

|  項目  |  設定値  |  
| ---- | ---- |
|  仮想マシン名  |  MinecraftServer  |
|  地域  |  (Asia Pacific) 東日本  |
|  可用性オプション  |  可用性ゾーン  | 
|  可用性ゾーン  |  1  |
|  セキュリティの種類  |  Standard  |
|  イメージ  |  CentOS-based 8.2 - Gen1  |
|  サイズ  |  Standard_B2s - 2 vcpu、4GiBのメモリ  |
|  認証の種類  |  パスワード  |
|  ユーザ名  |  minecraft-user  |
|  パスワード  |  (任意のパスワード)  |
|  受信ポート  |  SSH (22)  |
|  OSディスクの種類  |  Standard HDD (ローカル冗長ストレージ)  |

![Inkedimage_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303239/fd60e63b-2e46-efc6-5fe5-4be649b05cf5.jpeg)

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303239/98d451a8-5f3d-0462-4731-16ee5013d952.png)


ディスクはStandard HDDを選択しました。
私用なので壊れても問題なく、推奨要件もHDDとSSDで指定は無いので、料金の安いStandard HDDを選びました。
業務などで利用する場合はStandard SSDなどを選択した方が良いかもしれません。

|    |  Premium SSD  |  Standard SSD  |  Standard HDD  | 
| ---- | ---- | ---- | ---- | ---- |
|  シナリオ  |  運用環境のワークロードやパフォーマンスに影響されやすいワークロード  |  Web サーバー、あまり使用されていないエンタープライズ アプリケーション、および開発/テスト  |  バックアップ、重要ではない、不定期に起こるアクセス  |
|  ディスクの種類  |  SSD  |  SSD  |  HDD  |
|  最大スループット  |  900MB/秒  |  750MB/秒  |  500MB/秒  |
|  最大 IOPS  |  20,000  |  6,000  |  2,000  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303239/100fbc82-cf85-1978-08b5-d8ede5a8f7f1.png)


確認及び作成ボタンを押下すると仮想マシンの作成が開始されます。

仮想マシンが作成されたらリソースへ移動します。
仮想マシン>ネットワークからSSHのネットワーク設定を開き、ソースをIP Addressに変更し、ソースIPアドレス/CIDR範囲に自分のグローバルIPを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303239/8e87cc99-9f2c-998f-4aaf-b8b4840df9a9.png)


仮想マシン>概要から開始ボタンを押して仮想マシンを起動します。
![Inkedimage_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303239/689fda8d-754a-c122-449f-e9b29f01900e.jpeg)


仮想マシン起動時に、パブリックIPアドレスが付与されるので、付与されたアドレスを使用してSSH接続します。
![Inkedimage (1)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303239/a0bac67b-36c7-7d1c-be0c-249d8f7441f8.jpeg)





### OpenJDKのインストール

yumインストールやディレクトリ作成にルート権限が必要なためルート化します。

```
[minecraft-user@MinecraftServer]# sudo su -
```

記事作成時最新のMinecraftサーバー1.18.1に対応しているjava-17を以下のコマンドでインストールします。

```
[root@MinecraftServer]# yum install -y java-17-openjdk
```

Minecraft用にインストール先のディレクトリを作成して、作成したディレクトリに移動します。

```
[root@MinecraftServer]# mkdir /var/minecraft
[root@MinecraftServer]# cd /var/minecraft/
```
### Minecraftサーバの最新版をダウンロード

以下から最新版を確認します。
https://www.minecraft.net/ja-jp/download/server

最新版のサーバーのリンクを右クリックしてコピーします。
![スクリーンショット 2021-12-06 195916.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303239/008d8e7d-0568-ad86-8989-eef2932b7249.png)

今回の記事では1.18.1のバージョンを選択しました。
Minecraft1.18以下のバージョンでは、Log4jの脆弱性に対応できていないので注意が必要です。
https://forest.watch.impress.co.jp/docs/news/1373517.html

コピーしておいたリンクをwgetの引数として指定/実行し、server.jarファイルをダウンロードします。

```
[root@MinecraftServer minecraft]# wget https://launcher.mojang.com/v1/objects/125e5adf40c659fd3bce3e66e67a16bb49ecc1b9/server.jar
```

server.jarがダウンロード出来ていることを確認します。

```
[root@MinecraftServer minecraft]# ll
total 29532
-rw-r--r-- 1 root root 30202458 Jun 13 16:00 server.jar
```

今回はMincraftの起動をシェルから行いたいと思います。
「minecraft.sh」を作成し、その中に起動コマンドを記述します。

メモリの割り当てをJVM引数で設定します。
1024Mの値はMinecraftサーバーで使用するメモリの上限になります。
デフォルト値として1024Mを設定しましたが、推奨要件は最低4096Mとなっています。

```
[root@MinecraftServer minecraft]# vi minecraft.sh
#!/bin/sh
java -Xmx1024M -Xms1024M -jar server.jar nogui
```

作成したシェルスクリプトに実行権限を付与します。

```
[root@MinecraftServer minecraft]# chmod o+x minecraft.sh
```

権限を付与できたか確認します。minecraft.shの権限にx（実行権限）が追加されています。

```
[root@MinecraftServer minecraft]# ll
total 29536
-rw-r--r-x 1 root root       72 Jul 11 22:32 minecraft.sh
-rw-r--r-- 1 root root 30202458 Jun 13 16:00 server.jar
```

eula.txtファイルを生成するために一度minecraft.shを実行します。

```
[root@MinecraftServer minecraft]# ./minecraft.sh
```

EULAの使用許諾に同意します。
"eula.txt"というファイルが出来ているので、内容を一部書き換えます。
"eula=false"を"eula=true"に書き換えて内容を保存します。

```
[root@MinecraftServer minecraft]# vi eula.txt
\#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
\#Tue Jul 11 13:34:47 GMT 2017
eula=false
```

再度minecraft.shを実行で正常にMinecraftが起動します。

```
[root@MinecraftServer minecraft]# ./minecraft.sh
```

Minecraftサーバーが起動したことを確認します。
コンソール上にDone (77.886s)! For help, type "help"が表示されれば問題なく起動しています。
本来はMinecraftでサーバーに接続できることを確認しますが、ここでは割愛させていただきます。

```
（省略）
[09:31:34] [Worker-Main-2/INFO]: Preparing spawn area: 10%
[09:31:36] [Worker-Main-2/INFO]: Preparing spawn area: 20%
[09:31:36] [Worker-Main-2/INFO]: Preparing spawn area: 20%
[09:31:36] [Worker-Main-2/INFO]: Preparing spawn area: 20%
[09:31:38] [Worker-Main-2/INFO]: Preparing spawn area: 47%
[09:31:38] [Worker-Main-2/INFO]: Preparing spawn area: 47%
[09:31:38] [Worker-Main-2/INFO]: Preparing spawn area: 47%
[09:31:38] [Worker-Main-2/INFO]: Preparing spawn area: 47%
[09:31:38] [Worker-Main-2/INFO]: Preparing spawn area: 54%
[09:31:39] [Worker-Main-2/INFO]: Preparing spawn area: 65%
[09:31:39] [Worker-Main-2/INFO]: Preparing spawn area: 68%
[09:31:40] [Worker-Main-2/INFO]: Preparing spawn area: 89%
[09:31:43] [Server thread/INFO]: Time elapsed: 70354 ms
[09:31:43] [Server thread/INFO]: Done (77.886s)! For help, type "help"
```

# 詰まりポイント
### IP制限
IP制限の許可を行っておらず、Minecraftサーバーに入れませんでした。
仮想マシンのリソースを開いてネットワークの欄の「受信ポートの規則を追加する」ボタンを押して、受信セキュリティ規則の追加を開き自分のグローバルIPを割り当てる必要がありました。
![スクリーンショット 2021-12-15 172548.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303239/741e4d21-bc8b-8b6e-fff7-9cc21bad7915.png)


### メモリ割り当て
minecraft.shのファイルの記述のメモリ割り当てが小さすぎて、最初はサーバーに入っても動けませんでした。2GB割り当てでシングルプレイは可能でした。マルチプレイなら4GB必要です。

# 感想と料金比較
Linuxコマンドは業務で少し触っていたのですが、今までは手順書通りにしか動かしたことがありませんでした。今回のMinecraftサーバの作成でLinuxコマンドについても楽しく学ぶことが出来ました。業務で行っている作業が何をしているのか少しだけ分かるようになり良かったと思います。

1ヶ月あたりの料金について、同じメモリのvpsサーバーと比較してみました。
Azureサーバーは土曜日と日曜日だけ24時間つけっぱなしにして合計192時間の稼働でした。

|    |  Azureサーバー  |  ServersMan  |  さくらのVPS  |  クラウドVPS  |
| ---- | ---- | ---- |  ----  |  ----  |
| 料金 |  1205円  |  2074円  |  3520円  |  2728円  |  
|  メモリ  |  4GB  |  4GB  |  4GB  |  4GB  |
|  ディスク容量  |  8GB  |  200GB  |  200GB  |  100GB  | 

土日だけ遊ぶならAzureサーバーの方が1205円と一番安くなることが分かりました。Azureサーバーの方がディスク容量が小さいのですが、Minecraftサーバーの推奨要件のディスク容量が250MBと記載されているので、問題ないと思います。


# 参考
<https://docs.microsoft.com/ja-jp/azure/virtual-machines/disks-types>

<https://dream.jp/vps/charge.html>

<https://vps.sakura.ad.jp/>

<https://vps.gmocloud.com/>

<https://minecraft.fandom.com/ja/wiki/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC/%E8%A6%81%E4%BB%B6>