# MinecraftサーバをAWS ECSでたてる

2021/10/11

マイクラサーバたてたいな。でもVMの管理するのもk8sクラスタの管理するのも面倒だな。と思ってECS on Fargateでサーバレス/クラスタレスなマイクラサーバを立てました。

# システム構成図

system.jpg

# 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ってない気がする)

コメント

コメントする

name
content