AWSを利用して統合版Minecraftサーバーを可能な限りお金をかけずに構築・運用したい

#はじめに
本記事は統合版MinecraftをSwitchやPS4などで遊んでいる方で、サーバーを立ててマルチで遊びたいけどたまにしか遊ばないため月額料金でRealmサーバーを購入するのは微妙という方向けの記事になります。

また、好きな時に入れるように常時起動型のサーバーになります。

人数は試した限りでは同時接続6人までであれば問題ありませんでしたが、頻繁に遊ぶ場合は後述の工夫が必要です。
また、紙幅の都合上、参考記事を紹介して「詳細はこれを読んでね！」と説明せざるを得ない場合がありますが、ご了承いただければと思います。

#概要
全体の流れとしては以下のようになります。
1. AWSアカウントの作成
2. EC2インスタンスの構築
3. Minecraft用サーバーソフトウェアのダウンロード
4. Minecraftサーバーの起動
5. Minecraftサーバーへのアクセス
6. Minecraftサーバーを運用する上でのTips

#Minecraft
Minecraftは一人で遊ぶこともできますが、複数人で遊ぶとさらに楽しくなります。マルチプレイを行うには幾つかの方法があります。
1. 専用サーバーによるMinecraftサーバーの構築・公開
専用サーバーは、専用機を自前で運用する方法と、レンタルサーバーを利用する方法があります。
2. フレンドが遊んでいるワールドへアクセス
フレンドが遊んでいる場合、そのワールドへアクセスすることが可能です。ただし、フレンドがプレイしていない場合はそのワールドへ入れず、遊ぶことはできません。

本記事は、「1. 専用サーバーによるMinecraftサーバーの構築・公開」の中でもレンタルサーバーを利用する方法について説明します。理由は専用機を自前で用意するよりも導入コストが低く済むためです。

