Azure仮想マシンにMINECRAFT(Bedrock Edition)サーバを立てる

# はじめに
MINECRAFT面白いですね！
時間がどんどん奪われていきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/ee094ccc-d925-bb04-b1d4-916ae3bdc315.png)

本腰を入れる時にはWindows版を使って、ライトな作業の時にはiPhone版を使いたい、、といった欲求を満たすために、Azure上にMINECRAFTサーバを立てました。

[REALMS](https://minecraft.net/ja-jp/realms/)に課金すれば複数台のクライアントから同時接続したり、端末を変更して好きな環境で切り替えて利用可能なのは分かっているのですが(2ユーザで480円/月)、技術的欲求を満たしたく、Azure上の仮想マシンで構築してみました。

# サーバソフトウェアのダウンロード

まずは適当なPCで公式サイトから、Ubuntu版のサーバソフトウェアをダウンロードしてきます。

[MINECRAFT 用サーバーソフトウェア (アルファ版) をダウンロード](https://minecraft.net/ja-jp/download/server/bedrock/)

利用許諾のチェックを入れて「ダウンロード」でbedrock-server-1.7.0.13.zip (2018/12/10時点のVersion)をダウンロードします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/a3062697-8292-fcf6-4971-7620eee8787b.png)

# Azure仮想マシンのデプロイ

Ubuntu仮想マシン1台だけを上げるだけなので、仮想ネットワークなどの設定も全てMarketplaceのデフォルト設定におまかせします。

リソースの作成で「Ubuntu Server 18.04 LTS」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/97707523-43d6-c7de-b315-956dbc6be586.png)

## 基本
基本項目では以下の内容を確認して設定します。

- リソースグループ：他で使われていない新規グループを作成
- 地域：MINECRAFTを最も良く利用する地域(通常は東日本か西日本)を選択
- 仮想マシン名：適当
- サイズ：あまり大きいサイズにすると課金が心配になるので、今回はF1S(1Core 4GB Memory)を選択。接続ユーザが増える場合はこちらのサイズを後から上げる予定
- 受信ポートの規則：とりあえずはssh接続のための22番ポートのみ空けておきます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/29c0b5ce-a415-8ea4-4e5c-eecf00ff4126.png)

## ディスク
ディスク項目ではOSディスクの種類をとりあえず「Standard SSD」にしておきます。ディスク性能が気になる場合には後から「Premium SSD」に変更しても良いですが、今回はお試しなので。

特にデータディスクは今回追加しません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/2486c874-e579-ad3a-b221-3d372bb0fe7a.png)

## ネットワーク
ネットワーク項目も特に変更せずに適用します。
仮想ネットワークのCIDRなどデフォルトのままで気になる場合は適宜修正します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/470ce38b-55a3-e521-360e-2d8112c3c80a.png)

##管理
(なんども言いますが)今回は堅牢性の高いシステム構築という訳ではないので監視の「ブート診断」もOFFにしちゃいます。こちらの有効にする場合は別途ストレージアカウントも必要になるため。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/2b4682b2-e4d7-7750-87a0-1fa4efcae8db.png)

##作成
最後に「作成及び確認」のページから「作成」をクリックして仮想マシンを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/47e6c021-9769-9cda-5b6b-be5918fac174.png)

##必要なポート開放とDNS名付与
仮想マシンの作成が完了したら、MINECRAFTに必要なポート 19132 を開放します。
作成したリソースグループ内にNSGが出来ているのでそちらを開いて「受信セキュリティ規則」に追加します。

- ソース：Any
- ソースポート範囲：*
- 宛先：Any
- 宛先ポート範囲：19132
- プロトコル：Any
- アクション：許可
- 名前：MINECRAFT

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/579436ff-d919-0e53-a5be-cb82560f71df.png)

続いて、パブリックIPアドレスのリソースを開いて「構成」からDNS名ラベルを設定します。
こちらを設定しておくと、MINECRAFTの接続設定でいちいちIPアドレスを入れなくても「任意の名前.リージョン名.cloudapp.azure.com」でアクセスが可能になります。

