AWS IT ゲーム パルワールド

PALWORLDのサーバーをAWSで用意して使用するときだけ起動する

当サイトのコンテンツには、広告を記載している場合があります。<景品表示法に基づく記載>

友達とプレイする際、一緒にプレイする時間を決めていればホストがサーバーを立てることで問題なくプレイできますが、ホストのプレイヤーにずっとサーバーを立ててもらうわけにもいかないですよね。

今回は専用サーバーをAWSを使って建てる方法をご紹介します。

PALWORLDのサーバーは、招待コード制のローカルサーバーだと4人が上限となっていて、専用のサーバーを用意した場合は32人が最大になっています。大人数で一緒にプレイできるのも魅力です。

この記事ではAWS上にPALWORLDサーバーを建てる方法を紹介します。AWS CDKを使ってサーバーをデプロイする方法を採用しています。

免責事項:本内容の実施によって生じるいかなる損害についても、当サイトは責任を負いません。
上記内容にご了解いただける方のみご利用ください。

AWSでサーバーを建てるメリット

  • サーバーを起動している間のみ料金が発生するため、使用しない間はコストを抑えることができる
  • サーバーのスケールアップに対応し易い
  • サーバーの作成、廃棄が楽

今回利用するAWSは従量課金制なので、サーバーを起動している間のみ、課金されます。

なのでもしゲームに飽きた、などの理由でサーバーが不要になったときでもサーバーを停止するだけで課金を抑えることができます。

また、無料利用枠もあるので利用したことがない方はお得に利用できるかと思います。サーバーを増強したい、といった場合にも柔軟に対処し易い点もおすすめです!

サーバーをいつでも停止して、コストが発生しないようにできる反面、従量課金制なので使っていない時間もサーバーを起動してしまうとXサーバーなどのVPSを利用する場合と比較して高くなる可能性があります。使っていない時間帯はサーバーを停止するなど工夫して使う必要があります。

Xbox版は専用サーバーに接続できませんので、ご注意願います。

まずはAWSに登録

以下ページからAWSに登録します。支払い用のクレジットカードは登録する必要があります。

AWS アカウント作成の流れ:
https://aws.amazon.com/jp/register-flow/

AWS登録後Day1対応を実施します。以下ページのスライドに最初に設定すべき内容の記載があります。利用状況によってはお金がかかるサービスもあるのでご注意願います。p.9 セキュリティで最初にやっておきたいことあたりは一読し、必要に応じて実施しておくことをおすすめします。特に「AWSルートアカウントは極力利用しない、ルートアカウントはMFAを設定する」は最低限やっておくことを推奨します。

Day 1 with Amazon Web Services - AWSご利用開始時に最低限おさえておきたい10のこと
https://www.slideshare.net/AmazonWebServicesJapan/day-1-with-amazon-web-services-aws10

ローカル環境の準備

AWS CDKを使用します。そのために必要なツールをインストールしましょう。

AWS CLIをインストール

AWS CLI のインストールと更新の手順
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html#getting-started-install-instructions

に従ってインストールします。Mac/Windows/Linuxとそれぞれインストール方法が案内されています。

次にAWSプロファイルを設定します。

$ aws --version
aws-cli/2.11.4 Python/3.11.2 Darwin/23.1.0 exe/x86_64 prompt/off

IAMユーザの作成

AWS アカウント での IAM ユーザーの作成
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html

に従って、rootユーザ以外のAdministratorAccess権限を持つIAMユーザを作成してください。

作成したユーザに対して、AWSマネジメントコンソールのIAM > ユーザ > ユーザ名の「セキュリティ認証情報」からアクセスキーを作成しておきます。

AWSのCLIを設定してみる
https://zenn.dev/mo_ri_regen/articles/aws-cli-setting

にわかりやすくまとめてくださっていますので、参考にしてください。

aws cliに以下のコマンドで設定します。本記事の例ではプロファイルの名前を private としています。

$ aws configure —profile private
AWS Access Key ID [None]: AKIA***
AWS Secret Access Key [None]: je7MtGbC**********************
Default region name [None]: ap-northeast-1
Default output format [None]: json

AWSプロファイルをデフォルトで使用する場合、以下のようにAWS_PROFILE環境変数へ入れておくと便利です。

export AWS_PROFILE=private

なお、コマンド実行時に--profile <プロファイル名> とすることでも指定可能です。
なお、AWS_PROFILEよりコマンドオプションのほうが優先されます。

Nodejsをインストール

まだインストールしていない場合はNodejsをインストールしましょう。
以下公式サイトからダウンロードしてインストールします。

