6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【AWS】つよいMinecraftサーバーをつくる2021年6月版(EC2 + S3)

Last updated at Posted at 2021-06-27

はじめに

Minecraftを遠隔の複数人で遊びたいとき、サーバーを立てることになる。
公式のRealmsも月額1000円ほどで用意されているが、MODを導入できないなど制約が多い。
AWSのEC2とS3を使ってデータを自動バックアップするMinecraftサーバーを立てる

サンプルコード↓

AWSでMinecraftサーバーを立てるメリット

  • 使うときだけ起動して、使っている間だけ課金される
  • 公式のRealmsよりも拡張性が高い(全て自分で管理できる)
  • 参加人数や導入MODに応じて、いつでもサーバーのスペックを変更できる

やること

  • EC2インスタンスを新規作成して、Minecraftサーバーを自動起動する仕組みをつくる
  • EC2起動時にデータをS3にバックアップする仕組みをつくる

前提

  • Minecraft Java Edition 1.17.0
  • カスタムサーバーアプリケーションのspigotを使う

もくじ

  1. データをバックアップするS3 bucketを新規作成する
  2. EC2に付与するIAMロールをつくる
  3. EC2インスタンスを新規作成する
  4. 固定IPアドレスを付与する
  5. EC2にMinecraftをインストールする
  6. EC2起動時の処理を設定する

1. データをバックアップするS3 bucketを新規作成する

uni-minecraft-artifact

本ページでは上記の名称でS3 bucketを新規作成する。
Minecraftのデータをバックアップするのに使う。

S3 bucketを作成する方法は下記リンク(手順1-1を参照)↓

2. EC2に付与するIAMロールをつくる

ec2-minecraft-server-role

本ページでは上記の名称でIAMロールを新規作成する。

IAMロールを設定する方法は下記リンク(手順2と6を参照)↓

下記の通りS3MinecraftArtifactManagePolicyを作成し、ec2-minecraft-server-roleにアタッチした。
このロールを付与されたリソースは、uni-minecraft-artifactに配置された全てのファイルを読み書きできるようになる。

