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

やってみたのでメモ。

サーバーソフト・・Spigot<br>
検索したら出できたやつ。

手順<br>
1. AWSでEC2インスタンス起動<br>
2. 起動したEC2インスタンスに、Spigotをインストール<br>
3. ログの設定

少しはまりポイントもありつつ、わりと簡単だった。
アーキはこんな感じ。シンプル。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697145/18e9e938-eb37-8e85-6c9d-b388341a11fa.png)


#### 1. AWSでEC2インスタンス起動
EC2インスタンスのスペックはこんな感じにした。
とにかく快適に使いたいので、スペック高め。
お金は結構かかるけど、遊びたいときだけ起動するようにすればそんなに。

* OS
Ubuntu
* インスタンスタイプ
c5a.2xlarge 8vCPU 16GiBメモリ
* EBS
50GB 
#### 2. 起動したEC2インスタンスに、Spigotをインストール
```sh

#リポジトリ更新
sudo apt-get -y update

#Amazon correttoをダウンロードする。AWSで使えるjdk。
wget -O- https://apt.corretto.aws/corretto.key | sudo apt-key add - 
sudo add-apt-repository 'deb https://apt.corretto.aws stable main'

#Spigotはjava17で動くのでjava17をインストール
sudo apt-get install -y java-17-amazon-corretto-jdk

#gitをインストール
sudo apt-get -y install git

#minecraft用のディレクトリ作成して権限変更
sudo mkdir minecraft-spigot
sudo chmod 777 minecraft-spigot

#Spigotをダウンロード
cd minecraft-spigot
wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
sudo java -jar BuildTools.jar --rev 1.19.2

#実行！（事前に作っておいた起動用のスクリプト）
sh Minecraft_start.sh
```
スクリプトはこれだけ。

```sh:Minecraft_start.sh
#!/bin/sh
java –Xmx4096M –Xms4096M -XX:+UseG1GC -jar /home/ubuntu/minecraft-spigot_1.19.2/spigot-1.19.2.jar nogui
```

これでEC2インスタンスに設定しておいたグローバルIPを指定して、
ローカルのマイクラから接続できた。

#### 3.ログの設定
1.EC2用のIAMロールを作成し、CloudWatchServerAgentのポリシーを設定し、インスタンスにアタッチ
（毎度のやつ）
2.CloudWatchをインストール
インストール方法は[ここ](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html)

```shell
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon- 
cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
```

3.jsonの作成
```shell
sudo touch /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
sudo systemctl start amazon-cloudwatch-agent
systemctl status amazon-cloudwatch-agent
sudo systemctl enable amazon-cloudwatch-agent
systemctl is-enabled amazon-cloudwatch-agent
```
これあったら良いかなーっていうログを適当に設定。
```json:amazon-cloudwatch-agent.json
{
   "logs": {
       "logs_collected": {
            "files": {
                "collect_list": [
                   {
                        "file_path": "/home/ubuntu/minecraft-spigot/logs/latest.log",
                        "log_stream_name": "{instance_id}",
                        "log_group_name": "/home/ubuntu/minecraft-spigot/logs",
                        "timestamp_format": "%d/%b/%Y:%H:%M:%S %z",
                        "timezone": "UTC"
                    },
                    {
                        "file_path": "/var/log/syslog",
                        "log_stream_name": "{instance_id}",
                        "log_group_name": "/var/log/syslog",
                        "timestamp_format": "%d/%b/%Y:%H:%M:%S %z",
                        "timezone": "UTC"
                    },
                    {
                        "file_path": "/var/log/auth.log",
                        "log_stream_name": "{instance_id}",
                        "log_group_name": "/var/log/auth.log",
                        "timestamp_format": "%d/%b/%Y:%H:%M:%S %z",
                        "timezone": "UTC"
                    }
                ]
            }
        }
    }
}
```
ログの場所はこれを見た
[[メモ]Linuxの主なログファイル](https://qiita.com/Yorinton/items/897c1ccd6797a7df7805)

#### 参考
* Spigot公式
[spigotmc.org](https://www.spigotmc.org/)
WikiのGettingStarteg→Instllationからインストールのやり方がみれる。

* [【完全版】Minecraftサーバーの構築](https://qiita.com/Nether_2046/items/8b3ad9208ab1e700ef07)
サーバースペックが参考になった。

#### 余談、ハマったとこ
最初、t2microで試してたらOutOfMemoryでうまくいかず、ヒープメモリについていろいろ調べることになった。
参考になったやつ。

[EC2をt2.microで立てたときにやることメモ](https://qiita.com/teracy164/items/c1dfc09901c7f242a13f)
[【JVM】OOM(Out Of Memory)障害対応のための必要な知識](https://qiita.com/yoshinori_hisakawa/items/d579cb0ed2a746ab2e41)
[JVMのヒープメモリを確認する（jstat）](https://qiita.com/kaikusakari/items/9b7c3d1fb524eb6aa348)

インストール手順にメモリ指定よく載ってておまじないのように使ってたけど、
なるほどね、となった。
t2.microだとスワップメモリが割り当てられてないのですぐ落ちる。
結局、マイクラサーバーを動かすにはどうやってもスペック不足だったのでスペック上げました。