Nodejs公式サイト:https://nodejs.org/en/download

LTS版(長期サポート)をインストールしておけば無難です。Nodejs 10.13.0 以降が必要です。

ターミナル(WindowsはPowerShell)を開いて、以下コマンドを実行しましょう。
バージョン情報(xx.xx.x)が表示されれば問題ないです。

nodeコマンドを確認します。

$ node --version
v18.19.0

※表示されているバージョンとは異なるバージョンで問題ありません。

npmコマンドも同様に確認します。

$ npm --version
10.2.3

AWS CDKをインストール

サーバーの作成にはAWS Cloud Development Kit (AWS CDK)を使用します。

CDKについて、ものすごく簡単に説明するとプログラミングコードでインフラストラクチャ(サーバーやネットワーク)を定義し、デプロイすることができるものです。

CDKの詳細が気になる方はぜひ公式ページをチェックを確認してみてください。

実際に準備していきます

AWS CDKをインストールします

$ npm install -g aws-cdk
$ cdk --version
2.114.1 (build 02bbb1d)

TypeScriptをインストールします。

$ npm -g install typescript

AWS CDKでサーバーを定義する

作業ディレクトリを作成します。

$ mkdir aws-palworld-server
$ cd aws-palworld-server

初期化します。

$ cdk init app --language typescript

必要なパッケージをインストールします。

$ npm install aws-cdk-lib

続いてプログラムのコードを書き換えます

bin/aws-palworld-server.ts を以下の通り変更します。

#!/usr/bin/env node
import "source-map-support/register";
import * as cdk from "aws-cdk-lib";
import { AwsPalworldServerStack } from "../lib/aws-palworld-server-stack";

const app = new cdk.App();
new AwsPalworldServerStack(app, "AwsPalworldServerStack", {
  env: { account: "<アカウントID>", region: "ap-northeast-1" },
});

<アカウントID> の部分はご自身のAWSアカウントIDに書き換えます。アカウントIDの確認は以下画像のようにAWSマネージメントコンソールの右上から確認します。

lib/aws-palworld-server-stack.ts を以下の通り変更します。

import { Stack, StackProps } from "aws-cdk-lib";
import * as ec2 from "aws-cdk-lib/aws-ec2";
import * as iam from "aws-cdk-lib/aws-iam";
import { Construct } from "constructs";
import { CfnOutput } from "aws-cdk-lib";

export class AwsPalworldServerStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const prefix = "cdk-palworld-";

    // VPC
    const vpc = new ec2.Vpc(this, "Vpc", {
      vpcName: `${prefix}vpc`,
      ipAddresses: ec2.IpAddresses.cidr("10.1.0.0/16"),
      natGateways: 0,
      subnetConfiguration: [
        {
          cidrMask: 28,
          name: "public",
          subnetType: ec2.SubnetType.PUBLIC,
        },
      ],
    });

    // セキュリティグループ
    const securityGroup = new ec2.SecurityGroup(this, "SampleSecurityGroup", {
      vpc: vpc,
      securityGroupName: `${prefix}ec2-security-group`,
    });

    securityGroup.addIngressRule(
      ec2.Peer.anyIpv4(),
      ec2.Port.udp(8211), // パルワールド用にポートを開放
      "allow udp 8211 access from the world"
    );

    // EC2用のIAMロール
    const instanceRole = new iam.Role(this, "Ec2Role", {
      assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
      managedPolicies: [
        // セッションマネージャ用のポリシー
        iam.ManagedPolicy.fromAwsManagedPolicyName(
          "AmazonSSMManagedInstanceCore"
        ),
      ],
      description: `${prefix}ec2-instance-role`,
    });

    const instance = new ec2.Instance(this, id, {
      vpc,
      vpcSubnets: vpc.selectSubnets({
        subnetType: ec2.SubnetType.PUBLIC,
      }),
      instanceType: ec2.InstanceType.of(
        ec2.InstanceClass.M7I_FLEX,
        ec2.InstanceSize.XLARGE
      ),
      machineImage: new ec2.AmazonLinux2ImageSsmParameter({
        kernel: ec2.AmazonLinux2Kernel.KERNEL_5_10,
      }),
      securityGroup: securityGroup,
      role: instanceRole,
      instanceName: `${prefix}instance`,
      blockDevices: [
        {
          deviceName: "/dev/xvda",
          volume: ec2.BlockDeviceVolume.ebs(50), // ディスクサイズ: 50GBを指定
        },
      ],
    });

    // EBS最適化
    const cfnInstance = instance.node.defaultChild as ec2.CfnInstance;
    cfnInstance.ebsOptimized = true;

    new CfnOutput(this, "VPC", { value: vpc.vpcId });
    new CfnOutput(this, "Security Group", {
      value: securityGroup.securityGroupId,
    });
    new CfnOutput(this, "EC2InstanceId", { value: instance.instanceId });
    new CfnOutput(this, "EC2InstancePublicIp", {
      value: instance.instancePublicIp,
    });
  }
}

