# MinecraftサーバをAWS ECSでたてる
2021/10/11マイクラサーバたてたいな。でもVMの管理するのもk8sクラスタの管理するのも面倒だな。と思ってECS on Fargateでサーバレス/クラスタレスなマイクラサーバを立てました。
# システム構成図
# terraform
https://github.com/uda-cha/minecraft_on_aws_ecs (opens new window)
terraform apply
するだけで同じ環境が作れる(はず)
# 構成
- 1つのVPCとsubnetをつくって、その中に全部入れる
- Elastic IPとNLBを使って固定IPを設定
- NLBのターゲットはVPC全体
- NLBリスナー/ターゲットともにマイクラのポートのみ
- EFSを払い出し、ECSコンテナからマウントしてマインクラフトのデータを永続化する
- ECSクラスタをVPC内にデプロイ
- ECSクラスタはVM管理が不要なFargateを選択
- コンテナイメージはitzg/docker-minecraft-server (opens new window)を拝借
- アプリケーションサーバはPaperを選択
外部公開やめたかったらNLBを削除するだけなので簡単。
データもEFSに永続化しているので、遊びたいときだけコンテナを起動して、料金を節約することもできます。
厳密に言うと、コンテナに自動で付与される動的グローバルIPでも外部公開できてしまいます。 しかし動的IPなのでサービスには使えないということから、「NLBを消すだけで外部公開をやめることができる」と書きました。
(完全に外部からのアクセスを遮断できるわけではないので注意)
ちなみにこのVPC/ECSの構成上、動的グローバルIPを無効化すると、ECSからのアウトバウンド通信も出来なくなる(他の手段が必要)になるので注意です。
# やっていないこと
- ログ監視/メトリクス監視
- CloudWatchからよしなにやりたい。
- 負荷検証
- 負荷かけられるほどの人を集めることができない。
- グレースフルリスタート
- そもそもマイクラのアーキテクチャとして可能なのかな?
# ハマったこと
# 一度ECSのサービスをつくってしまうと後からロードバランサを設定できない
固定IPほしかったのですが、ECSは動的パブリックIPしか払い出してくれないようでした。
そのためEIP + NLBで固定IPを付けようと思ったのですが、ECSサービス初期構築時しかロードバランサ設定できないみたいです。
結局サービス作りなおしました。Terraform化しといてよかった。
# EFSのマウントターゲットにもセキュリティグループを当てられる
マウントターゲットはNIC扱いらしいです。EFS触ったことなかったので知らなかった。
ECSクラスタからアクセスできるようにセキュリティグループを設定してやる必要があります。
私は、ECSクラスタのセキュリティグループからのみアクセスできるよう、EFSマウントターゲットのセキュリティグループを設定しました。
# 感想
ECSはメモリ/CPUなどのリソースをかなり柔軟に設定できるのが良かったです。
自前でNLBを立てる必要はありましたが、固定IPでしかもHTTPやgRPCでないマイクラ独自のプロトコルを扱えるのも良かったです。 (案外独自プロトコル使えるPaaSってない気がする)