MinecraftサーバをAWSで立ててみた

# はじめに
<!-- 発端や概要を記載 -->
AWSの勉強をしているうちに、「実際なにかサーバ運用してみたほうが勉強になるのでは？」と思い、マイクラサーバを立ててみることにしました。
小さな構成でまずはサーバを構築してみて、徐々にIaC、監視、可用性追求等していきAWSを使ったサーバ運用を体験できればなと思っています。

とりあえず現時点では深いことを考えず、まずは初回ということでシンプルにマイクラサーバを構築していきたいと思います。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Minecraftサーバとは？](#Chapter1)
1. [ネットワーク/サーバ構成](#Chapter2)
1. [Minecraftサーバ構築](#Chapter３)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Minecraft サーバとは？
実はそんなにマイクラをやったことありません！！！！！
全くプレイしたことないわけではないのですが、マイクラ自体に詳しいわけではないです

(裏目標としてサーバたててエンドラ討伐目指すか...)

というわけで、そもそもMinecraftにおけるサーバが何たるかを調べてみました。
[minecraft japan wiki](https://minecraftjapan.miraheze.org/wiki)

> Minecraftにおけるサーバーとは、マルチプレイをする手段を提供するソフトウエアを指す。
Minecraftにおいて、サーバーを建てることがマルチプレイをする主な手段となっている。

なるほど、まあ想像通りですね。
ライセンスも念の為確認しましたが、サーバを公開しても、収益化をするようなことをしなければ問題なさそうです。

また、MinecraftサーバはJavaで動作し構築難易度も高くなさそうなので、サーバ運用を試したいという目的にはぴったりな気がしました。

<a id="#Chapter2"></a>
# ネットワーク/サーバ構成
AWSの勉強ということで、もちろんマイクラサーバはAWS上に構築していきます。
まず構成図は以下です。
![minecraft_server.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340134/a1b2dc67-f9a9-90c3-1aef-a84a9cc5c874.jpeg)

ネットワーク構成については今回はざっくりポイントだけ記載しようと思います（詳細は次回とします）
- 今後リソースが増えることを想定して２AZ構成でSubnetも事前に作成しておく
- 運用コストをできるだけ下げたいのでNat　Instanceを１台のみ作成（AZ 1cのSubnetからもこのNat Instance経由でインターネットに出ていく）
- SSHはSSM経由で行うこととする
- なんやかんやできるAnsibleサーバ作っておく

<a id="#Chapter３"></a>
# Minecraftサーバ構築
本記事の本題、Minecraftサーバ構築やっていきたいと思います。

今回は以下のEC2インスタンスのスペックで作成してみました。今後スペック等は変更するかもしれませんが、まずはMinecraftサーバの構築手順の確認ということで深くは考えずに選定しました。

|項目|値|
|:---:|:---:|
|インスタンスタイプ|t3.small(vCPU:2, メモリ:2GiB)|
|OS|Alma Linux 8|

インスタンスの作成後、サーバに乗り込みMinecraftサーバのインストール設定を実施します。

### Javaのインストール
以下コマンドでJavaのインストールを実施します。
現時点(2022.12.20)で最新バージョンのMinecraft（1.19.x）の動作にはJava16が必要とのことだが、現時点でのJava最新バージョンがJava17であるためこちらをインストール。（Java17でも正常に動作することを確認できました）

```
sudo dnf -y update 
sudo dnf -y install java-17-openjdk-headless-1:17.0.5.0.8-2.el8_6.x86_64
```

### Minecraftのインストール
以下コマンドでMinecraftのインストールを行います。

```
mkdir /etc/minecraft/
cd /etc/minecraft/
sudo java -Xmx1024M -jar server.jar nogui
```

初回は必ずエラーでストップします。
```
Starting net.minecraft.server.Main
[17:46:10] [ServerMain/INFO]: Building unoptimized datafixer
[17:46:13] [ServerMain/ERROR]: Failed to load properties from file: server.properties
[17:46:13] [ServerMain/WARN]: Failed to load eula.txt
[17:46:13] [ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
```

ライセンスに同意する旨を記載するため、同ディレクトリに作成された`eula.txt`を編集します。
```
eula=false　(削除)
eula=true 　(追加)
```
もう一度起動し、動作することを確認します。
```
sudo java -Xmx1024M -jar server.jar nogui
Starting net.minecraft.server.Main
[17:53:02] [ServerMain/INFO]: Building unoptimized datafixer
[17:53:04] [ServerMain/INFO]: Environment: authHost='https://authserver.mojang.com', accountsHost='https://api.mojang.com', sessionHost='https://sessionserver.mojang.com', servicesHost='https://api.minecraftservices.com', name='PROD'
[17:53:09] [ServerMain/INFO]: Loaded 7 recipes
[17:53:10] [ServerMain/INFO]: Loaded 1179 advancements
[17:53:11] [Server thread/INFO]: Starting minecraft server version 1.19.3

...
```

### デーモン化
実行できることは確認できたので、デーモン化の設定を行います。
まずは実行ユーザを作成します。
```
useradd -M minecraft
```

起動用スクリプトを作成します。

```
touch /etc/minecraft/boot.sh
echo '#!/bin/bash' >> /etc/minecraft/boot.sh
echo 'java -Xms$XMS_SIZE -Xmx$XMX_SIZE -jar /etc/minecraft/server.jar nogui' >> /etc/minecraft/boot.sh
chmod +x /etc/minecraft/boot.sh
```

Javaの実行メモリ容量指定用の環境変数ファイルを作成します。

```
touch /etc/minecraft/environments
echo 'XMS_SIZE=1024M' >> /etc/minecraft/environments
echo 'XMX_SIZE=1024M' >> /etc/minecraft/environments
```

`minecraft`ユーザでサービス実行するので`/etc/minecraft`配下の所有者を変更します。

```
chown -R minecraft:minecraft /etc/minecraft
```

最後にサービス定義ファイルを作成します。
```
vi /etc/systemd/system/minecraft-server.service
```

```:minecraft-server.service
[Unit]
Description=Minecraft Server
After=network-online.target

[Service]
ExecStart=/bin/bash /etc/minecraft/boot.sh
EnvironmentFile=/etc/minecraft/environments
WorkingDirectory=/etc/minecraft
Restart=always
User=minecraft
Group=minecraft

[Install]
WantedBy=multi-user.target

```

### サービス起動/接続確認
以下コマンドで`minecraft-server`サービスを起動します。
（ついでに自動起動設定もしておきます）

```
sudo systemctl enable minecraft-server
sudo systemctl start minecraft-server
sudo systemctl status minecraft-sever
● minecraft-server.service - Minecraft Server
   Loaded: loaded (/etc/systemd/system/minecraft-server.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-12-28 06:54:37 UTC; 41min ago
 Main PID: 3032 (bash)
    Tasks: 30 (limit: 12022)
   Memory: 1.3G
   CGroup: /system.slice/minecraft-server.service
           ├─3032 /bin/bash /etc/minecraft/boot.sh
           └─3033 java -Xms1024M -Xmx1024M -jar /etc/minecraft/server.jar nogui

Dec 28 06:55:13 ip-10-8-3-180.ec2.internal bash[3033]: [06:55:13] [Worker-Main-1/INFO]: Preparing spawn area: 0%
Dec 28 06:55:14 ip-10-8-3-180.ec2.internal bash[3033]: [06:55:14] [Worker-Main-1/INFO]: Preparing spawn area: 0%
Dec 28 06:55:14 ip-10-8-3-180.ec2.internal bash[3033]: [06:55:14] [Worker-Main-1/INFO]: Preparing spawn area: 96%
Dec 28 06:55:14 ip-10-8-3-180.ec2.internal bash[3033]: [06:55:14] [Server thread/INFO]: Time elapsed: 13448 ms
Dec 28 06:55:14 ip-10-8-3-180.ec2.internal bash[3033]: [06:55:14] [Server thread/INFO]: Done (22.262s)! For help, type "help"
```

[クライアントからの接続](https://arekoreport.net/minecraft-how-to-connect-with-multiplay-server/)確認し、ワールドで遊べることを確認できました。

![minecraft_connected.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340134/8d9f9917-f723-5f02-1c55-faca2657ab31.png)

<a id="#reference"></a>
# 参考文献
- [mimecraft japan wiki](https://mimecraftjapan.miraheze.org/wiki/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%AE%E7%A2%BA%E8%AA%8D%E7%AD%89)
- [Amazon Linux 2でMinecraftサーバーをたててみた](https://wp-kyoto.net/launch-minecraft-server-in-amazon-linux-2/)