m7i-flex.xlarge インスタンスタイプを指定しています。
サーバーのスペックとしては CPU4コア、メモリ16GB。第 4 世代インテル Xeon スケーラブルプロセッサ搭載のモデルです。

ディスク容量はとりあえず50GBにしました。

AmazonLinux2で動いています。昨今ではAmazonLinux2023への移行が進んでいますが、SteamCMDの依存関係のあるglibc.i686パッケージ等が入っていないので、AmazonLinux2を採用しています。

参考:Amazon Linux 2023 の i686 パッケージについて
https://repost.aws/questions/QUTMOyTk4MT0KJB947GyFIAw/i686-package-on-amazon-linux-2023

AWS環境のブートストラップ

ブートストラップはCDKででプリケーションをデプロイする前に必要なものを準備するための操作です。

デプロイの前に実行しておきます。この操作はアカウント内のリージョンごとに実施が必要です。

$ cdk bootstrap --profile private

その他のオプションについては公式サイト(https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/bootstrapping.html)を参照ください。

スタックを合成(Synthesizer)してみる

CDKではコードを合成して、CloudFormation テンプレートとして表示します。

以下コマンドを実行して、CloudFormationテンプレートを確認します。コード内にエラーがあるとここで表示されます。確認してみてください。

$ cdk synth

サーバーのデプロイ

$ cdk deploy

実行するとデプロイするリソースが表示され、デプロイしてよいか聞かれますので y を入力します。

Do you wish to deploy these changes (y/n)? y

デプロイが完了すると以下が表示されます。

✅  AwsPalworldServerStack

✨  Deployment time: 201.38s

