🦕

【GCP】GCEでパルワールド専用サーバーを構築して節約するTips

2024/02/24に公開

はじめに

Palworld(パルワールド)楽しいですよね!仲間とマルチでやるとより面白さを感じています。

そんなマルチプレイをするためのパルワールド専用サーバー(Dedicated Server)を、Google Cloud(GCP: Google Cloud Platform)のGCE(Google Compute Engine)を使って構築しつつ、極力節約もして料金を抑えながら快適に仲間うちで利用できるような運用方法を紹介しようと思います。
パルワールドだけでなく、Steamの任意のゲームのDedicated Serverを構築する際にも応用ができる内容となっています。

おすすめのターゲット層

  • 24時間常時起動はせず、最低限の維持費でサーバーを運用したい
    • やりたい時だけ仲間と集まってやりたい
    • 人が集まらなくても各々がソロでやりたい時だけやりたい
  • 基礎的な情報系知識やLinuxサーバー、VMへの教養がある方
    • 仲間はあまり教養がなくてもOK
  • Google Cloudに興味がある方 / すでに利用している方

他のソリューションとの比較

専用サーバー自体の運用をする方法は、他にもさまざまな方法があると思いますが、簡単に比較しておきます。
お金を気にしないのであれば、おそらくゲーム系のレンタルサーバーを借りるのが確実に一番手っ取り早いと思います。仲間との共用と書きましたが、お金を気にしないなら常設しちゃえばいいからです。

Google Cloudを他のVPSを比較した際に優れている点は、新規アカウントであれば90日間の$300のトライアル用のクレジットが付与されるため、最初の3ヶ月は実質無料で使える点が大きいと思います。
また、管理者以外はGmailのアカウントを持ってさえいれば共用での管理も簡単にできるという点も素晴らしいと思います。

ソリューション 導入 料金 オンデマンド性 仲間との共用
自宅PC ⚪︎ 簡単 ◎ 電気代のみ △ 本人しか起動できない △ セキュリティ的に厳しい
レンタルゲームサーバー ◎ 超簡単 △ 高い ⚪︎ プランによる △ アカウントの共有が必要
他のVPS ⚪︎ 簡単 ⚪︎ 普通 ⚪︎ 可能 ⚪︎ 可能だが専用のアカウント作成が必要
Google Cloud ⚪︎ 簡単 ◎ 普通だがクレジット$300付与 ⚪︎ 可能 ◎ Gmailで権限管理可能

構築手順

構築手順は大きく分けて、VMの作成と専用サーバーのインストールの2つに分かれます。
それぞれ説明していきます。

まだGoogle Cloudの登録をしてない方はやり方は割愛しますが、下記からどうぞ。
今回の専用サーバー構築用のプロジェクトの新規作成も行なってください。
(⚠️ 無料クレジットがつきますが、支払い情報の登録は必須となります)
https://cloud.google.com/?hl=ja

Classmethodさんの記事も詳しいです。
https://dev.classmethod.jp/articles/google-cloud-start/

GCEでVM(仮想マシン)を構築する

Google Cloudには、GCE (Google Compute Engine)というソリューションがあります。
簡単にいうと、VM(Virtual Machine: 仮想マシン)をクラウド上に構築し、起動/停止やさまざまなスペックへの設定などを簡単にGUI上で制御できるプロダクトです。

さまざまなプロダクトやサービスが提供されているGoogle Cloudですが、今回の専用サーバーの構築はこちらのGCEを用いるのが最適かなと思います。

VMインスタンスの作成

コンソールからCompute Engineを開き、インスタンスを作成を選択します。

設定は下記の通りにし、作成 を選択しましょう

設定
名前 任意(palworld-vmとでもしておきましょう)
リージョン us-west1(安い & 物理距離が日本に近いため)
ゾーン 任意(デフォルトのままで良いでしょう)
Series E2
マシンタイプ e2-standard-4(4 vCPU、2コア、16GBメモリ)
ブートディスク OS: 任意のLinux(特になければUbuntuで良いでしょう)
バージョン: 任意(Ubuntuなら20.04 LTSなど)
ブートディスクの種類: 標準永続ディスク
サイズ(GB): 最低の10GBでも十分でしょう
詳細オプション ネットワークタグ: palworld
その他 デフォルトのまま

リージョンは物理的なサーバーの距離に依存するため本当は近いほど良いのですが、tokyoリージョンはusのリージョンに比べて料金も割増なので、まずは安いusのサーバーで運用してみてレイテンシー改善したいと思ったら移行すれば良いと思います(筆者はusリージョンでプレイしていますが、特段ストレスはないです)。
マシンタイプは、後述の要求スペックに合わせて、e2-standard-4を選択します。
後から変更もバッチリ可能ですので同接人数に応じて、少なければe2-standard-2、多ければe2-standard-8に変更すると良いでしょう。
詳細オプションを展開し、ネットワークタグを設定することを忘れずに行いましょう。後述のファイアウォール設定との紐付けに利用されます。

