AWSを最近試しているので、ECSとFargateを使ってMinecraftサーバーでも立ち上げてみるかという記事です。
前提
- AWS アカウントを持っている
- Minecraft クライアント (Java Edition) を用意している (今回は Java Edition を想定)
全体の流れ
- Minecraft 用 Docker イメージの確認
まずは Minecraft サーバーの Docker イメージを探します。今回は itzg/minecraft-serverを利用してみます。 - ECS で実行するための VPC とサブネット、セキュリティグループの準備
Fargate でコンテナを起動する際に必要になるネットワークまわりの設定を行います。 - ECS タスク定義の作成
Docker イメージやポートの設定、環境変数を指定します。 - ECS サービスの作成
作成したタスク定義をベースに ECS サービスを立ち上げ、コンテナを起動させます。 - サーバーに接続するためのエンドポイントを特定
パブリック IP やエンドポイント(DNS 名)を確認します。 - Minecraft クライアントから接続テスト
ちゃんとマルチプレイでサーバーに入れるかを確認します。
Minecraft 用の Docker イメージを確認
今回は、Docker Hub で人気の「itzg/minecraft-server」イメージを利用します。
「itzg/minecraft-server」は、環境変数によるサーバー設定なども設定できるようです。(例えばEULAをTrueにするのは必須なので環境変数の操作は必要です。)
ネットワーク (VPC, Subnet, Security Group) の準備
VPC の用意
すでにデフォルト VPC があり、パブリックサブネットもある場合はそのまま利用可能です。新しく作成しても良いですが、ここではシンプルにデフォルト VPC を使う想定とします。
サブネットの選択
Fargate では、パブリックサブネットもしくはプライベートサブネット + NAT Gatewayなどの構成を利用できます。外部から直接アクセスする Minecraft サーバーを建てるためには、インバウンドに直接アクセスできるパブリックサブネットに配置する必要があります。
- パブリックサブネット: 外部インターネットから直接アクセス可能
- プライベートサブネット: NAT Gateway 経由でインターネットにアクセス (内部リソース向け)
今回はパブリックサブネットを利用しますのでデフォルトVPCについていたサブネットそのまま使えば問題ないと思います。もしついてなければ追加してください。
セキュリティグループの作成
Minecraft サーバーのデフォルトポートは 25565 (TCP) です。このポートへのインバウンドを許可する必要があります。
- EC2 コンソール > セキュリティグループ > セキュリティグループを作成
- インバウンドルールに以下を追加
- タイプ: カスタム TCP
- ポート範囲: 25565
- ソース: 自分がアクセスしたい範囲(自宅IP など)
- 公開する場合は
0.0.0.0/0
と指定
- 公開する場合は
- アウトバウンドルールはデフォルトで全トラフィック許可になっていれば OK
ECS タスク定義の作成
ここでは AWS Management Console の ECS 画面から進める手順を紹介します。
- AWS マネジメントコンソール で ECS を開く
- 左メニューの タスク定義 > 新しいタスク定義の作成 をクリック
- Fargate を選択し、「次へ」
- タスク定義ファミリー に適当な名前を入力 (例:
minecraft-test
) - タスクロール は特に IAM ロールが必要なければ「None」で OK
- ネットワークモード は
awsvpc
(自動で設定されているはず) - タスク実行ロール は
ecsTaskExecutionRole
を選択- 作成していない場合はポップアップで自動生成される場合があるのでそのまま進められる
- CPU とメモリの設定 を指定
- Minecraft サーバーはメモリをある程度使うので
2vCPU
/4GB
にしてみます。2GBくらいあれば大丈夫と思います。あとはご自身の利用環境に合わせてください。
- Minecraft サーバーはメモリをある程度使うので
- コンテナの追加 ボタンを押して設定
- コンテナ名:
minecraft-container
(任意) - イメージ:
itzg/minecraft-server:latest
(もしくはバージョンタグ付きでも可) - ポートマッピング: プロトコル
TCP
、コンテナポート25565
- 環境変数 に
EULA=TRUE
などを設定 - 他にも
MEMORY=1G
やVERSION=1.20.1
など必要に応じて指定
- コンテナ名:
- 最後に 作成 をクリック
ここまででタスク定義が作成されました。
Cloudwatchは今回は検証のみなら追加しなくてもいいですが、実際に運用するなら追加しておくことをおすすめします。うまく動かなかった時、Cloudwatchで出力されたログを見て解決できたことがありました。
ECS サービスの作成
ECS クラスター作成
タスクを動かすためのクラスターが必要です。既にクラスターがある場合は再利用も可能ですが、ここでは新しく作成します。
- ECS コンソール で クラスター > 新しいクラスターを作成
- クラスター名を入力 (例:
minecraft-test-cluster
) - インフラストラクチャはAWS Fargateを選択
- 必要に応じて モニタリング を有効化
- Create ボタンをクリック
サービス起動
ECS コンソールの左メニューから タスク定義 を選択
先ほど作成したタスク定義 minecraft-fargate-td
をクリック
上部の「デプロイ」から サービスの作成 を選択
設定はそのままで作成しても問題ないと思いますが、念のため以下解説します。
クラスター: minecraft-fargate-cluster
サービス名: 適当なサービス名(例.minecraft-test)
タスク数: 1 (サーバーを 1 台建てる想定)
デプロイオプション はデフォルトでも OK
ネットワーキング
VPC: デフォルト VPC (または利用したい VPC)
サブネット: サブネットを選択 (1つ以上)
セキュリティグループ: 先ほど作成した 25565 ポート許可設定ありの SG
パブリック IP の自動割り当て: 有効(ENABLED) にする (外部からアクセスするため)
次へ を押して内容を確認し、サービスの作成
少し待つと、タスクが起動し始めます。
パブリック IP を確認
タスクが RUNNING 状態になったら、パブリック IP アドレスを確認します。
- ECS コンソール > クラスター 選択 > タスク で実行中になっているものを確認
- 対象のタスクをクリックすると詳細が開きます
- 設定の項目にパブリック IP が確認できます
この パブリック IP が Minecraft サーバーの接続先アドレスになります。
Minecraft クライアントから接続する
- Minecraft (Java Edition) を起動し、マルチプレイのサーバー追加画面へ
- サーバーアドレス に上記のパブリック IP を入力 (例:
xx.xx.xx.xx
やec2-xx-xx-xx-xx.compute.amazonaws.com
) - サーバーリストに追加するとオンライン状況が表示されます
- オンラインになったら、接続 ボタンでサーバーに入ります
- 正常に接続できれば OK です!
もし接続できない場合は、以下を確認してください:
- セキュリティグループのインバウンドルールでポート
25565
が許可されているか - パブリック IP が正しいか
- EULA=TRUE などの環境変数設定が正しいか (ログ上でエラーが出ていないか)
以上となります。VPSだと使わない時でも課金しているので使いたいときのみ課金されるサーバーレス環境とゲームサーバーの相性はいいかもしれません。あとはデータの保持の方法について確認してまた投稿します。