创建2021年6月版本的强大Minecraft服务器(EC2 + S3)【AWS】
首先
Minecraftを遠隔の複数人で遊びたいとき、サーバーを立てることになる。
公式のRealmsも月額1000円ほどで用意されているが、MODを導入できないなど制約が多い。
AWSのEC2とS3を使ってデータを自動バックアップするMinecraftサーバーを立てる
示例代码↓
在AWS上搭建Minecraft服务器的好处。
-
- 使うときだけ起動して、使っている間だけ課金される
-
- 公式のRealmsよりも拡張性が高い(全て自分で管理できる)
- 参加人数や導入MODに応じて、いつでもサーバーのスペックを変更できる
要做的事情
-
- EC2インスタンスを新規作成して、Minecraftサーバーを自動起動する仕組みをつくる
- EC2起動時にデータをS3にバックアップする仕組みをつくる
前提
-
- Minecraft Java Edition 1.17.0
- カスタムサーバーアプリケーションのspigotを使う
目录
-
- 创建新的S3存储桶以备份数据
-
- 创建IAM角色并分配给EC2
-
- 创建新的EC2实例
-
- 分配固定IP地址给EC2
-
- 安装Minecraft到EC2
- 配置EC2启动时的处理程序
创建一个新的S3桶来备份数据。
uni-minecraft-artifact
在本页面上,使用上述名称新建一个S3 bucket。该桶用于备份Minecraft的数据。
要创建S3存储桶的方法请参考以下链接(参考步骤1-1)↓
创建用于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インスタンスを新規作成する
4. 给予静态IP地址
EC2在默认情况下,每次重启都会被分配一个不同的IP地址。
为了每次都能通过相同的IP地址访问,需要设置弹性IP。
固定IPアドレスを反映するために、一旦EC2を再起動する。
Instance stateからStop→Startをクリックするか、もしくはRebootをクリックする。
※TerminateをクリックするとEC2が削除されるので注意。
在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
设定EC2启动时的处理
我已经能够成功登录到服务器了,但是目前的情况是每次重新启动EC2时都需要使用ssh手动运行服务器应用程序,非常麻烦。
为了解决这个问题,我需要设置userdata,并自动执行以下两个步骤的”launch.sh”脚本在EC2启动时运行。
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实例,并确认实例状态已更改为“已停止”,然后点击“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
--//
重新启动EC2并确认是否按预期工作,然后结束。
1. Minecraftサーバーが自動で実行されて、クライアントからログインできること
2. S3にデータがバックアップされること