0
0

AWSでSatisfactory Dedicated Serverを構築したお話

Last updated at Posted at 2024-08-03

はじめに

題名どうりです.AWS環境下にSatisfactoryのサーバーを構築した際の手順を記事にしました.Satisfactory Dedicated Serverの構築に関する日本語wikiや記事がどれも情報が古かった(2024/8/3現在)ので記事にしました.AWS以外の所はAWSではなくとも共通するところがあるので手持ちのUNIX環境で構築する人,AWSでゲームサーバーを初めて立てる人の役にも立てばいいと思っています.AWSは,というかamazonのサービスは昔から表示が見にくく,AWSの記事も文字ベースで説明が雑に感じて今回も含めてイライラしていたのでUNIXでのサーバー構築やそもそもAWSが初めての自分ですがなるべく図や解説とか多めで記事を構築していければと思います.

追記(2024/9/13)
Satisfactory1.0がついにリリースされました.それに従いDedicated Serverの仕様が変更されたため,記事内容の一部を変更します.また正式版では一部のコンフィグファイルをいじらなくてもゲームから各種設定の変更ができるようになりました.

Satisfactoryとは

image.png
image.png
image.png
Satisfactoryホームページ
Epic Games販売ページ
Steam販売ページ

Satisfactoryはバカゲーで有名になったGoat Simulatorを開発,販売をしたスタジオであるCoffee Stainの工場シミュレーションゲームです.未開の惑星に降り,惑星を開拓し,工場を建設し,資源から資材へ,資材から部品へと繰り返していきマイルストーンを進めていくゲームです.目標以外の進め方はプレイヤー次第で好きなようにベルトコンベアを引き,製造機を立て,自動運転のトラックで荷物を運び,線路を敷いて貨物輸送すると好きなように工場を建設できるゲームです.Satisfactory以外の目的でこの記事を見ている人はぜひ興味を持ったら遊んでみてください.
さて本題です.このゲームにはマルチプレイがあります.マルチプレイをする手段は2つ.1つ目はシングルプレイをしている際にマルチプレイ設定を開き自身のワールドへフレンドを招待する方法です.これはとても簡単ですぐにマルチプレイを始められます.どうぶつの森での村の玄関口の開放やポケモンでのマルチプレイなどと状況は一緒ですね.欠点は単純でワールドを開放している人がいない場合には誰もそのワールドで遊べないという点です.このゲームは作業や建築をするゲームなのでワールドが空いていなければ作業を進められませんし,ふといいアイデアが浮かんでも実行に移すことができません.作業ゲーでは作業できる時間が,ホストがいるときに限られているとかなりボトルネックになります.

image.png
Epic版Satisfactory Dedicated Server(Windows用)
ということで2つ目の方法であるサーバーの出番です.サーバーとはユーザに対してサービスを提供するコンピュータのことです.今回はホストの代わりにいつでもワールドを開けてプレイヤーの出入りを可能にするサービスの提供というところですね.ワールドはいつでも開いている状態にするのでホストがいるいないの状況は関係なくなります.またホスト側からで言えばワールドの制御でコンピュータの処理が割かれなくなります.欠点で言えばサーバーの構築を行わなければいけいないこと,別途サーバーの代金が必要なこと,IPアドレスの確認などなど確認事項が多いことでしょう.ただこの記事へたどり着いてる時点でSatisfactoryのサーバーを立てる興味や準備があり,それだけサーバーにするメリットを感じている人ではあると思いますのでスルーします.
Windows環境下でサーバー開きかつEpicアカウントをお持ちの方は上のリンクからダウンロードでほぼ全てが終わりますが今回はAWSもといUNIX環境下で構築を行います.

構築環境

さてここからはサーバーの構築の手順です.まず初めにすることは言ってしまえばコンピュータの組み立てをします.現実であればパソコンのCPUはこのくらい,メモリはこのくらいと決める工程と一緒です.ただ違う点を挙げるとすればコンピュータは仮想マシンであることでしょうか.仮想というのは現実の物体と同じ振る舞いをするという意味なので難しく深く悩む必要はないのでご安心ください.
今回,自分が作成したマシンは以下の表の通りです.

