hero_picture
Cover Image for 【月額1000円!?安価】AWS EC2でpalworldの占有サーバーを料金安くする方法で構築してみた

【月額1000円!?安価】AWS EC2でpalworldの占有サーバーを料金安くする方法で構築してみた

2024/04/01

こんにちは。株式会社シーズの倉岡です。

最近、発売されたパルワールドをよく遊んでいるのですが、マルチプレイをする時にどうしてもワールドを開くホストがいないと24時間好きな時間に遊べないのが難点でした。

調べていたところパルワールドでは個人でサーバーを立てて遊べる「占有サーバー」という項目があることを知りました。

早速構築しようと、公式ページの推奨スペックを閲覧すると、

CPU4コア(推奨)
メモリ16GB安定した動作のために32GB以上を推奨8GBでも起動可能ですが、メモリ不足によりサーバーがクラッシュする可能性が高まります

引用:https://tech.palworldgame.com/ja/getting-started/requirements

かなりのスペックを要求されていることがわかりました。

レンタルサーバーなどで要求スペックを閲覧した際大体の価格で1万円程度、メモリを非推奨の8GBで抑えて2000円から6000円の相場といったところとなっておりました。

ちなみに、体験談としてはメモリ8GBでは、一人で占有サーバーを遊ぶ分には、問題ありませんでしたが、3人くらい入室した際にラグが発生しかなり重たくなりました。また、一人で遊んでいてもプレイして数時間経過したあたりから処理が重たいといった症状が出ていました。

このことを踏まえAWSで上記のスペックのEC2(サーバー)を選択しようと考えましたが、

m6g.xlargeUSD 0.198(1時間あたり)416 GiB

oh….

1時間あたり USD 0.198ということは USD 0.198 * 720h(30日分の時間) = USD 142.56(1ドル日本円150円と換算して、21,384円)

高すぎます。

CPUを少し妥協して2CPUにしたとして

r6g.largeUSD 0.1216216 GiB

一番安いのでもこれ…

妥協してもかなり厳しそうです。

やはりレンタルサーバーを借りてサーバーを構築するのが、安価で済むのかと諦めかけていましたが、その際ふと「EC2のスポットインスタンスを使ってしまえば良いのではないか?」と頭によぎりました。

EC2 SPOT instance(スポットインスタンス)とは

EC2スポットインスタンスは、Amazon Web Servicesが提供する、使われていないコンピューティング能力を安く提供するサービスです。通常の価格よりも最大90%安く利用できますが、需要が高まるとAWSは予告なしにこれらを取り上げることがあります。そのため、途中で処理が停止しても大丈夫な作業に適しています。

要は、安く使えますが、その同じタイプのインスタンスタイプが多く使われて需要が高まると値段も変動して自分の設定した閾値よりも値段が超えた場合、サーバーが停止されるということみたいです。

90%最大でもoffにしてくれるということは、1日100円や200円程度、推奨スペックのサーバーを1ヶ月つけっぱなしでも3000円くらいで安価に使える!?

これはやってみるしかありません。

パルワールドサーバーに求める条件

今回構築して遊ぶ上で求めたい条件は、

  • 安価に遊べる
  • 最悪サーバーが止まっても再起動すればOK(新たなスポットインスタンスを起動できたらOK)
  • 遊んでない時はサーバーを止めて料金がかからないようにしたい
  • 気にせず推奨スペックで遊びたい

となります。

今回の構成図

完成系はこれになります。

遊びたい時に、「discord」からポチッと押すとサーバーが起動して遊ぶことができて、辞める時に停止を「discord」からポチッと押すとサーバーが停止してくれるといった形にしてます。

サーバー起動停止するにあたって、パルワールドのセーブデータ(ワールドデータ)は常に最新の更新された状態(サーバーが起動する度にデータがなくなってて新規ワールドになってたら遊んでる意味がない)にしたいので、EFSというファイルストレージサービスを使用し、ワールドデータはここに保存することにしました。

こうすることで遊びたい時に起動、遊んでない時に停止して料金を遊んだ時だけに抑え、24時間同じサーバーで友達と一緒に遊ぶ隙間時間に一人で遊ぶなど「ホストがいないから遊べない」問題も解決しつつ、多種多様のプレイスタイルで遊ぶことができます。

この構築を全て説明するとかなり煩雑なため今回は赤枠で囲ったここの部分、ゲームを最低限遊ぶためのサーバー構築部分を解説します。(次のブログでは、Discordからポチッと押すと自動でサーバーが立ち上がる下の部分を紹介します。)