ファイアウォールを設定して特定のポートからのアクセスを許可する

さて、VMインスタンスはポチポチするだけで簡単に作成できました。
Palworldでは、ポート8211番がデフォルトのサーバー待ち受けとして利用されています。
GCEはデフォルトでは最低限のポートへのアクセスしか設定がされていないため、このポートに対してのアクセスを許可する設定を加えてあげる必要があります。

Google Cloudのファイアウォールルールの設定のコンソールページを開き、ファイアウォールルールを作成を選択します。

設定は下記の通りにし、作成 を選択しましょう。

設定
名前 任意(palworld-firewall-rule とでもしておきましょう)
ターゲットタグ palworld(先ほど設定したVMのネットワークタグと合わせる)
送信元IPv4範囲 0.0.0.0/0
プロトコルとポート 指定したプロトコルとポート
UDPにチェック
ポート: 8211

これで、VMの構築はすべて完了です!

VM上にパルワールド専用サーバーをインストールする

ここからは、作成したVM上にパルワールド専用サーバーをインストールしていきます。
⚠️ 必要なアセットのDLが走るため、少々時間を要します

基本的には本家のPalworldテックガイドが存在しており、VMに入ってコンソールからそれ通りの手順を踏めば誰でも割と簡単に組めるようになっているので割愛しますが、一つ一つの手順をよく読みつつ意味を理解しながらやってみることをお勧めします。(Linux - SteamCMD の場合を参照)
https://tech.palworldgame.com/ja/

ここまでの手順を完了すれば、ssh上でパルワールドサーバーを起動し、ゲーム側でもマルチサーバーへの接続ができるようになっているかと思います 🎉
接続するIPアドレスは、GCEのコンソールで起動時に外部IPの欄に表示されているアドレスを入力し、先ほど開放した8211のポートをつけて入力してあげればOKです。
xxx.xxx.xxx.xxx:8211

節約しつつ快適に遊ぶためのTips

ここからがこの記事の本番です!

パスワードを設定する

野良が入ってきて悪さをされないように、パスワードを設定することをお勧めします。
このやり方もPalworldテックガイドに記載されているので、よく読みながら設定を変更しましょう。
https://tech.palworldgame.com/ja/settings-and-operation/configuration

使う時だけVMを起動し、ゲームをやめるときは停止する

Google Cloudでは、VMを起動している間に課金が発生します(永続ディスクなどその限りではないものもあります)。
つまり、VMを停止していればその間の課金を最小限に抑えることができます。
コンソールから、起動(開始/再開)と停止はボタン1つで可能なため、こまめに利用しない場合は停止することを忘れないようにしましょう。

https://cloud.google.com/compute/docs/instances/limit-vm-runtime?hl=ja

https://cloud.google.com/app?hl=ja

VM起動で専用サーバーを自動的にSystemdで立ち上げる

本家のテックガイドのサーバー起動方法だと、常にssh接続が必要となり、その接続が切れた場合はサーバーが落ちてしまうという運用上の大きな課題があります。
せっかくクラウドサーバーを使っているので、その恩恵を受けられるようにしましょう。

ソリューションとしては、Linuxシステム管理ツールであるSystemdを使って実現したいと思います。

まずは、専用サーバー構築手順の中でも作成したsudo権限を持つユーザでログインします。

$ sudo -u steam -s
# パスワードを入力

次に、serviceの設定ファイルを作成します。

sudo vi /etc/systemd/system/palworld-server.service

内容は下記をコピペしましょう。
中身は今回は割愛しますが、万一、停止してしまった場合も15sで再起動するような設定も入れています。

palworld-server.service
[Unit]
Description=Palworld Server
After=networking.service

[Service]
Type=simple
User=steam
WorkingDirectory=/home/steam/Steam/steamapps/common/PalServer
ExecStart=/home/steam/Steam/steamapps/common/PalServer/PalServer.sh
Restart=on-failure
RestartSec=15

[Install]
WantedBy=multi-user.target

最後に、VM起動後に自動でこのサービスが起動するようにサービスの有効化をしておきます

$ sudo systemctl enable palworld-server.service

仲間にVMの編集権限を付与する

さて、ここまで設定すれば、VMを起動するだけで専用サーバーを立ち上げることができるようになったので、起動/停止を仲間にも行ってもらえるようになると、それぞれが任意の時間にマルチサーバーへ接続することができるようになります。

そこで、GCEの編集権限を任意のGmailアカウントに付与します。
まずは、仲間にGmailのアカウントを聞いておきましょう。