スペック 動作環境
OS Debian 12(HVM)
アーキテクチャ 64bit (x86)
インスタンスタイプ t3.xlarge (4コア,16GiB)
ストレージ 8GiB SSD
リージョン アジアパシフィック(東京)

過去に触ったことのあるUNIXはDebianやRasbianだったので馴染みがあったので選択した.ここはお好みのOSを選択してくれれば大丈夫です.現在のSatisfactoryのサーバーはArmのアーキテクチャに対応いていないのでx86であることを確認しておこう.最初要件である4コア,16GiBは満たしているがストレージは最小要件15GBを満たしていないのでここは変更箇所かもしれない.リージョンつまりサーバーを設置する地域は東京にしています.場所は大阪などお好きなところを選択してください.サーバーとの物理的な距離は近いほうがいいです.t3.xlargeの使用料は1時間当たり0.1958USDです.現時点の日本円で28.70円です.これらにプラスして料金がかかります.

AWSでインスタンス作成

01.png

ではここから実際にインスタンス,つまりコンピュータの立ち上げを行っていきます.AWSにログインをし,EC2ダッシュボードまで来ている想定で始めます.サーバーを設置する場所を日本の地域にする場合には忘れずにサイト右上の地域をセットしてください.

セキュリティグループ作成

02.png
まず初めにセキュリティグループを作成します.セキュリティグループはいわゆるポート開放です.AWSでは数多くのインスタンスを立ち上げることを想定して同じポートの設定を作成して反映できるようにしています.なので一つ一つインスタンス立ち上げる際にポート開放をしなくてもよくなるということですね.なので個別に設定できるようになっています.ここからSatisfactory用のセキュリティグループを作成します.右上のオレンジ色のセキュリティグループを作成を左クリックしてください.

03.png
ここではセキュリティグループの設定をします.基本的に全ての入力において英字と英数字のみの入力になります.セキュリティグループ名は識別しやすい名前にしてください.説明はこのセキュリティグループの説明を記入する箇所です.ここも後から識別しやすい内容を記載するといいです.

インバウンドルールを設定します.インバウンドルールはサーバーに向かって入る通信に対して許可をする設定を行う設定です.インバウンドルールに設定するのは以下のポートです

タイプ プロトコル ポート範囲 ソース 説明
SSH TCP 22 0.0.0.0/0 SSH通信用のポート
カスタムUDP UDP 7777 0.0.0.0/0 ゲームプレイ通信用ポート
カスタムUDP UDP 15000 0.0.0.0/0 サーバークエリ通信用ポート
カスタムUDP UDP 15777 0.0.0.0/0 ビーコン通信用ポート

この設定は全てIPv4です.SSHは外部からサーバーを操作するために空けておく必要があります.それ以外の3つはゲーム内でのワールドやプレイヤーの操作などに関しての通信を行うためのポートです.Cpffee Stainの開発チームは将来的に7777ポートのみを使う予定とのことです.

変更(2024/9/13)

タイプ プロトコル ポート範囲 ソース 説明
SSH TCP 22 0.0.0.0/0 SSH通信用のポート
カスタムUDP UDP 7777 0.0.0.0/0 ゲームプレイ通信用ポート
カスタムTCP TCP 7777 0.0.0.0/0 ゲームプレイ通信用ポート

正式版ではポートは7777のみを使用します.
TCPとUDPの開放することで通信することができます.

アウトバウンドのルールはデフォルトの全ての通信をパスするようにします.これでセキュリティグループは終わりです.

キーペア作成

04.png

キーペアを作成します.ゲームへのアクセスは問題ないのですがサーバー内部そのものを管理者以外に操作されるのは問題です.そのためサーバーへの特定の者しかアクセスをできないようにします.アクセスを許可する公開鍵と暗号鍵からなる鍵のペアがキーペアです.

image.png
キーペアは後からでも認識できる名前をつけてください.キーペアのタイプはRSA,プライベートキーファイル形式は.pemです.キーファイルのダウンロードも忘れないようにしてください.

インスタンス作成