いざ構築

IAM

まずは、権限付与が必要になるのでIAMロールを作成します。

AWSのコンソール画面から左上の検索窓にIAMと入力します。

出てきた「IAM」をクリックして遷移後、左のメニューバーの「ロール」をクリック(メニュー表示がなければ左上の三本横線をクリックしてみてください)

その後オレンジの「ロールを作成」をクリック

ユースケースを「EC2」にして次にいきます。

権限の設定内容のページでは「AmazonSSMManagedInstanceCore」と入力して出てきた一つにチェックマークをつけてください。次へのオレンジをクリック後、ロール名「SSM-role」と入力後オレンジの「ロールを作成」をクリックして完成です。

以降作業する時の注意点

時々リージョン(右上の地域設定)が「東京」以外になってる時があります。各サービス(VPC,EFSなど)にクリックして遷移後、「東京以外になっていたら」東京を選択しましょう。

VPC

まずは、AWS上にサーバー構築する上で必須となるネットワーク周りを作成します。

AWSのコンソール画面から左上の検索窓にVPCと入力します。

出てきた「VPC」をクリックして遷移後、オレンジ色の「VPCを作成」をクリック

下記のようにpalworldとプロジェクト名を入力するだけであとは何も触らず、下のオレンジボタン「VPCを作成」を押してVPCを作成してください。

一応全体の設定項目の画像も貼っておきます。

これでVPCは作成できました。今構成図でいうとこのような形です。

EFS

続いてパルワールドのワールドデータの保存を行うための部分の作成をします。

AWSのコンソール画面から左上の検索窓にEFSと入力します。

EFSサービスへ画面遷移後、「ファイルシステムの作成」のオレンジをクリック

カスタマイズをクリックして詳細に作成していきます。

efsの名前は好きな名前にしてください。今回はpalworld-efsにしました。

続いて各設定は以下にしてます。

名前「palworld-efs」

ファイルシステムのタイプ「リージョン」

自動バックアップ「有効」

低頻度アクセスへの移行「なし」

アーカイブへの移行「なし」

標準への移行「なし」

続いて下記はバーストモードにします。

そしてネットワーク周りは2つ、もしくは3つの接続先(エンドポイント)が設定されてます。

(多分2つ)

サブネットIDの項目を1つずつ確認して、エンドポイントがプライベートサブネット内に設定されているかを確認して置いてください。(文言に「private」になってたらOKです。もし「public」という名称のサブネットが選択されていた場合は「private」にしてください。)

ステップ3の「ファイルシステムポリシー」は何も触らず「次へ」をいき最後確認してEFSを作成します。

これで下記のような形の構成図になってます。

EC2

続いてサーバーを作成します。

AWSのコンソール画面から左上の検索窓にEC2と入力します。

EC2の画面に遷移後、オレンジのマーク「インスタンスを起動」をクリックしてください。

一番上の名前とタグは「palworld-server」にします。

続いてOSですが、今回は「ubuntu」を選択します。

インスタンスタイプは「r6a.large」にして、SSHは「キーペアなしで続行」を選択してください。

ネットワーク設定は「編集」をクリックしてから

VPC「palworld-vpc」を選択

サブネット(ここは「public」という名称がついたものが選択できてたらOK)

パブリックIPの自動割り当て「有効化」

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

セキュリティグループのルールは一度「削除」というボタンを押して22番ポートのルールを削除します。その後、「追加」をクリックして、カスタムUDP、8211ポートを0.0.0.0/0に設定してください。以下にしてください。

これでパルワールド用のポート(8211ポート)だけ開けている状態なのでセキュリティもかなり担保されます。

続いてストレージはそのままの8GBで問題ありません。

最後に「高度な詳細」をクリックして下に表示されましたら「IAM インスタンスプロフィール」でIAMで作成した「SSM-role」を選択してください。

これであとはオレンジの「インスタンスを起動」をクリックしてサーバーを立ち上げます。

一覧のページに戻り「paleorld-server」があればOKです。

続いてセキュリティグループの追加を行いたいので、対象のサーバーを左クリックしてチェックをつけたあと「アクション」「セキュリティ」「セキュリティグループの変更」を選択します。

セキュリティグループで「default」を選択後、右の「セキュリティグループを追加」をクリックして下の画像のように2つになればOKです。

これでサーバーの準備も整いました。

サーバー内にパルワールドをinstall

再度サーバー一覧に戻り、対象のpaleorld-serverを選択後、次は接続をクリックします。

