AWSで作る、常時起動しない人のためのMinecraftサーバー

概要

  • Amazon Linux 2のEC2インスタンスMinecraftのサーバを建てる
  • コストを減らすため常時起動はせず、必要なときにインスタンスを起動する方式
  • 常時起動しないのでElasticIPを使わずに、でも毎回同じドメインでサーバに接続できる
  • AWSコンソールからインスタンスを開始すればサーバが立ち上がり、停止すればワールドが保存される
  • 工夫してコストカットしたり、MODを入れたりしているので、手間が多め
  • サーバを起動していない月は、現在サーバ1つにつき月額1$くらいで維持できてます(EBSのみ課金される)

使うもの

私の作りたいマイクラサーバ

  • 人数は少なめ、多くても4人程度を想定
  • やりたいときに集まってやるので、常時起動はしない
  • 少しMODを入れる

EC2を作る

インスタンス作成

Amazon Linux 2で適当にインスタンスを作成する

インスタンスタイプについて

micro系とかはスペック不足でラグがひどかったりエラー落ちしたりするので、厳しそう

  1. はじめにt2.microでやってみたときワールド生成の時点でエラー落ちを何回もしていた(0.0152USD/時間)
  2. t3.smallにしたらすんなり動いた(0.0272USD/時間)
  3. コストが気になったのでt4g.smallに移行した(t4g初めてつかったけどコスパすごい)(0.0216USD/時間)
  4. すごい勢いで移動するとワールド生成が追いつかないのでa1.xlargeにしてみたらすごく快適(0.1284USD/時間)
  5. さすがに高いのでa1.largeを使い始める(0.0642USD/時間)

インスタンスタイプはコストやプレイ人数、MODなどに合わせて適当に決めましょう

あまりケチるとまともにプレイできないので気をつけて・・・

EBSのサイズについて

ストレージは途中で増やすことができるので、いったん最低の8GBで作る→足りなくなったらサイズを増やせば良い

逆にストレージを小さくすることはできないので(別のEBSを作ってそっちに移す形ならできる)、適当に20GBで作ってみたけど、数百MBしか使ってないから最低の8GBで良かった・・・と私みたいにならないように

セキュリティグループについて

  • イクラ用に25565/tcpを開ける
  • 適当にSSH用の穴も開ける

Elastic IPを使わないドメイン解決の仕組みについて

qiita.com

こちらの記事を参考に、こんな仕組みを作る

  1. イクラのEC2インスタンスを起動
  2. EC2の起動を検知して、EventBridgeからLambdaを起動
  3. 起動検知したEC2のIPアドレスを、Route53を通して任意のドメインのレコードとして追加

これで、Elastic IPを使わずに毎回同じドメインを使えるのでとても便利(一応レコードが行き渡るのに若干のタイムラグがあるが我慢する)

ただ、常時起動するマイクラサーバならEIPも無料で済むので必要ないかも

仮想マシンにマイクラサーバを入れる

必要なものの用意

  • Javaは古いのだと不安定ってちらっとみたので、新しいものを入れる(よく調べてない、てきとう)
$ sudo yum update
$ sudo yum install java-1.8.0-openjdk

イクラサーバの準備

MCVersions.net - Minecraft Versions Download List

このあたりから、ほしいバージョンのマイクラサーバ.jarを探してくる

$ mkdir ~/minecraft
$ cd ~/minecraft
$ wget https://launcher.mojang.com/v1/objects/35139deedbd5182953cf1caa23835da59ca3d7cd/server.jar

1回サーバを起動する

$ java -Xms1024M -Xmx1024M -jar server.jar nogui

ライセンスに同意する

$ echo 'eula=true' > eula.txt

MODを入れるならforgeとかを適当に入れる

Downloads for Minecraft Forge for Minecraft 1.16.5

このあたりから、ほしいバージョンのforgeを探してくる

$ wget https://files.minecraftforge.net/maven/net/minecraftforge/forge/1.16.4-35.1.4/forge-1.16.4-35.1.4-installer.jar

forgeのインストール

$ java -jar ./forge-1.16.4-35.1.4-installer.jar nogui --installServer

forgeサーバを1回起動してみる

$ java -server -Xms512M -Xmx2048M -jar ./forge-1.16.4-35.1.4.jar nogui

イクラのクライアントを起動してつないでみる→つながる→一旦止める

> stop

必要ならMODを適当に入れる

インスタンス起動時にマイクラサーバを自動起動する

$ sudo vim /etc/systemd/system/minecraft.service

/etc/systemd/system/minecraft.serviceにこんな感じのユニットファイルを作る

[Unit]
Description=Minecraft Server
After=network-online.target

[Service]
WorkingDirectory=/home/ec2-user/minecraft
User=ec2-user

ExecStart=/bin/bash -c '/bin/screen -DmS minecraft /bin/java -server -Xms512M -Xmx2048M -jar ./forge-1.16.4-35.1.4.jar nogui'

ExecReload=/bin/screen -p 0 -S minecraft -X eval 'stuff "reload"\\015'

ExecStop=/bin/screen -p 0 -S minecraft -X eval 'stuff "say Server Shutdown. Saving map..."\\015'
ExecStop=/bin/screen -p 0 -S minecraft -X eval 'stuff "save-all"\\015'
ExecStop=/bin/screen -p 0 -S minecraft -X eval 'stuff "stop"\\015'
ExecStop=/bin/sleep 10

Restart=on-failure
RestartSec=60s

[Install]
WantedBy=network-online.target

ユニットファイルを読み込んでみて、読み込んだか確認する

$ sudo systemctl daemon-reload
$ sudo systemctl status minecraft

Loaded: loadedみたいになっていれば読み込まれているので、起動できるか試す

$ sudo systemctl start minecraft
$ sudo systemctl status minecraft
$ screen -r minecraft

screenでマイクラのコンソールに入れたら、Ctrl+A > dで抜ける

クライアントからも接続できるか、さっきと同じワールドにはいれているか確認してみる

大丈夫そうなら、自動起動するようにする

$ sudo systemctl enable minecraft

これで、

できるようになってるはず

最後にテスト

  1. インスタンスを再起動する
  2. 起動まで1分程度まってあげる
  3. Route 53にレコードが登録できていることを確認する
  4. クライアントから接続できることを確認する

今後できたら良いなと思うこと

  • 定期的 or サーバ終了時に、ワールドをS3にバックアップ
  • 今は私がインスタンスを起動する必要がある → 適当にウェブを用意して、参加者でも起動ボタンで起動できるような仕組み
  • 一定時間誰もいなかったらインスタンスを停止する仕組み
  • CPUクレジットがなくならないように、週1程度一瞬自動で起動してすぐ落ちるような仕組み