05.png
下準備が整ったのでインスタンス,つまりコンピュータを作成し立ち上げます.インスタンスを起動を左クリックし設定を開始します.

image.png
image.png

名前は後から管理しやすい認識できる名前をつけてください.OSイメージはDebian,アーキテクチャは64bit(x86),インスタンスタイプはt3.xlarge,キーペアは先ほど作成したキーペアを,ネットワーク設定は既存のセキュリティグループを選択から先ほど作成したセキュリティグループを選択します.ストレージは必要としている分を入力します.全て選択し終わったらインスタンスを起動を選択しますします.

サーバーへの遠隔アクセス

06.png
直後にインスタンスを作成したばかりなのでインスタンスは起動しています.初回以外の場合よく操作するようになるので覚えておきましょう.インスタンスの状態を操作する場合以下のようになります.

操作 説明
インスタンスを停止 システムを停止してインスタンスを停止し動作を終了します.内部のファイルは保存されます.
インスタンスの起動 インスタンスを起動しシステムを立ち上げます.起動する度にパブリックIPv4は変更されます.
インスタンスを再起動 インスタンス,パブリックIPv4,内部のファイルはそのままにシステムの再起動をします.
インスタンスを休止 システムを休止状態にします.休止中はメモリの保存状態も保持されます.システムは停止している訳ではないので課金対象.
インスタンスの終了 インスタンスそのものを終了します.つまり削除と同義です.

image.png
TeraTerm HP

サーバーへ遠隔アクセスをします.WindowsからアクセスなのでTeraTermを使用しました(現在TeraTerm Ver5.2).

07.png
ホストはパブリックIPv4が該当します.

08.png
ユーザー名はadminにします.RSA/DSA/ECDSA/ED25519鍵を使うを選択し,秘密鍵にキーペア設定した際のダウンロードした鍵を選択します.
アクセスが完了すればhomeディレクトリ下のユーザーディレクトリへ配置されます.EC2インスタンスであればユーザー名はadminになります.

基本的なよく使うコマンドの説明はここで一括で説明します.

コマンド 説明
ls 指定したディレクトリ内のファイルとディレクトリの一覧を表示します.lsの後引数がない場合には現在のディレクトリの一覧を,パスを指定するとそのパス内の一覧を表示します.lsの後ろにオプションの-aを入れると隠しファイルも含めた表示をします.
cd ディレクトリ間を移動します.cdの後ろに相対パスパス,絶対パスを指定することで移動します.

パスの指定は~でホームディレクトリ,/でルートディレクトリ(一番上にあるディレクトリの根元)です,..で一つ上のディレクトリを指します.

SteamCmdの入手

普段Steamでクリックして行っているインストール等をコマンドライン形式で行うことができるようになります.これのダウンロードには所有していないゲームのサーバークライアントプログラムもダウンロードできるので使用します.

まずSteamCmdをインストールする前に起動したてのDebianのパッケージプログラム群を更新します.

sudo apt-get update
sudo apt-get upgrade

SteamCmdの動作に必要なGCCコンパイラをインストールします.GCCコンパイラとはCやC++等のC言語関連のコンパイラです.

sudo apt install lib32gcc-s1

次にSteamCmdを格納するディレクトリを作成します.

mkdir steamcmd

作成したディレクトリ内に移動しSteamCmdの圧縮ファイルをダウンロードします.

wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz

圧縮ファイルを解凍します.

tar -xvzf steamcmd_linux.tar.gz

解凍したファイルがディレクトリ内にあれば成功です.コマンドラインにsteamcmd.shを指定することでプログラムを実行します.

./steamcmd.sh

Satisfactory Dedicated Serverインストール

SteamCmdが使用可能になりプログラムを実行した場合以下の待機状態になります.

Steam>

まず初めにインストール先のディレクトリを指定します.初めての実行の場合にはユーザーディレクトリにSteamのディレクトリが自動で作成されます.インストール先のディレクトリ指定ですがWindowsのSteamのようにSteam/steamapps/common/下に置いても問題ありません.ユーザー任意で場所を決めてください.自分は階層が複雑になるとややこしいので浅い階層を指定しました.自身が指定したインストール先を覚えておいてください.ここから先,サーバープログラムのファイルは/home/admin/FactoryServerにある前提で進行します.

