AWS EC2 Amazon Linux でマイクラサーバ＋Forge＋mod

AWS で Java 版のマイクラサーバ（Forge＋鬼滅の刃mod付）を起動したときの手順を記録しておきます。
`t3.small` インスタンスで、1時間あたり 0.0272 USD（4円以下）でお気軽に試せます。
ただし、1ヶ月間ずっと起動したままだと、2〜3千円くらいかかってしまうので、
常時起動させておきたい用途なら、構成や設定を別途調整しても良いかもしれない。

### (1) セキュリティグループを作成

https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#CreateSecurityGroup:

- セキュリティグループ名：　適宜。例：`minecraft-sg`
- 説明：　適宜。例：`Minecraft Server`

インバウンドルール1：
- タイプ：　`カスタムUDP`
- ポート範囲： `25565`
- ソース： `マイ IP`

インバウンドルール2：（統合版も使う場合）
- タイプ：　`カスタムUDP` 
- ポート範囲： `25565`
- ソース： `マイ IP`

インバウンドルール3：
- タイプ：　`SSH`
- ソース： `マイ IP`

自分以外もアクセスしてもらうためには、各自の IP アドレスの登録が必要です。

### (2) EC2 インスタンスを起動

https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#LaunchInstances:

- 名前： `mc`
- OSイメージ： `Amazon Linux 2 AMI (HVM)`
- インスタンスタイプ：　`t3.small` (メモリ2GB)
- キーペア名：　適宜
- ファイアウォール（セキュリティグループ）：　既存のセキュリティグループを選択する
- 共通のセキュリティグループ：　　`minecraft-sg`
- ホスト名のタイプ： `リソース名`

起動したら、インスタンス＞詳細＞パブリック IPv4 アドレス　の値をコピペする。
使わないときは、EC2 インスタンスを停止しておけば、あまりコストがかからない。

### (3) SSH ログインする

```sh
ssh -i private.key ec2-user@xxx.xxx.xxx.xxx
```

### (4) Docker をインストール

```
sudo yum update -y
sudo yum install -y docker
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -a -G docker ec2-user
sudo curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
```

### (5) docker-compose.yml を編集

適当なディレクトリ（例：`~/kimetsu`）に `docker-compose.yml` を作成します。
また、その隣に `world` ディレクトリと `mods` ディレクトリも作っておきます。

```yaml
version: '2'
services:
    mc:
        container_name: Kimetsu
        image: itzg/minecraft-server:java11
        ports:
            - "25565:25565"
        tty: true
        stdin_open: true
        restart: always # EC2インスタンス起動時にマイクラサーバも自動起動してくれる
        volumes:
            - ./world:/data/world:rw
            - ./mods:/data/mods:rw
        environment:
            EULA: "TRUE"
            VERSION: "1.16.5"
            TYPE: "FORGE"
            FORGEVERSION: "36.2.34"
```

### (6) 鬼滅の刃 mod をインストール

https://www.curseforge.com/minecraft/mc-mods/demonslayer/files から
KimetsunoYaiba_1.16.5_ver38.2.jar をダウンロードして、EC2 の mods フォルダに格納します。

```sh
scp -i private.key ~/Downloads/KimetsunoYaiba_xxxx.jar ec2-user@xxx.xxx.xxx.xxx:path/to/mods/
```

### (7) 起動

```sh
docker-compose up -d
```

### (8) ログ確認

```sh
docker-compose logs -f
```

初回は数分かかるかも。
「DedicatedServer Done」を表示されれば起動完了。

```
[minecraft/LoggingChunkStatusListener]: Preparing spawn area: 96%
[minecraft/LoggingChunkStatusListener]: Preparing spawn area: 99%
[minecraft/LoggingChunkStatusListener]: Time elapsed: 15502 ms
[minecraft/DedicatedServer]: Done (15.909s)! For help, type "help"
[minecraft/DedicatedServer]: Starting remote control listener
[minecraft/RConThread]: Thread RCON Listener started
[minecraft/MainThread]: RCON running on 0.0.0.0:25575
```

手元のマイクラJava版を起動して、マルチプレイ＞サーバーを追加＞サーバーアドレスに、
手順２で確認した IP アドレスを登録すれば、接続できる。

利用する Mod のバージョンは、サーバとクライアント側で、揃えておく必要があります。
[ToroHealth](https://www.curseforge.com/minecraft/mc-mods/torohealth-damage-indicators) のようなクライアント側だけの mod は、クライアント側だけに入れれば OK です。

### (9) 設定ファイルの編集

```sh
# 初回のみ
docker-compose exec mc apt-get install vim

# 編集
docker-compose exec mc vi server.properties

# 再起動
docker-compose restart mc
```