Outputs:
AwsPalworldServerStack.EC2InstanceId = <EC2インスタンスID>
AwsPalworldServerStack.EC2InstancePublicIp = <EC2パブリックIP>
AwsPalworldServerStack.SecurityGroup = <セキュリティグループID>
AwsPalworldServerStack.VPC = <VPCID>
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:<アカウントID>:stack/AwsPalworldServerStack/******

✨  Total time: 203.7s

EC2インスタンスIDEC2パブリックIPは後ほど使用しますので、控えておきます。

EC2パブリックIP はPALWORLDにてサーバーへ接続するために指定するグローバルIPです。

サーバーに接続する前にローカルSSMセッションマネージャプラグインをインストール

SSMセッションマネージャを使用してサーバーに接続する前に、ローカルにSSMセッションマネージャプラグインをインストールしておく必要があります。

Macの場合:
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/install-plugin-macos-overview.html

Windowsの場合:
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-troubleshooting.html#windows-plugin-env-var-not-set

リンク先に従ってインストールしましょう。

以下はMac(M1)にインストールする手順です。

パッケージをダウンロードする。

$ cd /tmp
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac_arm64/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"

解凍する。

$ unzip sessionmanager-bundle.zip

インストールする。

$ sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin

Installation successful! と表示されれば完了です。

セッションマネージャを使用してサーバーにログイン

$ aws ssm start-session --target <EC2インスタンスID>
Starting session with SessionId: <セッションID>
sh-5.2$

shellプロンプトが表示され、ログインできました。
試しにグローバルIPアドレスを確認してみましょう!

$ curl inet-ip.info

事前確認した<EC2パブリックIP>が表示されるはずです。

PALWORLD用にサーバーを設定する

サーバーに接続できたらサーバー内の設定をしていきます。以下の記事にまとめていますのでぜひ参考に設定してみてください!

サーバーの設定はたくさんの方々が紹介してくださっているので参考に実施してみてください。

最大32人 パルワールド Linux 専用サーバの建て方 (AlmaLinux) 
https://qiita.com/naoya-i/items/e907a6b949e5da36d532

などにわかりやすい説明があります。ぜひ参考に設定してみてください。

設定が終わったら事前に確認した <EC2パブリックIP>:8211 で接続できるはずです。

サーバーを利用しないときは停止しよう

サーバーが起動しているとお金がかかるので、サーバーを停止するにはAWSマネジメントコンソールから停止してもいいですし、AWS CLIから停止することもできます。

$ aws ec2 stop-instances --instance-ids <EC2インスタンスID>

スケジュール起動/停止なども設定できます。カスタマイズする場合は公式サイト(https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Stop_Start.html)を参考にしてください。

サーバーを停止すると追加でかかってくるコストがElastic IPです。前段で登場した「EC2パブリックIP」に当たります。適宜開放するなりしてコストを抑えましょう。

パブリックElastic IPアドレスは実行中のEC2インスタンスにアタッチされている間は料金がかからないですが、インスタンスが停止している場合はコストがかかってきます。

サーバーのステータスを確認する

サーバーのステータスもAWSマネジメントコンソールから確認できます。 AWS CLIからサーバーの一覧を確認する場合は以下です。

$ aws ec2 describe-instances

--output table オプションなどを使用すると表で出力されるため、多少みやすいかもしれません。

サーバーを利用するときは起動しよう

デプロイした直後は自動的にサーバーは起動していますが、サーバー停止コマンドを実行した後に再度起動する場合は以下のコマンドで起動できます。

$ aws ec2 start-instances --instance-ids <EC2インスタンスID>

サーバーが必要なくなったら削除しよう

もうプレイしなくなった、サーバー自体が不要、破棄したいという場合、以下コマンドで環境を破棄できます。データごとなくなってしまいますので、セーブデータなどは事前に退避しておくことをおすすめします。

Amazon マシンイメージ (AMI)、もしくはEBSのスナップショットを取っておけばサーバーの設定ごとバックアップが取れるのでおすすめです。ただし、AMIの保存に使用するストレージには別途お金がかかってきます。

$ cdk destroy

ブートストラップ中に作成されたスタックを削除します。AWSマネジメントコンソールから、ブートストラップしたアカウント、リージョンを選択した上で、CloudFormation > スタック > CDKToolkit を削除します。

スタックを破棄するとき、リソースはその削除ポリシーに従って削除、保持、スナップショットされます。 デフォルトでは、ほとんどのリソースはスタック削除時に削除されますが、すべてのリソースがそうなるわけではなく、削除されずに保持されるリソースも存在します。

デフォルトで保持されるリソースに対しては、CDK のコードに RemovalPolicy を設定することで削除できますが、意図せず残ってしまって料金がかかるケースがありますので、意図せずリソースが残ってしまっていないか確認することをおすすめします。

S3、CloudWatchLogs、DynamoDB、EBSなどといった、ログやデータを保持するリソースが残ってしまいがちなので、重点的に確認しましょう。

PALWORLDに必要なサーバースペックについて

サーバー要件はPalworldの公式サイトに記載があります。

CPU4コア (推奨)
メモリ16GB
安定したサーバー稼働のためには 32GB 以上を推奨
8GBでも起動は可能ですがプレイを進めるほどメモリ不足でサーバーがクラッシュする可能性が高まります。
ネットワークUDP Port 8211 (デフォルト) をポート開放できること
引用元:Palworld 公式サイト(https://tech.palworldgame.com/dedicated-server-guide#linux

Amazon EC2 M7i インスタンスは、第 4 世代インテル Xeon スケーラブルプロセッサ搭載の m7i-flex.xlarge インスタンスを選択しました。ただメモリは16GBなので、より大人数でプレイしたい場合は32メモリを搭載した m7i-flex.2xlarge あたりが選択肢として挙がるかと思います。バーストインスタンスタイプはクレジットがなくなると動作が遅くなったりするので、今回利用は見送りました。

一般用と向けインスタンス

インスタンスサイズvCPUメモリ (GiB)インスタンスストレージ (GB)ネットワーク帯域幅 (Gbps)EBS 帯域幅 (Gbps)
m7i-flex.large28EBS のみ最大 12.5最大 10
m7i-flex.xlarge416EBS のみ最大 12.5最大 10
m7i-flex.2xlarge832EBS のみ最大 12.5最大 10

インスタンスタイプ
https://aws.amazon.com/jp/ec2/instance-types/

AWS か VPSか、料金を比較してみる

ずっと起動しておくならVPSのほうが安くすみます。使用していないPCなどがあればサーバーとして利用することで最も安く作ることができます。

身内だけでの利用などであればプレイしたいタイミングで起動/停止すればよく、ずっと起動している必要もないため、AWSで従量課金制のサーバーを使用したほうが安い場合があります。

【免責事項】記事に表示されている価格は2024/1/22時点のものです。料金の情報は古い場合があります。最新の料金はAWS公式サイト、Xサーバー公式サイトを参照ください。

なお、以下はオンデマンド(従量課金制)、東京リージョンでのの料金です。長期間利用する場合はリザーブドインスタンス、Savings Plansを使用すればもう少し安くなります。

引用元:https://aws.amazon.com/jp/ec2/pricing/on-demand/
2024/1/25 時点

インスタンスを1ヶ月ずっと起動しっぱなしだった場合の料金試算

前段で確認したインスタンスタイプ「m7i-flex.xlarge」の利用料金は 0.24738 [ドル/h] です。

1ヶ月30日として、24h/日起動したとします。合計で720時間稼働です。

料金は、720h * 0.24738 ドル/h = 約 178.1 ドル → 約 26,337.7 円 (147.87 円/ドル)

となります。ずっと起動しっぱなしだとやはり高いですね。

インスタンスを 仮に1日に8時間、週に2日(1ヶ月で8日)起動した場合の料金試算

8日 * 8h = 64h * 0.24738 ドル/h = 約15.8ドル → 約2,341.1円(147.87 円/ドル)

となります。この利用ケースだと、ずっと起動している場合に比べて格段に安くなります。

他にデータ転送料金がかかる点に注意

データ転送量にお金がかかる点にも要注意です。
上記で示した例はあくまでもさサーバーにかかる値段で、この他データ転送料金がかかります。

引用元:https://aws.amazon.com/jp/ec2/pricing/on-demand/

Xサーバーを契約する場合にかかる料金を確認してみる

Xサーバーではサーバーをレンタルする形になるので、サーバーを起動していようが、停止していようが料金がかかってきます。

プランは3つあり、スタンダード、プレミアム、ビジネスです。PALWORLDのサーバーが安定稼働するためにはメモリ容量16GBが推奨されているので、少なくともプレミアム以上のプランを選択したほうが良さそうです。

sv13001.xserver.jp 以降のサーバー

スタンダード…CPU 仮想6コア / メモリ 8GB

プレミアム…CPU 仮想8コア / メモリ 12GB

ビジネス…CPU 仮想10コア / メモリ 16GB

https://www.xserver.ne.jp/manual/man_server_spec.php
画像は2024/1/22時点のXサーバーの料金

Xサーバーの契約では少なくとも3ヶ月以上の契約が必要なので、初期費用は次のとおりです。

契約期間 [ 3ヶ月 ]  * 月額料金 [ 2,640円 ] で、7,920円

となります。

12ヶ月以上まとめて購入するとさらに安くなりますが、ゲームサーバーとしての一時利用であればいつまで利用するかわからないので購入は避けたいところです。割引は適用せずに確認します。

AWSを利用する場合、Xサーバーの月額料金である2,640円を超えるのはどのくらい利用した場合かを試算してみます。なお、計算を簡略化するため、データ転送料金は省いて計算しています。

Xサーバーの月額利用料金2640 円

m7i-flexインスタンスの時間あたりの利用料金:0.2474円/h

0.24738ドル/h = 0.2474円/h(147.87 円/ドル)(※1時間あたりのAWSサーバー利用料金)

2640 / 36.5801 [円/h] = 約 72.2 h

月間約72時間以下で利用する場合はXサーバーよりAWSのほうがお得になる計算です。

まとめ

この記事ではPalworld用のサーバーをAWS CDKを使用して構築してみました。AWS CDKを利用すると比較的簡単にサーバー、ネットワークなどのインフラを構築できます。

AWSは従量課金制なので、サーバーが必要がなくなったときの利用停止がVPSに比べて容易です。AWSの料金体系を理解して適切に運用すればVPSより安くなる場合もありますので、VPS契約の前に一度検討しておくことをおすすめします。

この機会にぜひPALWORLD専用サーバーを用意してみてはいかがでしょうか。

  • この記事を書いた人

ハリネズミくん

このサイトを運営しています。
普段はITエンジニアとして活動しています。
購入したもののレビューや、ゲーム、PCの設定や、筋トレ、その他生活改善情報などを発信していきます。
- 2021年8月ブログ開設 -

オススメの記事一覧

1

当サイトのコンテンツには、広告を記載している場合があります。<景品表示法に基づく記載> 友達とプレイする際、一緒にプレイ ...

2

当サイトのコンテンツには、広告を記載している場合があります。<景品表示法に基づく記載> タルコフ(Excape from ...

3

当サイトのコンテンツには、広告を記載している場合があります。<景品表示法に基づく記載> アイロンがけについて、このように ...

4

健康寿命を延ばしたい!と思ったことはありませんか?老いるということに関して、そういうものなんだ、自然の摂理なんだ、と諦め ...

5

当サイトのコンテンツには、広告を記載している場合があります。<景品表示法に基づく記載> 「睡眠の質」意識されていますか? ...

-AWS, IT, ゲーム, パルワールド
-, , , , , ,