🧟

7Days to dieサーバーをAWSスポットフリートで安く運用する

2022/11/11に公開

7days to dieのサーバーをAWSのスポットフリートを使って安く運用するお話です。

とにかくサーバー費用を安く抑えた

どれくらい安いかというと、1日あたりの平均コスト$0.19 といったあたりです。

ポイント

当初、通常のインスタンスタイプを固定で使うスポットインスタンスを利用していたのですが、m1.xlargeなどの安いインスタンスが売り切れで起動しないということが多発し困っておりました。
スポットリクエストでvCPU数memory数を抽象的に指定しかつ複数のアベイラビリティゾーンを指定することで必ず起動するサーバーを作ろうと思い、今回の構成に至りました。

IaCにこだわった

CDKでVPCからの一式のスポットリクエストに必要な環境と、discord スラッシュコマンド用botのlambdaを含めて、構築の再現性があるようにすると同時に、サーバーの種類をいくらでも簡単に増やせるようにしました。サーバーの初期設定やインストールなどすべてが自動で走るようにこだわりました。
CDKを少し修正することで何種類もサーバーを気軽に増やせるようにしました。
また、Discordからスラッシュコマンドで好きなサーバーをいつでも起動できるようにしています。

全体構成

全体の構成はいたってシンプルです。
Discodeのカスタムスラッシュコマンドをlambdaで受け付けてスポットリクエストのサーバー数を変更してサーバーを起動/停止するそれだけです。

サーバー起動処理

サーバー起動処理

サーバー停止処理

サーバー停止処理

ゲームサーバーのインストール作業は不要

vinanrra/7dtd-server を利用することでゲームサーバーのインストールを自動化しています。
vinanrra/7dtd-serverではサーバーバージョンを設定で変更したりModを入れたり設定を調整するなどの様々な機能があるようです。
ちなみにvinanrra/7dtd-serverを起動するdocker-compose.ymlはこちら

日本国内でのIP制限

デフォルトで海外IPからのせ接続を制限しています。
設定スクリプトはこちら

サーバーの自動停止とバックアップ

15分間誰もログインしていない時間が続くと自動でサーバーを停止するようにしています。
サーバーを停止する際に、ゲームデータを保存しているディスクのスナップショットを作成し、サーバを停止します
スナップショットの最大世代数もcdkで設定可能です。

サーバーが起動しゲームログインが可能になると通知する

サーバーログを監視してログイン可能になったらDiscordに通知するようにしています。
Discord通知の様子

サーバーIPをroute53に登録

サーバー起動時にIPをroute53に登録するようにしています。これにより、EIPを使わずにDNSのサーバー名で接続するようにします。
ちなみに、
「steam://connect/sdtdPVE02.suzu.me.uk:26900」というようなsteam URLをDiscordに投稿することで、discord->steamアプリ経由で7days to Dieを起動して自動で直接サーバーに接続してくれる便利な機能があります。

スポットインスタンスの中断に備える

EC2スポットを利用するうえでのベストプラクティスにある通り、スポットインスタンスの中断に対する備えとして、中断通知を監視、通知を受けた際はバックアップを取ってサーバーを停止する処理を入れています。

とりあえずCDKでのIaCは一通り完了。これ需要はあるのか?

CDKで、discord側のbotクライアントキーの発行などを除くaws側のほぼすべての設定を自動出来たと思います。(route53のドメイン取得を除く)
これって需要あるのかな?CDKを利用できるぐらいのAWS知識がある人向けではあるが、もし需要あるならもう少し詳しい手順などを記載したいと思います。

Discussion