任意のDNS名ラベルを入力後、「保存」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/b3e21990-4a32-152d-dd77-b90f80d7d815.png)

# MINECRAFTサーバの設定

## ファイルの転送
クライアントPC上に保存したzipファイルを作成した仮想マシンにコピーします。
scpを利用すると簡単なので、クライアントPCに適当なソフト(WinSCPなど)を入れて転送します。
Windows 10でしたら、WSLを使ってscpコマンドを叩くのが簡単です。

```sh
$ scp -p bedrock-server-1.7.0.13.zip azureuser@ktkrmine.japaneast.cloudapp.azure.com:.

azureuser@ktkrmine.japaneast.cloudapp.azure.com's password:
bedrock-server-1.7.0.13.zip                                                           100%   17MB  18.3MB/s   00:00
```

## ファイルの展開
Ubuntu 18.04には標準でunzipコマンドが入っていないので、以下の操作でインストール後にzipファイルを展開します。

```sh
$ sudo apt -y install unzip
```

```sh
$ unzip bedrock-server-1.7.0.13.zip
Archive:  bedrock-server-1.7.0.13.zip
  inflating: bedrock_server
  inflating: bedrock_server_how_to.html
   creating: behavior_packs/
   creating: behavior_packs/vanilla/
   creating: behavior_packs/vanilla/loot_tables/
   creating: behavior_packs/vanilla/loot_tables/chests/
   ...
   ...
$ ls
bedrock-server-1.7.0.13.zip  behavior_packs  release-notes.txt  structures
bedrock_server               definitions     resource_packs
bedrock_server_how_to.html   libCrypto.so    server.properties
```
## 空の設定ファイル作成
ops.jsonとwhitelist.jsonは最初に空のものを作成しておく必要があるので、以下のコマンドで作成しておきます。

```sh
$ touch ops.json
$ touch whitelist.json
```


## MINECRAFT設定ファイルの変更
server.properties ファイルを開きます。
「server-name」はお好みの名前に修正。
「game-mode」もサバイバルから変更したい場合には修正します。
「allow-cheats」をtrueにすると公式チートが楽しめるので私は有効化します。
他はお好みで。

```server.properties
server-name=KTKR Server
# Used as the server name
# Allowed values: Any string

gamemode=survival
# Sets the game mode for new players.
# Allowed values: "survival", "creative", or "adventure"

difficulty=easy
# Sets the difficulty of the world.
# Allowed values: "peaceful", "easy", "normal", or "hard"

allow-cheats=true
# If true then cheats like commands can be used.
# Allowed values: "true" or "false"

max-players=10
# The maximum number of players that can play on the server.
# Allowed values: Any positive integer
...
```

#自動起動の設定

MINECRAFTサーバはデーモンモードではなく、フロントエンドのアプリケーションです(少なくとも現在のアルファバージョンは)
サーバプログラム実行後にコマンドラインから各種コマンド(give UserName diamond 64 とかw)が打てるため、OS起動時にバックグラウンドで動作させるとちょっと困り物です。
かといって、sshでログインした状態でずっとサーバプログラムをフォアグラウンドで動かしておくわけにもいかないので、「screen」コマンドを使うことにします。

OS起動時にユーザ権限でscreenセッションを開始して、その中でbedrock_serverを起動させます。起動後はすぐにscreenセッションをデタッチさせて裏で動作させます。
チートコマンドを打ちたくなった時にはsshで仮想マシンにログイン後、screen -rでbedrock_serverセッションに接続します。

再びscreenをデタッチさせて裏で動作させつづける時には「Ctrl-A」「d」で再度screenセッションからデタッチして、sshもlogoutすればOKです。

## initファイル
以下のファイルをroot権限で、/etc/rc.local に保存します。

```sh:/etc/rc.local
#!/bin/sh

USERNAME=$(grep 1000:1000 /etc/passwd | cut -d ':' -f 1)
sudo -iu $USERNAME /usr/bin/screen -dmS BE01 bash -c 'LD_LIBRARY_PATH=. ./bedrock_server; exec bash'
```

