はじめに
この記事は MinecraftサーバをAWSで立ててみた の第3回の記事となります。
前回CDK化を実施したので、今回は現時点でのMinecraft ServerについてのAWS上でのインフラ設計についてまとめてみます。
目次
全体構成図
まずは何度も出てきていますが、インフラ全体の構成です。
全体としては、特に言及する点はありません。
Mincraft Serverのサービス提供という観点では、Public SubnetにMincraft用のEC2を1台配置し、Mincraft Serverのデフォルトポートを通信許可すればOKです。
(Ansibleサーバも現状使いみちが無さそうなので削除しようかと考えています)
今後、よりよい運用のために構成を変更していこうと思っています。
やってみたいと考えていることは以下です。
- バックアップや定期的なサーバの再起動をLambdaで実施
- Mincraft EC2インスタンスをPrivate Subnetに移動してフロントにELBを設ける
- EFSを用意して可用性の向上
Minecraft Serverのインフラ設計詳細
Minecraft Serverについて構成の詳細は以下です。
(詳細というほど、詳細ではないですが)
- EC2にElastic IPをアタッチしてPublic IPを付与
- Security GroupをMincraft Server用に作成し、Mincraft Serverのデフォルトポートのみアクセス許可
- ServerへのSSHはSSM経由で行うためアクセス許可は行わない
EC2設定
Minecraft ServerのOSはAlmaLinux8
インスタンスタイプはt3.small
で作成しました。
Minecraft Serverは特にOS問わずインストールできるようなのでOSは好みのもので問題ないと思います。
インスタンスタイプについてはメモリが2GiBあるt3.small
を選択しました。サーバアクセス数が多くなると4〜8GB程度のメモリが必要とのことでしたが、まずは検証レベルなので最低限のインスタンスタイプを選択しました。
(ちなみにt3.micro
だとマップの生成にめちゃくちゃ時間がかかっているようでした)
作成したCDKでのパラメータは以下。
{
'id': 'Ec2InstanceMinecraft1a',
'availability_zone': 'ap-northeast-1a',
'iam_instance_profile': iam_role.instance_profile_general_ec2.ref,
'resource_name': 'EC2-Minecraft-1a',
# Alma Linux 8
'image_id': 'ami-0b299c22ffb336d85',
'instance_type': 't3.small',
'subnet_id': subnet.public_1a.ref,
'security_group_id': security_group.minecraft.ref,
'eip_id': elastic_ip.minecraft_1a.ref,
'user_data_path': './scripts/user_data/minecraft.sh',
'_assign_name': 'minecraft-1a'
}
また、EC2の作成時にMinecraft Serverを自動インストール・サービス起動を行うuserData.sh
を作成しています。
インフラ環境周りの設定・改善を進めていきたいのでMinecraft ServerのパフォーマンスチューンやMOD導入等々、マイクラマルチを快適に遊ぶという観点での改善はかなり後になりそうです。
以下のサービス設定についても改善点は多分にあると思います。
#!/bin/bash
sudo dnf -y update
sudo dnf -y install wget java-17-openjdk-headless-1:17.0.5.0.8-2.el8_6.x86_64
sudo useradd minecraft -M
mkdir /etc/minecraft/
cd /etc/minecraft
sudo wget https://piston-data.mojang.com/v1/objects/c9df48efed58511cdd0213c56b9013a7b5c9ac1f/server.jar
sudo java -Xmx1024M -jar server.jar nogui
sudo sed -i -e "s/false/true/" /etc/minecraft/eula.txt
touch boot.sh
echo '#!/bin/bash' >> /etc/minecraft/boot.sh
echo 'java -Xms$XMS_SIZE -Xmx$XMX_SIZE -jar /etc/minecraft/server.jar nogui' >> /etc/minecraft/boot.sh
chmod +x /etc/minecraft/boot.sh
touch environments
echo 'XMS_SIZE=1024M' >> /etc/minecraft/environments
echo 'XMX_SIZE=1024M' >> /etc/minecraft/environments
sudo chown -R minecraft:minecraft /etc/minecraft
touch /etc/systemd/system/minecraft-server.service
cat <<EOF > /etc/systemd/system/minecraft-server.service
[Unit]
Description=Minecraft Server
After=network-online.target
[Service]
ExecStart=/bin/bash /etc/minecraft/boot.sh
EnvironmentFile=/etc/minecraft/environments
WorkingDirectory=/etc/minecraft
Restart=always
User=minecraft
Group=minecraft
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable minecraft-server
sudo systemctl start minecraft-server
IAM Role
SSM経由でのサーバ接続を行うためにEC2にSSMを利用するためのロールを付与しておく必要があります。
構成図には載せていませんが、しっかり設定をしておく必要があります。
SSMでのサーバ接続には
- Security Groupで22ポートを開放しなくて良くなる(セキュリティ上安全)
- 踏み台サーバが不要(コスト削減)
という大きなメリットがあるので使用することをおすすめします。
設定については 実践!AWS CDK #25 Session Manager で SSH 接続 に詳しく記載してあります。
ソースコード
Security GroupやElastic IPについてはほぼデフォルトで作っただけですので記事には載せていません。
上記も含めた全体のソースコードはgithubに公開しております。