左から2番目のタブ「セッションマネージャー」より接続を行なってこの黒い画面が出ればOKです。

この黒い画面が出ましたら、以下のコマンドを入力していきます。

#に書かれている内容はコメントになるので入力しないでください。

1#管理者権限取得
2sudo su -
3
4#updateします。
5apt-get update
6
7#Press [ENTER] to continue or Ctrl-c to cancel.と記載があるので、エンターを押します。
8add-apt-repository multiverse; sudo dpkg --add-architecture i386; sudo apt update
9
10#steamcmdをinstallします。
11apt install steamcmd

steamcmdをinstallしているときに以下の画面が出た際は右矢印キーの後にエンターキーを押す子ドえOKができます。

同意しますかの部分は上下の矢印キーでagreeを選択後右矢印キーエンターキーを押してください。

最後はエンタキーだけ押してください。

1#EFSに接続する(マウントする)ための準備
2apt-get -y install binutils
3git clone https://github.com/aws/efs-utils
4cd efs-utils
5./build-deb.sh
6ls ./build/amazon-efs-utils*deb
7apt-get install -y ./build/amazon-efs-utils*deb
8
9#マウントするためのディレクトリの作成
10mkdir /palworld
11#マウントコマンド(下記を参照)
12mount -t efs -o tls fs-0f57************:/ /palworld
13
14#サーバーが起動した時に自動でマウントされるように設定
15echo 'fs-0f57************:/ /palworld/ efs _netdev,tls 0 0' | sudo tee -a /etc/fstab > /dev/null
16
17#マウントされているか確認。下記のようになっていればOK
18df -h /palworld
19#Filesystem      Size  Used Avail Use% Mounted on
20#127.0.0.1:/     8.0E     0  8.0E   0% /palworld

マウントのコマンドに関しては、EFSサービスの先ほど作ったEFS「palworld-efs」にアクセス、オレンジ色の「アタッチ」を押すことで「EFS マウントヘルパーの使用:」という部分にコマンドの記載があります。

1#palworld install
2steamcmd +login anonymous +force_install_dir /palworld +app_update 2394010 validate +quit
3#root権限で実行できないのでユーザーを作成
4sudo useradd -m steam
5#パスワード設定(任意)
6sudo passwd steam
7#New password:
8#Retype new password:
9#passwd: password updated successfully
10
11#palwolrdのファイル所有者をsteamユーザーにする
12chown -R steam:steam /palworld/
13
14#先ほど作成したsteamユーザーにスイッチ(左のrootがsteamユーザーになればOK)
15sudo -u steam -s
16#root@ip-10-0-21-160:/palworld# sudo -u steam -s
17#steam@ip-10-0-21-160:/palworld$
18#(こうなっていればOK)
19
20#palworldを実行するために/palworldに移動
21cd /palworld
22
23#スクリプトをこのまま実行すると「steamclient.so: cannot open shared object file: No such file or directory」
24#と頻繁に出るのでこちらを3行実行してから一番下のスクリプトを実行します。
25mkdir -p ~/.steam/sdk64/
26/usr/games/steamcmd +login anonymous +app_update 1007 +quit
27cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/
28
29
30#スクリプト実行
31./PalServer.sh
32#Shutdown handler: initalize.
33#Increasing per-process limit of core file size to infinity.
34#setrlimit() failed with error 22 (Invalid argument)
35#- Max per-process value allowed is 0 (we wanted infinity).
36#dlopen failed trying to load:
37#steamclient.so
38#with error:
39#steamclient.so: cannot open shared object file: No such file or directory
40#[S_API] SteamAPI_Init(): Loaded '/home/steam/.steam/sdk64/steamclient.so' OK.  (First tried local 'steamclient.so')
41#CAppInfoCacheReadFromDiskThread took 9 milliseconds to initialize
42#dlmopen steamservice.so failed: steamservice.so: cannot open shared object file: No such file or directory
43#Setting breakpad minidump AppID = 2394010
44#[S_API FAIL] Tried to access Steam interface SteamUser021 before SteamAPI_Init succeeded.
45#[S_API FAIL] Tried to access Steam interface SteamFriends017 before SteamAPI_Init succeeded.
46#[S_API FAIL] Tried to access Steam interface STEAMAPPS_INTERFACE_VERSION008 before SteamAPI_Init succeeded.
47#[S_API FAIL] Tried to access Steam interface SteamNetworkingUtils004 before SteamAPI_Init succeeded.

これで「./PalServer.sh」を実行時に下記のような内容が出力されていれば成功です。