次に、Google CloudコンソールにてIAM(Identity and Access Management)というアクセス管理のソリューションにアクセスします。

アカウントに対してGCEが編集できるロール(権限)を付与するため、アクセス権を付与を選択し、下記を入力し、保存を選択します。

設定
新しいプリンシパル 追加したいGmailアドレス
ロールを選択 編集者

編集者というロールにはGCEの操作が可能なサービスアカウントが自動的に割り当てられるため、 
そのロールを任意のGmailアドレス(プリンシパル)に割り当てるだけでその操作が可能になります。

この権限を追加したGmailアカウントを用いて、GCEのコンソールページのリンクを開くと、GCPへのアカウント作成をせずともGCEにアクセスすることができるようになります(とても便利ですね)。

サーバー起動時に割り当てられた外部IPアドレスをDiscordに通知する

GCEをデフォルトの設定で作成すると、外部IPアドレスはエフェメラルIPという短期的に割り当てられたアドレスが設定されます。
つまり、起動のたびにIPアドレスが変わることがありえます
もちろん、静的な外部IPアドレスを設定することも可能ではありますが、こちらは別途課金対象となるため、料金を最小限に抑えたい場合は向きません。

そこで、サーバー起動時に割り当てられた外部IPアドレスをDiscordにbot通知させるようにすることで、参加する人がIPをゲームログイン時に入力するサポートをできるようにしたいと思います。

このためのソリューションも先述したSystemdです。
今度は、IPアドレス通知用のサービスを作成していきます。

まずは、専用サーバー構築手順の中でも作成したsudo権限を持つユーザでログインします。

$ sudo -u steam -s
# パスワードを入力

GCEに割り当てられた外部IPをDiscordのWebhook URLに送信するShellスクリプトを作成します。

vi ~/notify-on-startup.sh

内容は下記をコピペし、Webhook URLの部分だけ各自のDiscordサーバーの特定チャンネルのものに修正してください。
DiscordのWebhook URLの取得方法は公式ページWebhookの作成の手順を参考にしてください。

notify-on-startup.sh
#!/bin/bash

# 外部IPアドレスの取得
EXTERNAL_IP=$(curl -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip)

# Discordに通知
WEBHOOK_URL="<Discord Webhook URL>"
curl -H "Content-Type: application/json" \
     -d "{\"content\": \"VMが起動しました。\nIP: ${EXTERNAL_IP}:8211\"}" \
     $WEBHOOK_URL

作成したShellスクリプトファイルに実行可能権限を付与します。

chmod +x notify-on-startup.sh

次に、serviceの設定ファイルを作成します。

sudo vi /etc/systemd/system/startup-notifier.service

内容は下記をコピペしましょう。

startup-notifier.service
[Unit]
Description=Notify Discord on Startup
After=network.target

[Service]
Type=oneshot
User=steam
ExecStart=/home/steam/notify-on-startup.sh
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

最後に、VM起動後に自動でこのサービスが起動するようにサービスの有効化をしておきます

$ sudo systemctl enable startup-notifier.service

さて、これでVM起動時に下記のようなDiscord botが通知をしてくれるようになりました🎉

サーバー停止時にDiscordに通知する

万が一、サーバーが停止してしまった場合や、今現在サーバーが立ち上がっているかがDiscord上で確認できるように、サーバー停止時にもDiscordへ通知できるようにしましょう。

同じようにSystemdを使っても良いのですが、GCEにはシャットダウンスクリプトという機能があり、それを使うことで任意のShellスクリプトをインスタンス停止時に実行することができるので、こちらの方がお手軽なためこれを用いて実現したいと思います。
(ちなみに起動時スクリプトという機能もあり、IPの通知に使えるのではと思った方もいると思いますが、起動直後にはまだ外部IPアドレスが割り当てられない可能性も考慮して試していません)

GCEのコンソールからVM名を選択し、「編集」を選択します。

メタデータのキーにshutdown-scriptと入力します。
値には、下記のスクリプトをコピペします。DiscordのWebhook URLの部分は先ほど作成したURLをセットします。

#!/bin/bash

# Discordに通知
WEBHOOK_URL="<Discord Webhook URL>"
curl -H "Content-Type: application/json" \
     -d "{\"content\": \"VMが停止しました。\"}" \
     $WEBHOOK_URL

こんな感じになると思います。

これで、VMを停止すると下記のようなbot通知を受け取ることができるようになりました🎉

さいごに

カスタムの機能も豊富なGoogle Cloudを使いこなすと非常に便利なことがお分かりいただけたのではないかと思います。
普段業務でも大変お世話になっているGoogle Cloudですが、GCEは初めて利用してみましたが今回紹介したゲーム用のサーバー以外にもさまざまな用途に使える素晴らしいソリューションなので、これを機にどんどん使っていこうと思いました!

Discussion