🧟

AWS Fargate Spot + EFS で Project Zomboid サーバーを『遊ぶときだけ』起動する仕組みを作ってみた

に公開

はじめに

こんにちは、tsubasa です。いつもは Snowflake に関する記事を書いていますが、今回は完全に趣味の話題なのでご注意ください。

ここ数年 TerrariaFactorio といった 2D サンドボックス系のゲームにハマっています。その理由としては、私は 3D のゲームだと酔ってしまう、1つの環境をみんなで作っていくのが好き、そもそもハイスペックなゲーミング PC を持っていないといったところがあります。10年以上前にリリースされたゲームとして Project Zomboid という同じような系統のゾンビサバイバルゲームがあり、それを友人とワイワイやるためにサーバーを建てようと思ったのですが、いざ調べてみると

  • 複雑なアーキテクチャで構築が大変かつコストが高い
  • SSH でサーバーに接続し各種設定変更やメンテナンスが必要で面倒
  • IaC 化されていないため起動停止などの状態管理が煩雑

と様々な素晴らしいソリューションはあるものの私にとって丁度いいソリューションが見つからなかったので、「じゃあ自分で最小構成を作るか」 と勢いで CloudFormation テンプレートを書いてみました。

要件

  1. 遊んでいるときだけ課金 されること
  2. ゲームデータが消えない こと
  3. サーバーにログイン不要 で起動・停止や設定変更ができること
  4. なるべく シンプルな構成 であること

以上を満たすアーキテクチャとして、

  • コンピューティングリソース: Fargate Spot
  • セーブデータの保存: EFS
  • コンフィグファイル置き場: S3
  • IaC: CloudFormation

といった構成にしました。
Fargate Spot よりも ECS (EC2 スポットインスタンス) を使った方が安くなりますが、スペック変更の容易性や管理のシンプルさからこちらを選択しました。

アーキテクチャ概要

ポイントは次の3つです。

  1. Fargate Spot: オンデマンドより ~70% 安い。中断リスクはゲーム用途なので許容。
  2. NLB の動的生成: ゲームを起動するとき (DesiredTaskCount=1) だけ NLB を Condition で作成/削除して待機料金を削減。
  3. Java ヒープ自動調整: コンテナの Memory 値に応じて -Xms/-Xmx をシェルで計算、OOM を回避。
  4. S3 ベースの設定管理: サーバー設定ファイルを S3 に配置し起動時に読み込むため、サーバーに SSH せずに設定変更が可能。

CloudFormation テンプレートのハイライト

Parameters:
  DesiredTaskCount:
    Type: Number
    AllowedValues: [0, 1] # 0=停止, 1=起動

Conditions:
  CreateNLB: !Not [!Equals [!Ref DesiredTaskCount, 0]]

# ... 省略 ...

Command:
  - /bin/sh
  - -c |
      MEMORY_MB=$CONTAINER_MEMORY
      INIT_HEAP=$(( MEMORY_MB / 2 ))
      MAX_HEAP=$(( MEMORY_MB * 7 / 10 ))
      exec /home/steam/pzserver/start-server.sh \ 
        -servername "$SERVER_NAME" \ 
        -Xms${INIT_HEAP}m -Xmx${MAX_HEAP}m
  • DesiredTaskCount を 0 ⇄ 1 に切り替えるだけでサーバーの停止/起動が可能。
  • ヒープサイズは コンテナメモリの 50〜70% を自動で割り当て。

コスト試算(AWS 東京リージョン)

リソース 単価 想定利用 月額目安
Fargate Spot 約 $0.02/時間 月 40 時間 約 $0.8
EFS 約 $0.40/GB/月 2GB 約 $0.8
NLB 約 $0.03/時間 月 40 時間 約 $1.2
パブリック IPv4 約 $0.005/時間 月 40 時間 *2 (Fargate と NLB) 約 $0.4
データ転送料金 (Out) 約 $0.1/GB/月 2GB 約 $0.2
合計 約 $3.4/月

という感じで平日は停止し週末だけ起動するライトな遊び方なら、月々ワンコインのコスト感で運用できます。

実装について

GitHub リポジトリ(https://github.com/tsubasa-tech-gh/ProjectZomboid)にテンプレートを置いてあるので、興味がある方はぜひ試してみてください!

簡易的な使い方 (詳細は github リポジトリをご確認ください)

  1. project-zomboid.yaml をダウンロードして、それをテンプレートとしてCloudFormationでスタックを作成
  2. 必要に応じて作成された S3 にコンフィグファイルを配置 (配置しなくても初期設定で起動はできます)
  3. DesiredTaskCount=1 でスタックを更新するとサーバーが起動
  4. 出力された GameNlbDnsName を 16261/UDP でゲームクライアントに設定
  5. 遊び終わったら DesiredTaskCount=0 で停止

その他

  • CloudFormation で起動停止ができるため、Discord などから起動停止させるなども実装しやすいです
  • かなり雑に作成しておりますので、不具合や「もっとこうした方がいい!」というアイデアがあれば、ぜひコメントをお願いします!

最後に

あまり今から Project Zomboid を始める方は多くないとは思いますが是非参考になれば幸いです。そして一緒に Zomboid やりましょう!

変更履歴

(20250503) 新規投稿

Discussion