はじめに
Minecraftを遠隔の複数人で遊びたいとき、サーバーを立てることになる。
公式のRealmsも月額1000円ほどで用意されているが、MODを導入できないなど制約が多い。
AWSのEC2とS3を使ってデータを自動バックアップするMinecraftサーバーを立てる
サンプルコード↓
AWSでMinecraftサーバーを立てるメリット
- 使うときだけ起動して、使っている間だけ課金される
- 公式のRealmsよりも拡張性が高い(全て自分で管理できる)
- 参加人数や導入MODに応じて、いつでもサーバーのスペックを変更できる
やること
- EC2インスタンスを新規作成して、Minecraftサーバーを自動起動する仕組みをつくる
- EC2起動時にデータをS3にバックアップする仕組みをつくる
前提
Minecraft Java Edition 1.17.0
- カスタムサーバーアプリケーションの
spigot
を使う
もくじ
- データをバックアップするS3 bucketを新規作成する
- EC2に付与するIAMロールをつくる
- EC2インスタンスを新規作成する
- 固定IPアドレスを付与する
- EC2にMinecraftをインストールする
- 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
に配置された全てのファイルを読み書きできるようになる。
{
"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
をクリック。
今回はAmazon LinuxのAMIで、アーキテクチャはx86を選択。
インスタンスタイプの選択はご自由に(あとから変更もできる)。
t3a.medium
程度の性能があれば、重いMODをいれない限りは快適に遊べるはず。
(自分の環境では地図MODの負荷が高いため、m5a.large
を使っている)
インスタンスタイプを決めたら、画面右下のConfigure Instance Details
をクリック。
IAM Role
で、手順1で作ったec2-minecraft-server-role
を指定する。
画面右下のAdd Storage
をクリック。
外付けストレージを設定する。
本ページではAWS無料枠で最大容量となる30GBのGeneral Purpose SSD(gd3)
を選択した。
画面右下のAdd Tags
をクリック。
Tagは特に設定しなくてよい。
ほしければお好みで。
画面右下のConfigure Security Group
をクリック。
Java版のMinecraftはデフォルトではport:25565
を使うらしい。
Add Rule
をクリックして、必要な設定を追加する。
通信を許可するIPアドレスの対象はご自由に。
(本ページでは全てのIPアドレスを許可している。)
画面右下のReview and Launch
をクリック。
内容に誤りがないことを確認したら、画面右下のLaunch
をクリック。
sshに必要な鍵を作成する。
Create a new key pair
を選択して、好きな名前をつける。
本ページではuni-minecraft-server-key
とした。
Download Key Pair
を押して、ローカルに鍵(.pemファイル)を落としておく(手順6で使う)。
Launch Instances
をクリックして、EC2の新規作成が完了。
Instance state
がRunning
、Status check
がpassed
になっていれば、EC2の起動が完了している。
新規作成したEC2のInstance ID
を控えておく(手順4,5で使う)。
4. 固定IPアドレスを付与する
EC2はデフォルトでは再起動ごとに異なるIPアドレスが付与されてしまう。
毎回同じIPアドレスでアクセスできるように、Elastic IPs
を設定する。
Network & Security
のカテゴリから、Elastic IPs
をクリック。
EC2を設置したリージョンと同じリージョンを選択して、画面右下のAllocate
をクリック。
これで自分専用のIPアドレスを該当リージョン内で確保できた。
今回確保したIPアドレスにチェックを入れて、Associate Elastic IP Address
をクリック。
手順3で新規作成したEC2のInstance ID
を選択して、画面右下のAssociate
をクリック。
これで、常に同じIPアドレスでMinecraftサーバー用のEC2にアクセスできるようになる。
固定IPアドレスを反映するために、一旦EC2を再起動する。
Instance state
からStop
→Start
をクリックするか、もしくはReboot
をクリックする。
※Terminate
をクリックするとEC2が削除されるので注意。
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
。
#!/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アドレスを入力すれば、サーバーにログインできるはず。
6. EC2起動時の処理を設定する
無事にサーバへログインできるようになったが、現状だとEC2を再起動するたびにsshしてサーバーアプリケーションを手動実行する必要があり、とても面倒。
userdata
を設定して、EC2起動時に以下2つの処理を行うlaunch.sh
を自動実行させる。
1. セーブデータをzip化してS3にバックアップする
2. サーバーアプリケーションを実行する
あらかじめ以下のlaunch.sh
をEC2のminecraft
ディレクトリ内に配置しておく。
#!/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 state
がStopped
になったことを確認したら、Actions/Instance settings/Edit user data
をクリック。
今回設定するuserdataは下記の通り。
通常userdataは初回起動時にしか実行されないが、configからALWAYSオプションを設定すると再起動時にも実行される。
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
をクリック。
EC2を再起動して、期待通りに動くか確認しておわり。
1. Minecraftサーバーが自動で実行されて、クライアントからログインできること
2. S3にデータがバックアップされること
参考