Q. レンタルサーバーは高いのでは？
確かにレンタルサーバーはどれも月額2000円以上するものが多いです(代表的なものが[Realm](https://www.minecraft.net/ja-jp/realms-for-java)ですね。Minecraftが正式に提供しているレンタルサーバーです)。しかし、その中でもAWSは従量課金制（=使った分だけお金がかかる）であり、しかも無料枠というものがあるため、AWSを採用いたしました。
AWSを利用したMinecraftサーバーの導入方法は他の記事でも記載されていますが、今回はいかにこの無料枠を利用して遊べるかについても説明いたします。

また、MinecraftにはJava版と統合版があるのですが、今回は、統合版のサーバーを構築します。
統合版では様々なデバイスを使って、Minecraftをすることができます。

- Windows 10
- iOS
- Android
- Xbox One
- Nintendo Switch
- PlayStation 4
- Amazon Fire
- Gear VR
- Oculus

レンタルサーバーに、Minecraftサーバーソフトウェアをインストールする形となります。MinecraftサーバーソフトウェアはWindows用とUbuntu Server用が配布されています[1]。

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

したがって、今回はAWSを利用して、Ubuntuサーバーを用意します。

#AWS
AWSとはAmazon Web Servicesの略で、Amazonが提供している100以上のクラウドコンピューティングサービスの総称です。
クラウドコンピューティングとは、インターネットを介してサーバー・ストレージ・データベース・ソフトウェアといったコンピューターを使った様々なサービスを利用することを指します。従来の物理サーバーとは異なり、自前のサーバー機器を用意しなくて良いのが非常に便利です。今回はこの中でもサーバーサービスであるEC2(Elastic Compute Cloud)を利用しますが、その前にAWSを利用するためにAWSアカウントを作成します。

#1. AWSアカウントの作成
AWSアカウント自体は無料で作成できますが、クレジットカードの登録が必要です。
アカウント登録の方法は以下のリンク[2]を参考にしてください。

[2] AWS アカウント作成の流れ
https://aws.amazon.com/jp/register-flow/

また、AWSで使える無料枠[3][4]についても、見ておきましょう。これをしっかり理解しておかないと知らない間に課金していた！といったことが発生するため、隅々まで読んでおきましょう。
今回使う EC2 は12ヶ月間の間、性能の制限はありますが、月750 時間無料で使うことが可能です。1ヶ月は最大744時間なので、一台であれば常時起動していても問題ないですね。

[3] AWS 無料利用枠
https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all

[4] AWS 無料利用枠に関するよくある質問
https://aws.amazon.com/jp/free/free-tier-faqs/

#2. EC2インスタンスの構築
AWSアカウントが作成できたら、早速EC2インスタンスを構築してみましょう。
EC2インスタンスの構築方法自体は以下の記事[5]の「3.3. EC2 インスタンスに接続」までを参考にすると良いと思います。

[5]【Minecraft for AWS】 EC2インスタンスでMinecraftサーバーを構築
https://dev.classmethod.jp/articles/minecraft-for-aws_ec2-instance/

ただし、《ステップ 1 : Amazon マシンイメージ(AMI)》 にて､ 【Ubuntu Server 20.04 LTS】、《ステップ 2 : インスタンスタイプの選択》では【t2.micro】を選択するようにしてください。
性能は落ちるのですが、Bedrock版の場合、特に問題なく遊べています。（一方、Java版Minecraftの場合は起動するだけで落ちてしまいました。）

なお、「3.3. EC2 インスタンスに接続」の時に、[SSH接続](https://www.kagoya.jp/howto/rentalserver/ssh/)というのを行ったと思いますが、このコマンド自体は、インスタンス画面の右上にある、[接続]　> [SSH クライアント] に記載してある例からコピペすることができます。 コマンドを書くのが面倒くさい、パブリックIPを確認するのが面倒くさいという方はぜひ。

#3. Minecraft用サーバーソフトウェアのダウンロード

さて、構築したEC2インスタンスに接続できたら早速、Minecraft用のサーバーソフトウェアをダウンロードしていきましょう。ただ接続した段階では、[ディレクトリ](https://www.pc-master.jp/words/directory.html)が特にないと思います。なので、まずはMinecraft用のディレクトリを作成しましょう。

```ssh
# ディレクトリがないことを確認
ls 
==============出力結果==============
#何も出力されないはず
===================================

# ディレクトリの作成
mkdir ~/minecraft

# もう一度確認
ls
==============出力結果==============
#作成したディレクトリが確認できる
minecraft　
===================================

# 作成したディレクトリへ移動
cd ~/minecraft/

# 現在の場所を確認
pwd
==============出力結果==============
# pwd を実行後に下記になっていることを確認
/home/ubuntu/minecraft
===================================
```

※ちなみに `cd ..`で一つ上のディレクトリに戻ることができます。
それでは、Minecraft用のサーバーソフトウェアをダウンロードします。方法としてはいくつかあるのですが、今回は[wget](https://atmarkit.itmedia.co.jp/ait/articles/1606/20/news024.html)を使います。

先程の[Minecraft公式サイト](https://www.minecraft.net/ja-jp/download/server/bedrock
)[1]から「UBUNTU 用 UBUNTU サーバー ソフトウェア」の[I agree to the Minecraft End User License Agreement and Privacy Policy]にチェックをつけた後、ダウンロードボタンの上で、右クリックし、[リンクのアドレスをコピー]を押します。

次に、先程のディレクトリで、wget の後に、先ほどコピーしたリンクをペーストします。

```ssh
# wget の後に、先ほどコピーしたリンクをペースト
wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.17.10.04.zip

# zipファイルがダウンロードされていることを確認
ls 
==============出力結果==============
bedrock-server-1.17.10.04.zip 
===================================

# zipファイルを解凍するためにunzipをインストール
sudo apt install -y unzip

# zipファイルを解凍
unzip bedrock-server-1.17.10.04.zip 

# 解凍できたことを確認
ls
==============出力結果==============
Dedicated_Server.txt           permissions.json
bedrock-server-1.17.10.04.zip  premium_cache
bedrock_server                 release-notes.txt
bedrock_server_how_to.html     resource_packs
bedrock_server_symbols.debug   server.properties
behavior_packs                 structures
definitions                    treatments
development_behavior_packs     valid_known_packs.json
development_resource_packs     whitelist.json
development_skin_packs         world_templates
minecraftpe                    worlds
===================================
```

#4. Minecraftサーバーの起動

それでは、Minecraftサーバーを起動してみましょう。
方法は、[Minecraft公式ページ](https://www.minecraft.net/ja-jp/download/server/bedrock
)にもあるように以下のコマンドを実行すれば良いです。

```ssh
LD_LIBRARY_PATH=. ./bedrock_server

==============出力結果==============
NO LOG FILE! - setting up server logging...
[2021-08-07 02:28:25 INFO] Starting Server
[2021-08-07 02:28:25 INFO] Version 1.17.10.04
[2021-08-07 02:28:25 INFO] Session ID 9698e79d-197c-42e9-95a1-07c27368068c
[2021-08-07 02:28:25 INFO] Level Name: Bedrock level
[2021-08-07 02:28:25 INFO] Game mode: 0 Survival
[2021-08-07 02:28:25 INFO] Difficulty: 1 EASY
[INFO] opening worlds/Bedrock level/db
[INFO] IPv4 supported, port: 19132
[INFO] IPv6 supported, port: 19133
[INFO] IPv4 supported, port: 49811
[INFO] IPv6 supported, port: 57063
[INFO] Server started.
===================================
```

この状態になったら、起動完了です。
サーバーを停止させたい場合はstopと打てば停止します。

```ssh
stop 
[INFO] Server stop requested.
[INFO] Stopping server...
Quit correctly
```

#5. Minecraftサーバーへのアクセス

あとは、Minecraftサーバーを起動した状態で、MinecraftからEC2インスタンスのパブリックIPへアクセスすれば良いのですが、SwitchやPS4の場合、特集サーバー以外の外部サーバーにアクセスできないという問題があります。

どうしたものかと調べてみると、以下の記事[6]がありました。

[6]【改造なし】Xbox One、スイッチ、PS4で特集サーバー以外に接続する方法
https://novablog.work/be-join-any-server/

しっかりとソースコードを精読したわけではないのですが、どうやら海外の方が[DNSサーバー](https://www.ntt.com/bizon/glossary/e-d/dns-server.html)を用意して、特集サーバーから外部サーバーへリダイレクトしているような雰囲気を感じます。

https://github.com/Pugmatt/BedrockConnect/blob/master/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java

方法だけを抜粋すると以下の通りです。

>＜スイッチ＞
①「設定」を開きます
②左メニューから「インターネット」を選びます
③「インターネット設定」を選びます
④接続中のSSIDを選択して、「設定の変更」を選びます
⑤「DNS設定」を「自動」から「手動」に変えます
⑥「優先DNS」に「104.238.130.180」を入力します（ポイント！！）
⑦「代替DNS」に「8.8.8.8」を入力します
⑧「保存する」をタップして保存します

>これで設定は完了です。次に実際にサーバーに接続してみましょう。
（ここからは共通の方法です）

>①マインクラフトを起動します
②「サーバー」タブを選択します
③「特集サーバー」のどれかに接続します（どれでもいいです）
④接続に完了すると、「ServerList」という画面が出てきます。
⑤「Connect to a Server」を選びます
⑥「Server Address」にサーバーのアドレスを、「Server Port」にサーバーのポート番号を入力します。
　（「Add to server list」をオンにすると、次回接続時に一覧として登録されます）
⑦「Submit」をタップします。

PS4の場合は少し工程が増えます。まずは、Javaの実行環境であるJREを導入しておく必要があります。
以下のサイト[7][8]を参考にすると導入できると思います。

[7] JRE（Java実行環境）の確認方法
https://www.jpki.go.jp/e-apply/confirm.html

[8] Javaの実行環境JREをWindowsにダウンロードしてインストール、セットアップ設定、アンインストール
https://atmarkit.itmedia.co.jp/ait/articles/1604/19/news027.html

導入できたらあとは、[先程のサイト](https://novablog.work/be-join-any-server/)に記載してある通りです。

>①https://github.com/Pugmatt/BedrockConnect/releasesから最新版のBedrockConnect-1.0-SNAPSHOT.jarをダウンロードします。

>②ダウンロードしたファイルを、デスクトップ等にフォルダを作成して、その中に移動させます。

>③そのフォルダをエクスプローラーで開いて、ファイルリストの何もないところで「Shift+右クリック」をして、メニューを開きます。

>④「PowerShell ウィンドウをここで開く」を選択して、PowerShellを起動します。

>⑤「java -jar BedrockConnect-1.0-SNAPSHOT.jar nodb=true」コマンドを実行して、ServerListサーバーを起動します。

>これでPC側の準備は完了です。
PS4に移りましょう。

>①Minecraftを起動して、「フレンド」タブを選択します。

>②「LANゲーム」に表示されている「Join to open Server List」に参加します。

>③あとは前章の「共通の方法」⑤からと同じです。


#6. Minecraftサーバーを運用する上でのTips

さて、あとは思う存分遊ぶと良いと思いますが、いくつか運用する上で気をつけたほうが良いこと、覚えておくと便利なことについて説明します。

###6.1 Elastic IP アドレス

構築したEC2インスタンスにはパブリックIPというのが付与されており、そのIPアドレスにアクセスすることで、どこからでもMinecraftサーバーに入ることができます(そのため、実際にはアクセス制限を[セキュリティグループ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-security-groups.html)や[ファイアウォール](https://lifework-blog.com/ubuntu-server-firewall/)などを使って行います)。
しかし、このパブリックIPはインスタンスを再起動すると変わってしまいます。
そこで、そのパブリックIPを固定化するためのサービスがElactic IP　アドレスと言います。
このElastic IP アドレスをインスタンスに紐付ける方法は以下のドキュメント[9]の「Elastic IP アドレスを割り当てる」を読んでいただければと思います。

[9] Elastic IP アドレス
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html

ただし、気をつけていただきたいのがElastic IP　アドレスの料金です。
Elastic IP アドレスと紐付けたインスタンスが稼働していれば課金されませんが、インスタンスが停止していたり、どのインスタンスとも紐づけられていない場合、IPアドレスの無駄遣いと判断され課金されてしまいます。

そのため、Elastic IP アドレスを使用する場合は、インスタンスを停止せずに、起動したままにしましょう。

###6.2 screen

「4. サーバーを起動できることを確認します。」でMinecraftサーバーを起動できるようになりましたが、起動したままにしておくにはパソコンをずっと開いておかないといけないことに気づいた方がいるかもしれません。

Linux(CentOS/Ubuntu)・Macの場合、[screenコマンド](https://kazmax.zpp.jp/cmd/s/screen.1.html)というとても便利なコマンドがあります。

このscreen コマンドのメリットは以下の三つです。

- SSH接続を切断してもマイクラサーバーを動作させたままにできる
- 起動したマイクラサーバーのプロセスに再度接続できる
- 不慮の事故でサーバーとの切断が切れても、マイクラサーバーの動作に影響しない

ということでぜひ活用していきましょう。まずはSSH接続を行なったあと、screenをインストールします。

```ssh
#screenをインストール
sudo apt install -y screen
```

そして、minecraftディレクトリに移動して、以下のようにコマンドを実行します。

```ssh
#minecraftディレクトリへ移動
cd ~/minecraft/

#minecraftという名前のセッションを立ち上げ、そこでMinecraftサーバーを起動する
screen -UAmdS minecraft ./bedrock_server 

#minecraftセッションが立ち上がっていることを確認
screen -ls
==============出力結果==============
bedrock-server-1.17.10.04.zip 

There is a screen on:
	336148.minecraft	(08/07/21 03:01:00)	(Detached)
1 Socket in /run/screen/S-ubuntu.
===================================

```
裏で立ち上げることができましたね。
セッションに参加するには` screen -r <セッション名>` もしくは、セッションが一つだけの場合は単に` screen -r` で参加することができます。

```ssh
screen -r minecraft
```

セッションから抜けたい（デタッチしたい）時は、` Ctrl+a d` でセッションをデタッチできます。
この状態であればSSH接続を切断しても問題ありません。
ちなみに`exit` と打つことでSSH接続を切断することができます（今更ですが）。


###6.3 CPUクレジット
これで遊ぶことができる！と、思う存分に遊んでいると、ふと急にMinecraftサーバーが重くなり、ラグが発生して思うように遊べない…といったことが起こるかもしれません。
この時確認していただきたいのが、[CPUクレジット](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/burstable-credits-baseline-concepts.html
)です。

実はEC2インスタンスはベースラインレベルの CPU 使用率を超えると、このCPUクレジットというのを消費していきます。
今回構築したEC2インスタンスのインスタンスタイプはt2.microですが、このインスタンスタイプのベースラインは10%となっています。
つまり、10%を超えるCPU使用率を継続した場合、CPUクレジットが消費されていき、じきに枯渇します。CPUクレジットが枯渇してしまうとEC2インスタンスの性能が落ちてしまい、急にラグが発生するようになるのです。

CPUクレジットが今どれだけあるのかはAWSのEC2マネージメントコンソール画面から確認することができます。


![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1819145/e8f3f940-15f2-925d-523f-39783aaee567.png)


![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1819145/de2cf3f1-402d-ea01-fd17-251737cdbb08.png)

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1819145/deb7dcda-a5b1-2bde-4220-ac264be832cc.png)


CPUクレジットが枯渇していることが分かりますね…。
CPUクレジットはベースラインよりもCPU使用率が下回っている時に回復するので、こうなった場合は、一度Minecraftサーバーを停止して、休ませる必要があります。t2.microの場合144が上限で1時間で6回復するので、1日ぐらい休ませたほうが良さそうです。

クレジットを枯渇させないように適度に様子を見つつ、運用していくのがMinecraftサーバー管理者の仕事となります。

### 6.4 cron

ただ、ずっと監視し続けて枯渇しそうになるたび、連絡してサーバーを停止して…というのは非常に大変です。
サーバーにCPUクレジットを回復するための休止時間を設けたいところです。
そこで、おすすめしたいのが[cron](https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html)です。

cronとは、スクリプトを自動実行するための[デーモンプロセス](https://wa3.i-3-i.info/word11000.html)で、Linuxのシステム管理で、バックアップなどの定期的に自動実行したい時に使用されます。

今回cronを使用する目的としては、Minecraftサーバーを決まった時間に停止して、CPUクレジットを回復する時間を設けるというものになります。

まずは、SSH接続した状態で、1. Minecraftサーバーを起動するためのスクリプト(start.sh)、2. 停止させるためのスクリプト(stop.sh)、3. 再起動するためのスクリプト(restart.sh)を書きます。
スクリプトは `vim start.sh`のようにコマンドを実行することで、書くことができます。vim コマンドについては、以下の記事[10]とか読んでみると良いかもしれません。

[10] 知識0から始めるVim講座
https://qiita.com/JpnLavender/items/fabcc79b4ab0d52e1f6d

```shell:start.sh
#!/bin/bash

screen -UAmdS minecraft /home/ubuntu/minecraft/bedrock_server 

```

```shell:stop.sh
#!/bin/sh

# screenの名前
SCREEN_NAME='minecraft'

if [ -n "$(screen -list | grep -o "${SCREEN_NAME}")" ]; then
    # 停止開始
    echo 'server stop script start'
    # サーバー内にアナウンス
    screen -S $SCREEN_NAME -X stuff 'say 30秒後にサーバーを停止します\015'
    sleep 30s
    # 停止コマンド発行
    screen -S $SCREEN_NAME -X stuff 'stop\015'
    #停止実行待機
    sleep 30s
else
    echo 'server is not runnning'
fi

```

```shell:restart.sh
#!/bin/bash

# 休止時間(6時間休止させる場合)
SLEEP=21600

# スクリプトの指定
STARTSCRIPT=./start.sh
STOPSCRIPT=./stop.sh

#サーバーの停止
$STOPSCRIPT

#サーバーの休止
echo 'sleep '"$SLEEP"'秒' 
sleep $SLEEP

#休止終了後、サーバーを起動
echo 'start script start'
$STARTSCRIPT

```

簡単なスクリプトですが、こんな感じに書いてみました。
あとは、restart.shを毎日決まった時間に実行させるだけです。`crontab -e`でcrontabの編集画面が開くことができます。
毎日6時から12時まで休止させるので、6時(UTCでは21時)に設定します。

```ssh

crontab -e

==============crontab 編集画面==============
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
0 21 * * * /home/ubuntu/restart.sh


=============================================

```
「0 21 * * * 」は左から順に「分,時,日,月,曜日」で、「*」は毎回を表します。この場合は「毎日朝6時00分にスクリプトを実行する」と言う指定になります。

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1819145/f489a328-6d2e-7a72-e1e5-914c5fc362d6.png)

これは、一週間のCPUクレジットを示したものなのですが、定期的に休止時間を設定することで、CPUクレジットが枯渇しないように適度に回復していることが分かります。

#最後に
記事は以上となります。
Minecraftをきっかけとして、サーバーに触れ始めた初心者向けに分かりやすく書こうと思いましたが、ご不明な点や「ここはこうした方が良い」などあれば、気軽にコメントいただければと思います。

では、快適なMinecraft生活をお過ごしください。

#参考情報
[1] マインクラフト用サーバー ソフトウェア (アルファ版) をダウンロード
https://www.minecraft.net/ja-jp/download/server/bedrock

[2] AWS アカウント作成の流れ
https://aws.amazon.com/jp/register-flow/

[3] AWS 無料利用枠
https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all

[4] AWS 無料利用枠に関するよくある質問
https://aws.amazon.com/jp/free/free-tier-faqs/

[5]【Minecraft for AWS】 EC2インスタンスでMinecraftサーバーを構築
https://dev.classmethod.jp/articles/minecraft-for-aws_ec2-instance/

[6]【改造なし】Xbox One、スイッチ、PS4で特集サーバー以外に接続する方法
https://novablog.work/be-join-any-server/

[7] JRE（Java実行環境）の確認方法
https://www.jpki.go.jp/e-apply/confirm.html

[8] Javaの実行環境JREをWindowsにダウンロードしてインストール、セットアップ設定、アンインストール
https://atmarkit.itmedia.co.jp/ait/articles/1604/19/news027.html

[9] Elastic IP アドレス
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html

[10] 知識0から始めるVim講座
https://qiita.com/JpnLavender/items/fabcc79b4ab0d52e1f6d