もしエラーなどが出た場合はchatgptなどを使用しエラー解消に努めてみましょう。

サーバーから切断します。「exit」コマンドを2回打っても良いですし、ページのタブを閉じてしまっても良いです。

実際に動作確認!接続してみる

実際に接続してみてワールドに入ってみましょう。

AWSのコンソール画面から左上の検索窓にEC2と入力します。

EC2の画面に遷移後、左のメニュー欄の「インスタンス」をクリックしてください。

すると先ほど自分が構築したサーバーが出てくると思います。

今回は下記のIPのようですね。(ちなみにこのパブリックIPさえ分かれば誰でも今は入ることができます。また、このIPはサーバーが再起動されるたびに変わります。)

palwordのタイトルから占有サーバーを選んで下のここにIPを入力(自分のところにでたIPを入力してくださいね)「18.183.**.****:8211」

接続するとキャラメイクからスタート

無事遊べることを確認しました!

これでサーバーの構築は完了です!

今ここまで作成ができました。あともう一踏ん張りです。

あとは、

「サーバーが起動した時に自動でパルワールドが実行される」

本番(これがミソ)

「出来上がったサーバーデータ(AMI)を使ってスポットインスタンスでサーバーを立ち上げる」

おまけ

「パルワールドのセキュリティ面を少し強化する」

の三点です。

パルワールドを自動で起動させる

まずはサーバーを再起動してください。インスタンスの状態から「インスタンスを再起動」を選択します。

起動した時にパルワールドも実行されるように設定したいと思います。

サーバーに再度接続します。接続方法は前と一緒なので遡って方法を確認してください。

サーバーに接続後下記のコマンドを順に実行していきます。

1sudo su -
2
3#マウントのIDのようなものを確認する(これ重要)
4systemctl list-units --type=mount | grep pal
5#palworld.mount  loaded active mounted /palworld
6#「palworld.mount」が今回のマウントID
7#サービス記載
8sudo nano /etc/systemd/system/palserver.service

以下の「nano」コマンドでファイルに内容を書き込むコマンドになります。

1[Unit]
2Description=Palworld Server Startup Script
3After=network.target palworld.mount #「palworld.mount」のマウントの文言は先ほどのコマンドで確認
4Wants=palworld.mount
5
6[Service]
7Type=simple
8User=steam
9Group=steam
10ExecStart=/palworld/PalServer.sh
11
12[Install]
13WantedBy=multi-user.target

上記をペーストした後に、「crtl」キーと「x」キーを入力して、保存する「y」の後「エンターキー」で保存できます。

※もし間違えて1からやり直したい場合は「crtl」キーと「x」キーを入力して「n」の後「エンターキー」で保存せずに終了ができます。

※少し解説すると、サーバー起動後、efs(パルワールドのデータ)がマウントされてからパルワールドのスクリプトが実行されるように設定されています。上記のマウントされるターゲットの設定が異なると自動でパルワールドが自動で起動してくれなくなります。

記載後

1#設定を読み込む
2sudo systemctl daemon-reload
3
4#palworldを実行する
5sudo systemctl start palserver.service
6
7#palworldが実行されているか確認するコマンド(次のコマンド打てない時はctrlキーとcキーで抜け出すことができます。)
8sudo systemctl status palserver.service
9
10#palworldをサーバー起動時に自動起動するようにする
11sudo systemctl enable palserver.service

これでサーバーが再起動されても自動でパルワールドが起動してくれます。

再度サーバーを再起動して、パルワールドが遊べるか確認して見てください。

再起動してサーバーが起動したらパルワールドが自動起動していることを確認しました。

これで「黒い画面から一回一回コマンド入力してパルワールドを起動」をしなくてすみました。

サーバー自体は完成です。このまま遊べますが、まぁ料金がとんでもないことになります。

なので、実際に遊ぶときに料金を抑えるためスポットインスタンスで起動して遊びたいと思います。(これが今回のミソ)

スポットインスタンスを使用して遊ぶ(今回の注目ポイント)

下準備:AMIを取得

出来上がったサーバーのデータを丸々とコピーして保存しておきます。

イメージとしてはバックアップ、もしくはセーブデータ保存みたいなものです。

サーバーの一覧ページから「アクション」「イメージとテンプレート」「イメージを作成」を選択します。

AMI名「palworld-server-今日の日付」説明の部分も同様にしておきます。

再起動しないを有効化

この3点問題なく設定できたら右下の「AMIを作成」オレンジボタンを押して作成してください。