/etc/rc.localに実行権を付与するのもわすれないように。

```sh
$ sudo chmod +x /etc/rc.local
```

##動作確認
以下のコマンドで一旦OSを再起動します。

```sh
$ sudo shutdown -r now
```

再起動後、再びsshでログインして、screenのセッション状態を確認します。

```sh
$ screen -ls
There is a screen on:
        1187.BE01       (12/10/18 00:41:55)     (Detached)
1 Socket in /run/screen/S-azureuser.
```

実際にscreenセッションにアタッチすると、bedrock_serverが起動状態で有ることが確認できます。

```sh
$ screen -r
NO LOG FILE! - setting up server logging...
NO LOG FILE! - [2018-12-10 00:41:58 INFO] Starting Server
NO LOG FILE! - [2018-12-10 00:41:58 INFO] Version 1.7.0.13
NO LOG FILE! - [2018-12-10 00:41:58 INFO] Level Name: Bedrock level
NO LOG FILE! - [2018-12-10 00:41:58 INFO] Game mode: 0 Survival
NO LOG FILE! - [2018-12-10 00:41:58 INFO] Difficulty: 1 EASY
NO LOG FILE! - [2018-12-10 00:42:01 INFO] IPv4 supported, port: 19132
NO LOG FILE! - [2018-12-10 00:42:01 INFO] IPv6 supported, port: 19133
NO LOG FILE! - [2018-12-10 00:42:02 INFO] Server started.
```

screenセッションを抜けるには「Ctrl-A」「d」を押します。

```sh
[detached from 1187.BE01]
azureuser@testbevm:~$
```

後はsshはlogoutしても裏でbedrock_serverは動き続けています。

# MINECRAFEからの接続
MINECRAFTを起動して、「遊ぶ」から「サーバー」を選択後、「サーバの追加」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/515b14ed-1115-fae4-883b-2f1bc166fa84.png)


「サーバ名」は適当に。
「サーバアドレス」には先にAzure上のパブリックIPアドレスのDNS名で指定した「名前.リージョン名.cloudapp.azure.com」を入力します。
ポートはデフォルトの19132でOKです。
最後に「遊ぶ」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/b37d971e-9732-4d99-3360-e2f8016de783.png)

しばらく「検索中」と出ますが、その後ちゃんとワールドが生成されてゲームにログインできました！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/588d0a0b-7d30-bd2e-d074-61fe6a395408.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/f24094ec-c4dc-e57f-aa5c-cb59e1ca508c.png)

上記画面はWindows 10用のものですが、iPhoneからもちゃんと接続できます(Wi-Fi環境必須ですが)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/57370af2-78e1-56cc-a54b-e56b607960a6.png)

管理コンソールからダイヤと木材を与えて、いきなり高装備から遊ぶことも可能！(よいこは真似しないでね)

```sh
NO LOG FILE! - [2018-12-10 00:51:14 INFO] Player connected: 2535422317120297
NO LOG FILE! - [2018-12-10 00:54:01 INFO] Player disconnected: 2535422317120297
NO LOG FILE! - [2018-12-10 00:55:12 INFO] Player connected: 2535422317120297
list
There are 1/10 players online:
anonymousUser
give "anonymousUser" diamond 64
Gave Diamond * 64 to anonymousUser
give "anonymousUser" planks 64
Gave Oak Wood Planks * 64 to anonymousUser
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/61339792-c232-f2e3-2386-9cbe41e7a0f2.png)


#おわりに
REALMSの月契約分の方が、Azure仮想マシン代よりも安いというツッコミどころはありますが、自鯖で色々MINECRAFTのレアな使い方をしたい場合にはおすすめかと思います。

本記事は全て試験目的で設定した内容であるため、Azure側のセキュリティや可用性など全て無視した構成になっています。
本記事を元に構築したMINECRAFTサーバでなにか不利益が生じた際にも一切の責任は取れませんので、完全に自己責任でお願いします。