Steam> force_install_dir /home/admin/FactoryServer

匿名ユーザーでSteamへログインをします.これにより持っていないゲームのサーバーをダウンロードできます.

Steam> login anonymous

Satisfactoryのサーバーデータをダウンロードします.1690800がSatisfactoryのサーバーがSteamで登録されているIDです.

Steam> app_update 1690800 validate

ダウンロードが終わったらSteamCmdを終了します.

Steam> exit

サービス(デーモン)の登録と設定

サービスもといデーモンとはとある行動をするためにシステム側であらかじめ動作をさせておくプログラムのことです.常駐プログラムとも.サービスはWindowsでの呼称,デーモンはUNIX系列での呼び方です.モニターに映像が映るのも,キーボードが操作を受け付けるのも事前にシステム側がプログラムを動作させているからです.ここでは電源が入った場合にSatisfactoryのサーバーを立てるサービスを作成します.
今回のSatisfactoryのサーバーは遊ぶ時だけインスタンスを立ち上げ,遊ばない場合にはインスタンスを閉じる使い方をしています.そして立ち上げる際に更新プログラムのチェックを行っています.その点にご注意ください.
ここではテキストエディタであるVimを用いてユニットファイルを作成しますがエディタの種類は問いません./etc/systemd/system/には各種サービスを実行するためのユニットファイル群が保管されています.そこへファイルを作成します.

sudo vi /etc/systemd/system/satisfactory-dedicated.service

作成するユニットファイル内は以下の通りです.Unitにはサービスの説明と他のサービスとはどの順番で実行するのかが記載されています.Serviceではサービス実行前にSteamCmdへ引数を用いてコマンドを実行しアップデートがないか実行をさせてからサーバープログラムを実行しています.SatisfactoryのサーバーはUpdate8にてデフォルトではIPv6の通信のみしか受け付けないように変更されているためFactorySever.shの引数に-multihome=0.0.0.0を指定してIPv4の通信のみを受け付けるようにしています.IPv6とIPv4両方の通信を受け付けるようにする場合には-multihome=::を指定します.サービスプログラムが何らかの原因で停止した場合には再び自動で立ち上げるようになっています.

[Unit]
Description=Satisfactory Dedicated Server
Wants=network-online.target
After=syslog.target network.target nss-lookup.target network-online.target

[Service]
ExecStartPre=/home/admin/steamcmd/steamcmd.sh +force_install_dir "/home/admin/FactoryServer" +login anonymous +app_update 1690800 validate +quit
ExecStart=/home/admin/FactoryServer/FactoryServer.sh -multihome=0.0.0.0
LimitNOFILE=100000
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s INT $MAINPID
User=admin
Group=admin
Restart=always
TimeoutStartSec=300

[Install]
WantedBy=multi-user.target

サービスを再ロード,satisfactory-dedicated.serviceの有効化,サービスの起動を行います.

sudo systemctl daemon-reload
sudo systemctl enable satisfactory-dedicated.service
sudo systemctl start satisfactory-dedicated.service

起動が成功していればこの時点でSatisfactoryのメインメニューからサーバーを検出できるようになります.またインスタンス起動時に自動でサーバーの立ち上げを行います.

サービスのステータス確認ができます.

systemctl status satisfactory-dedicated.service

サービスを停止します.

sudo systemctl stop satisfactory-dedicated.service

Satisfactory Dedicated Serverへのアクセス

無事に起動がしていればサーバー追加をしたあとにアクセスを確立し,各種操作を受け付けるようになります.
09.png
Satisfactoryを起動し,サーバー管理からサーバーの追加を選んでください.アドレスはパブリックIPv4です.初回のアクセス時にはサーバーの管理者パスワードを設定します.

image.png
状態からは現在のサーバーの進行状況を確認できます.そのまますぐにゲームに参加できます.

image.png
ゲーム作成はシングルでプレイする際と変わらないです.ただし降下のオープニングがないのでその点は注意してください.

