Minecraftの統合版サーバーbedrockをitamaeで構築する

[itamae](https://github.com/itamae-kitchen/itamae)のレシピとしてマインクラフト統合版のrecipeが無かったため作りました！！
[itamae-plugin-recipe-bedrock_server](https://rubygems.org/gems/itamae-plugin-recipe-bedrock_server)
インスタンスを立ち上げるとbedrockサーバーが自動で起動します。

[Minecraft Server Download](https://www.minecraft.net/en-us/download/server/bedrock/)の[Minecraft End User License Agreement](https://account.mojang.com/terms)と[Privacy Policy](https://privacy.microsoft.com/ja-jp/privacystatement)を読んでから進めましょう!!
 
## 環境

- Microsoft Azure
- Ubuntu 18.04 LTS
- Ruby 2.5.5([Azure Cloud Shell](https://docs.microsoft.com/ja-jp/azure/cloud-shell/overview))

MinecraftはMicrosoftによって開発されているので今回はAzureで構築方法を紹介します。今なら¥22,500分無料で使えます:green_heart:[^1]
[仮想マシンの作成](##仮想マシンの作成)以外はConohaやGCP, AWSでもネットワークは同様に使用できます。

## 作業プロジェクトの作成
`azure-minecraft-server`というサーバー名で始めます。素敵な名前をつけて上げてください👶
何度も使用するため、変数として扱ってすすめます:rocket:

```bash

SERVER_NAME=azure-minecraft-server
mkdir ${SERVER_NAME}
cd ${SERVER_NAME}
```

最後には下記のような構成になります。

```bash
.
├── .ssh
│   └── id_rsa
└── azure-minecraft-server
    ├── Gemfile
    ├── Gemfile.lock
    ├── node.yml
    └── recipe.rb
```

## Gemfileの作成

Gemfileを作成します。
GemfileとはJavaScriptで言う`package.json`です✍️

```Gemfile
source 'https://rubygems.org'

gem 'itamae'
gem 'itamae-plugin-recipe-bedrock_server'
```

保存しましたら、`bundle install`を行います。
`bundle install`とは、Javascriptでいう`npm install`です:memo:

```bash
bundle
```

## 設定ファイルの作成
node.ymlを作成します。

詳しい設定は[Official Minecraft Wiki Server.properties](https://minecraft.gamepedia.com/Server.properties#Bedrock_Edition_3) を見てください。殆どの場合は変更しなくて大丈夫でしょう。
自分で構築するサーバーの醍醐味として、server-name, max-playersを今回は設定します:+1:


```node.yml
bedrock_server:
  configuration:
    server-name: "Azure Minecraft Server"
    max-players: 1000
```

## recipeの作成
itamaeではプロビジョニングファイルのことをrecipeと読んでいます。recipe.rbを作成します。
Gemfileに`gem 'itamae-plugin-recipe-bedrock_server'`を追加したため、bedrock_serverのインストール、インスタンス起動時の自動起動は1行で済みました:tada:
残りの3行は、Minrcraftのデフォルトポート19132を許可します。

```recipe.rb
include_recipe 'bedrock_server'

execute 'ufw --force enable'
execute 'ufw allow 19132/udp'
execute 'ufw reload'
```

## 仮想マシンの作成
今回はAzure CLIで作成します。ConohaまたはGCP, AWSを使用している場合、この章はそれぞれの方法で仮想マシンを作成し、SERVER_ADDRESSにアドレスを代入し、次の章へ飛ばしてください。
Azure Cloud Shellを使用しているのでazコマンドがすでにインストール済みです🤟
便利なことに秘密キーは~/.ssh/id_rsaとして使え、itamae実行時のコマンドが少なくなります🙆
今回は西日本にリソースグループを作成します。
マシンタイプはデフォルトだとStandard_DS1_v2が選ばれます。料金は[リンク](https://azure.microsoft.com/pricing/details/virtual-machines/)で確認してください。
作成後、Minecraftのデフォルトポート19132を許可します。

```bash
# リソースグループの作成
az group create -l japanwest -n ${SERVER_NAME}_group

# 仮想マシンの作成
az vm create \
  -g ${SERVER_NAME}_group \
  -n $SERVER_NAME \
  --image UbuntuLTS \
  --admin-username azureuser \
  --nsg ${SERVER_NAME}-nsg \
  --generate-ssh-keys

# 19132ポートを許可
az network nsg rule create \
  -g ${SERVER_NAME}_group \
  --nsg-name ${SERVER_NAME}-nsg \
  -n MinecraftBedrock_Port \
  --priority 100 \
  --destination-port-ranges 19132 \
  --protocol Udp

# IPアドレスの取得
SERVER_ADDRESS=$(
  az vm list-ip-addresses \
    -g ${SERVER_NAME}_group \
    -n ${SERVER_NAME} \
  | jq -r '.[0].virtualMachine.network.publicIpAddresses[0].ipAddress'
) && echo ${SERVER_ADDRESS}
```

## itamaeの実行
これで最後です。
作成した仮想マシンにbedrock serverをインストールします。驚くことに一撃です！

```bash
bundle exec itamae ssh -u azureuser -h ${SERVER_ADDRESS} --node-yaml=node.yml recipe.rb
```


## 接続
サーバーのIPアドレスを確認します。
ここでは、`127.0.0.1`がサーバーアドレスとして返却される例を示しています。
Minecraftを開きサーバーアドレスを入力してください。少し長いローディングのあと、世界が開けるでしょう。お疲れ様でした👐

```bash
echo ${SERVER_ADDRESS}
# => 127.0.0.1
```

## 次にやることは?
今回は1コアのサーバーを作成しました。少ない人数だと大丈夫かもしれませんが、大人数だと遅く感じるでしょう。マシンサイズの変更を行ってみましょう！
[Japan Minecraft Servers](https://minecraft.jp/)にサーバーを登録し、仲間と交流しましょう！
`127.0.0.1`というサーバーアドレスは覚えづらい?ドメインを購入してみましょう！

[^1]: https://azure.microsoft.com/ja-jp/free/free-account-faq/