AMIの一覧に作成されたAMI(利用可能)があればOKです。

また、AMIを取得(サーバーの情報をまるっと保存)できたので、今起動しているサーバーは削除しましょう。

EC2の一覧ページから「インスタンスの状態」で「終了」を選択します。

するとこのような画面が出るのでオレンジボタンを押してください。

下記のように一覧で終了済みになっていればOK

下準備:起動テンプレートの作成

サーバーを毎回起動させるのに細かな設定を毎回するのは面倒なので、その設定を「起動テンプレート」というものであらかじめ設定しておきます。

サーバーを起動させるためのメニュー表のようなものですね。

下記のように左のメニューから「起動テンプレート」を選択してオレンジの「起動テンプレートを作成」をクリックします。

始めは任意の名前今回は「palworld-tl」にしておきます。

続いて先ほど作成したAMIを選択します。

「このサーバーデータを使って立ち上げてくださいね」ということですね。

インスタンスタイプ 

キーペア (ログイン) 

ここは何も触らなくて問題ないです。

ネットワーク設定 (大事)

ここではまず、セキュリティグループは下記の2つを選択します。

自分の作成したものです。defaultが2つあると思いますが、palworld-vpcと同じVPCの値のセキュリティグループを選択してください。「launch-wizard-1」と同じIDに当たるものですね。

高度なネットワーク設定をクリックしてパブリックIPの自動割り当てを有効化にしてください。

最後に下の高度な詳細で「ssm-role」を追加してください。(これがないとサーバーに接続できません。)

以上の設定ができたらオレンジの「起動テンプレートを作成」をクリックして作成します。

スポットインスタンスの作成

ここからは次回以降遊ぶ時(サーバーを起動する作業時)にする作業です。

※今は手作業ですが、次回の記事ではこの作業がdiscord経由でポチッとするだけでできます。

スポットリクエストからオレンジの「スポットインスタンスのリクエスト」をクリックします。

先ほど作成したテンプレートを選択します。

ネットワークはpalworld-vpcを選択します。

サブネットはそれぞれaとcを選んでください(サブネットがpublicになってることを確認してください。)

続いてリクエストするcpuとメモリの理想数を下記のようにリクエストします。

できましたら最後右下のオレンジボタン「作成」を押してください。

すると下記のようにリクエストされます。

作成されたサーバーのIPをコピペしてパルワールドから接続することで続きから遊ぶことができます。

以上で完成です!

今、この状態ではAWSにログインできる人がこの操作をして立ち上げないといけませんが、いづれはdiscord経由でポチッとURLを押すだけで止まったり起動したりができるのでかなり便利になります。

料金は……

スポットリクエストから一覧の一番左、「リクエストID」にあるスポットインスタンスをクリックしてください。そしてスクロールして下に行くと料金がどれくらいかかるかの試算が出ています。

通常では1時間あたり

$0.40(日本円1ドル150円として、1時間あたり60円)

なのが、なんとスポットインスタンスの使用で

$0.08(日本円1ドル150円として、1時間あたり12円)

100h使うとして、差額4,800円

200h使うとして、差額9,600円

かなり変わります。しかもなんといってもこのサーバー使う時だけ起動してみんなが仕事で忙しい時、使ってない時は停止するのでつけっぱなしの無駄な料金もかかりません。

お得すぎる…。

おまけ:設定、セキュリティ

下記の場所に設定ファイルがあります。こちらを編集することで設定できます。

詳細は公式サイトその他のサイトを参考してください。

公式サイト:https://tech.palworldgame.com/ja/settings-and-operation/configuration

1nano /palworld/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
2
3#設定反映させるために再起動
4sudo systemctl restart palserver.service

おまけ:アップデートする際

ちなみにサーバー内のデータアップデートが必要な場合は、サーバー起動後接続して以下のコマンドを実施するだけです。

1sudo su -
2#止める
3sudo systemctl stop palserver.service
4#アップデート実施(初回の時のコマンドと同様)
5steamcmd +login anonymous +force_install_dir /palworld +app_update 2394010 validate +quit
6#起動
7sudo systemctl start palserver.service

これだけです。

いかがでしたでしょうか。ちなみに4CPUを2CPUにするとさらにお得になり、1時間あたり5円で遊べたりします。そうなると本当に月300時間遊んでも1500円程度とかなりお得すぎます。

ぜひ安価に占有サーバー遊んでみたい方は試してみてはいかがでしょうか?

実際に使った時の実費額とdiscordからポチッと押すだけで上記の手動作業もなくなる方法も後日記載予定です。