S3MinecraftArtifactManagePolicy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObjectAcl",
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::uni-minecraft-artifact/*",
        "arn:aws:s3:::uni-minecraft-artifact"
      ]
    }
  ]
}

3. EC2インスタンスを新規作成する

EC2インスタンスのコンソール画面で、右上のLaunch Instancesをクリック。
Screen Shot 2021-06-26 at 12.43.56.png

今回はAmazon LinuxのAMIで、アーキテクチャはx86を選択。
Screen Shot 2021-06-26 at 12.44.17.png

インスタンスタイプの選択はご自由に(あとから変更もできる)。
t3a.medium程度の性能があれば、重いMODをいれない限りは快適に遊べるはず。
(自分の環境では地図MODの負荷が高いため、m5a.largeを使っている)
インスタンスタイプを決めたら、画面右下のConfigure Instance Detailsをクリック。
Screen Shot 2021-06-26 at 12.44.59.png

IAM Roleで、手順1で作ったec2-minecraft-server-roleを指定する。
画面右下のAdd Storageをクリック。
Screen Shot 2021-06-26 at 15.08.44.png

外付けストレージを設定する。
本ページではAWS無料枠で最大容量となる30GBのGeneral Purpose SSD(gd3)を選択した。
画面右下のAdd Tagsをクリック。
Screen Shot 2021-06-26 at 15.09.29.png

Tagは特に設定しなくてよい。
ほしければお好みで。
画面右下のConfigure Security Groupをクリック。
Screen Shot 2021-06-26 at 15.09.41.png

Java版のMinecraftはデフォルトではport:25565を使うらしい。
Add Ruleをクリックして、必要な設定を追加する。
通信を許可するIPアドレスの対象はご自由に。
(本ページでは全てのIPアドレスを許可している。)
画面右下のReview and Launchをクリック。
Screen Shot 2021-06-26 at 15.13.04.png

内容に誤りがないことを確認したら、画面右下のLaunchをクリック。
Screen Shot 2021-06-26 at 15.14.41.png

sshに必要な鍵を作成する。
Create a new key pairを選択して、好きな名前をつける。
本ページではuni-minecraft-server-keyとした。
Download Key Pairを押して、ローカルに鍵(.pemファイル)を落としておく(手順6で使う)。
Launch Instancesをクリックして、EC2の新規作成が完了。
Screen Shot 2021-06-26 at 15.15.44.png

Instance stateRunningStatus checkpassedになっていれば、EC2の起動が完了している。
新規作成したEC2のInstance IDを控えておく(手順4,5で使う)。
Screen Shot 2021-06-27 at 15.21.24.png

4. 固定IPアドレスを付与する

EC2はデフォルトでは再起動ごとに異なるIPアドレスが付与されてしまう。
毎回同じIPアドレスでアクセスできるように、Elastic IPsを設定する。

Network & Securityのカテゴリから、Elastic IPsをクリック。
Screen Shot 2021-06-27 at 15.21.24 copy.png

EC2を設置したリージョンと同じリージョンを選択して、画面右下のAllocateをクリック。
これで自分専用のIPアドレスを該当リージョン内で確保できた。
Screen Shot 2021-06-27 at 15.21.49.png

今回確保したIPアドレスにチェックを入れて、Associate Elastic IP Addressをクリック。
Screen Shot 2021-06-27 at 15.25.11.png

手順3で新規作成したEC2のInstance IDを選択して、画面右下のAssociateをクリック。
これで、常に同じIPアドレスでMinecraftサーバー用のEC2にアクセスできるようになる。
Screen Shot 2021-06-27 at 15.25.35.png

固定IPアドレスを反映するために、一旦EC2を再起動する。
Instance stateからStopStartをクリックするか、もしくはRebootをクリックする。
TerminateをクリックするとEC2が削除されるので注意。

Screen Shot 2021-06-27 at 16.30.09.png

5. EC2にMinecraftをインストールする

ここからはsshでEC2内部に潜って作業する。
このとき、手順3の最後にダウンロードしておいた鍵(.pemファイル)のパスを指定する。

$ chmod 600 ~/.ssh/keys/uni-minecraft-server-key.pem
$ ssh ec2-user@46.51.230.42 -i ~/.ssh/keys/uni-minecraft-server-key.pem
# ssh ec2-user@${ElasticIP} -i ${手順3でダウンロードした.pemのファイルパス}

正常にsshできれば、下記の通りEC2のロゴが表示される。

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-31-16-27 ~]$ 

以下は、Minecraftのカスタムサーバーspigotを取得&ビルドするsetup.sh

setup.sh
#!/bin/sh

rpm --import https://yum.corretto.aws/corretto.key 
curl -L -o /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo
yum install -y java-16-amazon-corretto-devel

yum install -yt git

mkdir minecraft
cd minecraft

wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
java -jar BuildTools.jar --rev 1.17
find . | grep -v 'spigot-1.17.jar' | xargs rm -rf

java -Xmx2048M -Xms2048M -jar spigot-1.17.jar nogui

EC2の中でsetup.shをsudoで実行する(MinecraftのバージョンやURLは適宜書き換える)。
その後eula.txtの中身を手動でeula=trueに書き換えて、Minecraftサーバーを起動する。

# あらかじめEC2にsetup.shを配置しておく
[ec2-user@ip-172-31-16-27 ~]$ ls
setup.sh

# setup.shを実行する
[ec2-user@ip-172-31-16-27 ~]$ sudo sh setup.sh

# === shellの処理が実行される ===

# setup.shの実行結果を確認する
[ec2-user@ip-172-31-16-27 minecraft]$ ls
eula.txt  logs  server.properties  spigot-1.17.jar

# eula.txtの中身を、eula=trueに書き換える
[ec2-user@ip-172-31-16-27 minecraft]$ sudo vim eula.txt 

# Minecraftサーバーを起動する
[ec2-user@ip-172-31-16-27 minecraft]$ sudo java -Xmx2048M -Xms2048M -jar spigot-1.17.jar nogui

この状態でMinecraftのクライアントを起動してEC2のIPアドレスを入力すれば、サーバーにログインできるはず。
Screen Shot 2021-06-27 at 17.16.33.png

Screen Shot 2021-06-27 at 17.16.46.png

6. EC2起動時の処理を設定する

無事にサーバへログインできるようになったが、現状だとEC2を再起動するたびにsshしてサーバーアプリケーションを手動実行する必要があり、とても面倒。
userdataを設定して、EC2起動時に以下2つの処理を行うlaunch.shを自動実行させる。

1. セーブデータをzip化してS3にバックアップする
2. サーバーアプリケーションを実行する

あらかじめ以下のlaunch.shをEC2のminecraftディレクトリ内に配置しておく。

launch.sh
#!/bin/sh
cd /home/ec2-user/minecraft

NOW=`date "+%Y%m%d"`
zip ${NOW}.zip -r world world_nether world_the_end/
aws s3 cp ${NOW}.zip s3://uni-minecraft-artifact/world_backup/world/ --storage-class ONEZONE_IA
rm -f ${NOW}.zip

java -Xmx2048M -Xms2048M -jar spigot-1.17.jar nogui

対象のEC2インスタンスを停止して、Instance stateStoppedになったことを確認したら、Actions/Instance settings/Edit user dataをクリック。

Screen Shot 2021-06-27 at 17.31.10.png

今回設定するuserdataは下記の通り。
通常userdataは初回起動時にしか実行されないが、configからALWAYSオプションを設定すると再起動時にも実行される。

userdata.txt
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
sudo sh /home/ec2-user/minecraft/launch.sh
--//

ページ下部の枠内にuserdata.txtの内容をそのまま書きこんだら、画面右下のSaveをクリック。
Screen Shot 2021-06-27 at 17.32.17.png

EC2を再起動して、期待通りに動くか確認しておわり。

1. Minecraftサーバーが自動で実行されて、クライアントからログインできること
2. S3にデータがバックアップされること

参考

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?