image.png
サーバー各種設定の変更ができます.プレイヤーのパスワード保護はデフォルトでは何も設定されていないです.またサーバーの独自の設定としてプレイヤーがいない場合ゲームを一時停止とプレイヤー切断時にオートセーブをかけることができます.

image.png
シングルプレイと同じ操作でセーブデータの管理ができます.サーバー独自の機能としてセーブデータをサーバーへアップロードすることができます.

image.png
ワールド内に入らなくてもコマンドコンソールに入力することができます.
コマンドは以下の通りです.

コマンド 説明
stop FactoryServerのプログラムを終了します
quit FactoryServerのプログラムを終了します
exit FactoryServerのプログラムを終了します
server.SaveGame サーバーのセーブをします.server.SaveGameの後ろに引数として文字列を入れるとその名前でセーブを行います
FG.AutosaveInterval オートセーブの時間間隔を設定します.デフォルトは300秒です.必ず浮動小数点数の数値を引数に渡さなければいけません
FG.NetworkQuality ネットワーク品質の設定を変更します.0-3の整数値を引数に渡します.3がネットワーク品質の超(Ultra)に該当します.
FG.DisableSeasonalEvents 季節イベントのOn,Offを設定します.整数値で0か1を引数に渡します.0がOff,1がOnに該当します

サーバー管理の項目が不安定な場合があり,サーバーが起動していても反応しないことがあります.表示されない場合はゲームの再起動などをしてください.

コンフィグファイルの設定変更

マルチプレイをした際,なかなかインベントリにアクセスできなかったりとラグが発生したりします.そのためコンフィグファイルを編集して改善を行います.コンフィグファイルはサーバーとクライアント(ユーザー側)の双方に存在しておりその両方を同じ設定にしなければ効果がありません.ここではネットワーク品質関連のコンフィグファイルを操作します.
コンフィグファイルの位置は以下の通りです.
クライアント側(Windows)

%AppData%Local/FactoryGame/Saved/Config/WindowsNoEditer

サーバー(Linux)

/home/admin/FactoryServer/FactoryGame/Saved/Config/LinuxServer

編集するファイルと記述内容は下記の通りです.またUpdate8で変更された内容のコンフィグファイルの記載方法に準拠します.

Engine.ini
該当箇所の数値を変更

[/Script/Engine.Player]
ConfiguredInternetSpeed=104857600
ConfiguredLanSpeed=104857600

[/Script/OnlineSubsystemUtils.IpNetDriver]
MaxClientRate=104857600
MaxInternetClientRate=104857600

[/Script/SocketSubsystemEpic.EpicNetDriver]
MaxClientRate=104857600
MaxInternetClientRate=104857600

Game.ini
該当箇所の数値を変更

[/Script/Engine.GameNetworkManager]
TotalNetBandwidth=104857600
MaxDynamicBandwidth=104857600
MinDynamicBandwidth=10485760

デフォルト設定の4人を超過する参加をする場合にサーバー側のGame.iniへ追加記述する.
シングルプレイのワールドでマルチプレイをする際にも有効.

[/Script/Engine.GameSession]
MaxPlayers=6

GameUserSettings.ini
該当箇所に("FG.NetworkQuality",3)の追記を行う

[/Script/FactoryGame.FGGameUserSettings]
mIntValues=(("FG.NetworkQuality",3))

オートセーブは頻繁に起こるとラグの原因となるため20分毎に設定を行った.間隔はユーザー任意.

mFloatValues=(("FG.AutosaveInterval", 1200.000000))

Scalability.ini
追記を行う.

[NetworkQuality@3]
TotalNetBandwidth=104857600
MaxDynamicBandwidth=104857600
MinDynamicBandwidth=10485760

(任意)Elastic IP設定(固定IP)

10.png
インスタンスは起動するたびにパブリックIPv4が変更されるためTeraTermでの遠隔アクセスやゲームに登録されているサーバーのIPを入力し直さなければならないです.それらを回避するためには固定されたIPアドレスが必要です.ElasticIPは固定IPを払い出してくれるサービスです.追加の費用が発生しますがIPでの煩わしい操作を減らすことができます.Elastic IPを割り当てるを左クリックをし作成を開始します.

