MinecraftサーバをAWSで立ててみた #3

# はじめに
<!-- 発端や概要を記載 -->
この記事は [MinecraftサーバをAWSで立ててみた](https://qiita.com/tonomin/items/de6eb87857fb7abc1d24) の第3回の記事となります。

前回CDK化を実施したので、今回は現時点でのMinecraft ServerについてのAWS上でのインフラ設計についてまとめてみます。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [構成図](#Chapter1)
1. [Minecraft Serverのインフラ設計詳細](#Chapter2)
1. [ソースコード](#Chapter2)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 全体構成図
まずは何度も出てきていますが、インフラ全体の構成です。

![minecraft_server.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340134/9e062746-0679-d018-c7b7-14eecb3e6f20.jpeg)

全体としては、特に言及する点はありません。
Mincraft Serverのサービス提供という観点では、Public SubnetにMincraft用のEC2を１台配置し、Mincraft Serverのデフォルトポートを通信許可すればOKです。

（Ansibleサーバも現状使いみちが無さそうなので削除しようかと考えています）

今後、よりよい運用のために構成を変更していこうと思っています。
やってみたいと考えていることは以下です。
- バックアップや定期的なサーバの再起動をLambdaで実施
- Mincraft EC2インスタンスをPrivate Subnetに移動してフロントにELBを設ける
- EFSを用意して可用性の向上

<a id="#Chapter2"></a>
# Minecraft Serverのインフラ設計詳細
Minecraft Serverについて構成の詳細は以下です。
（詳細というほど、詳細ではないですが）

![minecraft_ec2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340134/6c2d565b-3d22-99c5-342c-dcb30577f383.jpeg)

- 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`を選択しました。サーバアクセス数が多くなると４〜８GB程度のメモリが必要とのことでしたが、まずは検証レベルなので最低限のインスタンスタイプを選択しました。
（ちなみに`t3.micro`だとマップの生成にめちゃくちゃ時間がかかっているようでした）

作成したCDKでのパラメータは以下。
```:resources/ec2.py
{
    '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導入等々、マイクラマルチを快適に遊ぶという観点での改善はかなり後になりそうです。
以下のサービス設定についても改善点は多分にあると思います。

```shell:scripts/user_data/minecraft.sh
#!/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 接続](https://dev.classmethod.jp/articles/cdk-practice-25-session-manager-ssh/) に詳しく記載してあります。

<a id="#Chapter3"></a>
# ソースコード
Security GroupやElastic IPについてはほぼデフォルトで作っただけですので記事には載せていません。
上記も含めた全体のソースコードは[githubに公開](https://github.com/tonomin/minecraft_server_cdk)しております。

<a id="#reference"></a>
# 参考文献
- [実践！AWS CDK](Uhttps://dev.classmethod.jp/search/?q=%E5%AE%9F%E8%B7%B5%EF%BD%80CDK&page=1)