image.png
特に変える設定はないので割り当てを左クリックし,Elastic IPを作成します.

11.png
アクションからElastic IPアドレスの関連付けを左クリックし関連付けを行います.

12.png
固定IPを割り振りたいインスタンスを選択し関連付けるを左クリックします.以上で固定IPアドレスが払い出されました.Elastic IPからインスタンスの関連を解除する際はElastic IPアドレスの関連付けの解除を選択します.Elastic IPそのものを削除する際にはElastic IPの開放を行います.

(任意)IAMユーザー払出し

遊びたい人が出るたびにホストがサーバーを起動するのは大変です.そこで遊ぶ人にインスタンスの起動と停止だけの権限を与えたアカウントを払い出して各々で付けて貰うことにしました.限定的なアカウントの払い出しはAWSのサービスのIAMで行います.

image.png
ユーザーグループからグループ作成を左クリックします.

image.png
後から認識しやすいユーザーグループ名を入力します.その後グループ作成をします.

13.png
このユーザーグループにはインスタンスの起動と停止の許可を与えます.許可から許可の追加を左クリックしてインラインポリシーを作成します.追加するのはビジュアルかJSONでStartInstances(インスタンス起動許可),StopInstances(インスタンス停止許可),DescribeInstances(インスタンス閲覧許可),DescribeInstanceStatus(インスタンスステータス確認許可)の4つを許可します.

image.png
次はユーザーを作成します.
image.png
後から認識できる名前を入力してください.AWSマネジメントコンソールを提供する設定にしIAMユーザーを払い出しする設定にします.パスワードはお好みで設定をしてください.次へを左クリック.

image.png
先ほど作成したユーザーグループへ追加をし,次へを左クリック.

image.png
内容を確認し,ユーザーを作成を左クリック.

image.png
忘れずにパスワードやアカウントの情報が記載された.csvをダウンロードし保管します.このcsvに払い出された情報を提供するユーザーに渡してください.人数分のIAMユーザーを払い出すでも,起動と停止だけなので1ユーザーだけでも問題ありません.

おわりに

シングルプレイでワールドを開いてマルチプレイをするのが面倒になりAWSでSatisfactoeyのサーバーを立ててみました.AWS自体も初めてで後学のために触ってみましたがインターフェイスと記事が見ずらすぎて終始ややイライラしてました・・・まあだからこそいろいろ安くできるのかなとも・・・.またSatisfactoryの日本語記事の内容ではどれも古くうまく機能しないことがわかり四苦八苦しました.英語の記事とか見てみるとどうやらUpdate8を皮切りにいろいろな仕様の変更があったような感じですね.Satisfactoryの日本ユーザーはそこまで少なくないとは思うのですが日本語wikiや記事,動画関連はそんなにアウトプットされてないのかなと思いました.これから正式リリースもするので増えるといいなと思います.そしてこれで自分自身が遅くまで起きてワールドを開きっぱなしにすることもなくなり気が楽になりました.サーバー起動時に更新をかけているので正式リリース時には自動的に置き換わるとは思いますが上手くいかない場合には再度確認は必要そうです.あとはどれほど費用がかかるのか経過を観察してみたいと思います.またポートの通信量を見てプレイヤーがワールドにいなければ自動でシャットダウンする仕組もあるようなのでそこを調べてクラウドストレージへセーブデータのバックアップを取る機構を作れたらなと思っています.それではまた.

p.s.ゲーム作成中にサーバー構築しちゃったからゲーム制作戻らないと・・・

参考

[Linux] Satisfactory の Steam Dedicated Server を構築する
Satisfactory Wiki Dedicated servers(Fandom 英語wiki)
Satisfactory Wiki Multiplayer(Fandom 英語wiki)
Satisfactory Wiki Dedicated servers/Running as a Service(wiki.gg 英語wiki)
ARK: Survival Evolved SteamCMDを使ったサーバーの建て方(Linux)
Amazon EC2 に Java 版 Minecraft サーバーをセットアップ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0