【AWS】統合版・JAVA版クロスプレイ可能なMinecraftのHubサーバーを立てる方法【1.20.4】【Velocity, GeyserMC, Fabric】

## はじめに

![スクリーンショット 2024-04-04 18.09.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/76a72e43-d9ff-a052-9572-d5bd72abf09b.png)
先日ソリューションアーキテクト アソシエイト試験に合格しました。
取得してからだいぶ間が開いていてアレですが、せっかくなので習得した知識を使いつつサーバー構築をしてみようと思います。

:::note warn
今回構築するサービスは請求が発生します(約100円/日)。
サービスの削除し忘れにご注意ください。
:::

## 対象読者

- 友人間やサークル内で利用するゲームサーバーを立てたい人
- 数時間~数日程度の短い期間、お試し感覚でサーバーを立ててみたい人
- AWSに興味があるが、使ったことがない、使い方がイマイチわからない人
- コスパの良いサーバーの構築方法を知りたい人

## 取り扱う内容

- Amazon Lightsailの特徴・利用方法
- プロキシサーバーの構築方法
- プロキシに対応したMinecraftサーバーの構築方法
- 各種サービス(他社含む)との比較

なお、この記事はAWSアカウントを作成していることを前提にしています。
まだ作成していない場合は公式ドキュメント等を参考に作成してください。

https://aws.amazon.com/jp/register-flow/

## 構築するサービスの概略図

今回構築する予定のサービス図です。
個人・少人数(~10人程度)が利用する想定で、コストを最小限に抑えた構成になっています。
Amazon Lightsailを利用することで、同等スペックのEC2インスタンスを利用するよりも低価格で、かつ容易に構築・運用することができます。

![マイクラサーバー構想図-Lightsail (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/812aa51b-c874-1159-8739-eba0fc09b204.png)

## 利用するサービス・ソフトウェアについて

### バージョン

:::note
GeyserMCとFloodgateは古いビルドの入手が難しいので、最新版を使用してください。
依存関係にあるVelocityも最新版を使用するようにしてください。
:::

```
# OS
・Amazon Linux 2023: 2023.4.20240401.1
・JAVA: 17.0.10

# Minecraft
・Minecraft: 1.20.4

# MOD(必須)
・Fabric Loader: 0.15.9
・FabricProxy-Lite: 2.7.0

# サーバー軽量化MOD
・Lithium: 0.12.1
・Ferritecore: 6.0.3
・Memory Leak Fix: 1.1.5
・Krypton: 0.2.6
・ModernFix: 5.16.1

# Proxy
・Velocity: 3.3.0-SNAPSHOT Build #376
・GeyserMC: Build #490
・Floodgate: Build #96
```

### Amazon Lightsail

https://aws.amazon.com/jp/lightsail/features/

https://aws.amazon.com/jp/lightsail/pricing/

 > Amazon Lightsail は、数クリックでウェブアプリケーションやウェブサイトを立ち上げられる、使いやすいクラウドリソースを提供します。

 > Amazon Lightsail の使用には、予想可能な低価格の料金を支払うだけです。
 Lightsailは、メモリー、vCPU、ソリッドステートドライブ (SSD) ストレージなどのリソースを 1 つのプランにバンドルしているため、予算管理が簡単で単純です。

Amazon Lightsailは、Amazonが提供する仮想プライベートサーバー(VPS)の一種です。
サーバー運用に必要な機能をまとめており、ネットワークやクラウドの知識がなくても、安全に、簡単に、そして安価にサーバーを構築・運用することができます。

AWSに慣れていない初心者が、クラウドに触れる第一歩として最適なサービスとなっています。

### Fabric

Fabricとは、MinecraftのMODを機能させるために必要なツール群のことであり、いわゆる「前提MOD」と呼ばれるものの1つです。
詳しくは[Minecraft Japan Wiki](https://minecraftjapan.miraheze.org/wiki/MOD%E8%A7%A3%E8%AA%AC/Fabric)や[公式Wiki](https://fabricmc.net/wiki/ja:start)を確認してください。

今回のサービスでは以下の6つのMODを導入します。

#### [FabricProxy-Lite](https://modrinth.com/mod/fabricproxy-lite)

- ユーザーデータをVelocityに転送するためのMOD

#### [Lithium](https://modrinth.com/mod/lithium)

- サーバー軽量化のためのMOD
- Minecraftの様々な処理を最適化し、CPU利用率を軽減するMOD

#### [Ferritecore](https://modrinth.com/mod/ferrite-core)

- サーバー軽量化のためのMOD
- メモリ使用量の最適化を行うMOD

#### [Memory Leak Fix](https://modrinth.com/mod/memoryleakfix)

- サーバー軽量化のためのMOD
- メモリリークを修正するMOD

#### [Krypton](https://modrinth.com/mod/krypton)

- サーバー軽量化のためのMOD
- ネットワーク関連を最適化するMOD

#### [ModernFix](https://modrinth.com/mod/modernfix)

- サーバー軽量化のためのMOD
- Minecraftを重くしている多数のバグを修正して、メモリ使用量を削減するMOD

### Velocity

Velocityとは、他のサーバーとの通信を中継する、いわゆる「プロキシ」と呼ばれるものの1つです。
Minecraftのプロキシは他にもあり、BungeeCordやWaterfallなどが該当します。
Velocityはそれらと比較して、次のような特徴があります。

- 高速・軽量
- 開発スピード・バグ修正が速い
- MODに対してのサポートが充実している

https://docs.papermc.io/velocity/comparisons-to-other-proxies

### GeyserMC, Floodgate

GeyserMCは、統合版ユーザーをJAVA版ユーザーとして振る舞うように変換処理を行うツールです。
Floodgateは、統合版ユーザーがJAVA版のアカウントを作らずに認証を突破するためのツールです。
これら2つのツールを利用することで、統合版ユーザーがJAVA版のMinecraftで遊べるようになります。

今回のサービスでは、Velocityのプラグインとして組み込まれています。

## サーバーの構築

### 1. Lightsailのホーム画面を開く

まず、[AWSマネジメントコンソール](https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1)にアクセスします。
ログインすると次の画面が表示されます。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333132333737322f62396461373566302d373336322d386563662d326264322d6339396364623837333236362e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/b78191fe-e661-e0d7-12a4-4f551e705444.png)

検索欄に「Lightsail」と入力してください。
検索欄の一番上をクリックするとホーム画面へ遷移します。
![スクリーンショット_2024-04-12_13_57_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/48ef1c8b-ade6-b7fb-5007-21ec7fae6a3f.png)

次のような画面が表示されればOKです。
![スクリーンショット_2024-04-12_13_58_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/b9824df4-1b0b-bc7c-1f30-5c194307c072.png)

### 2. インスタンスの作成

Lightsailインスタンスの作成を行います。
中央の「Create instance」ボタンを押し、インスタンス作成画面に移動します。

このような画面になるはずです。
![スクリーンショット_2024-04-12_14_14_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/8e76527d-17c4-e2d1-971d-57e4486f7c78.png)

まず最初に、サーバーを置く地域を選択します。
「Instance location」が「Tokyo」になっていることを確認してください。
「Tokyo」になっていない場合、「Change AWS Region and Availability Zone」をクリックして変更してください。

:::note warn
遠くのリージョンに置くとラグや遅延が大きくなります。
:::
![スクリーンショット_2024-04-12_14_26_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/990d25da-4ffd-8ecc-54ea-90f5cf3c2122.png)

続いて、インスタンスのイメージ(≒OS)を選択します。
「platform」は「Linux/Unix」、「blueprint」は「Operating System(OS)only」にして、「Amazon Linux 2023」を選択してください。
![スクリーンショット_2024-04-12_14_43_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/0421ff9b-7fba-5934-f617-20111330811f.png)

次は、インスタンス作成時に実行するセットアップコマンドを記述します。
「Optional」の「Add launch script」をクリックすると入力欄が現れます。
入力欄にセットアップコマンドをコピーしてください。
![スクリーンショット_2024-04-18_12_52_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/7907b5c7-e579-42c9-fb5a-96ef6c9dabc6.png)

<details><summary>セットアップコマンド</summary>

```bash
#!/bin/bash

# JAVAのインストール
sudo dnf install -y java-17-amazon-corretto-headless


# 以下、Velocityの設定
# Velocityのインストール用のURLをコピペする(=の間にスペースは入れないこと)
# 例：VELOCITYURL=https://api.papermc.io/v2/projects/velocity/versions/3.3.0-SNAPSHOT/builds/376/downloads/velocity-3.3.0-SNAPSHOT-376.jar
VELOCITYURL=

# Velocity用のユーザーとディレクトリを作成
adduser velocity
mkdir /opt/velocity/
mkdir /opt/velocity/server/
cd /opt/velocity/server

# VelocityとGeyserMC(とFloodGate)をダウンロード
wget -O velocity.jar $VELOCITYURL
wget -O geyser-velocity.jar https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/velocity
wget -O floodgate-velocity.jar https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/velocity

# サーバーファイルの生成
java -Xmx1G -Xms1G -jar velocity.jar nogui &
sleep 20
sudo pkill java

# プラグインの導入
mv geyser-velocity.jar plugins/
mv floodgate-velocity.jar plugins/
java -Xms1G -Xmx1G -jar velocity.jar nogui &
sleep 40
sudo pkill java

# 設定ファイルの編集
sed -i 's/player-info-forwarding-mode = "NONE"/player-info-forwarding-mode = "modern"/' velocity.toml
sed -i 's/lobby = "127.0.0.1:30066"/lobby = "127.0.0.1:25565"/' velocity.toml
sed -i 's/auth-type: online/auth-type: floodgate/' plugins/Geyser-Velocity/config.yml

# プロキシ通信用の秘密鍵の取得
SECRET=$(<forwarding.secret)

# 所有権の設定
chown -R velocity:velocity /opt/velocity/

# 起動スクリプトの作成
touch start
printf '#!/bin/bash\njava -Xms1G -Xmx1G -jar velocity.jar nogui\n' >> start
chmod +x start
sleep 1
# Velocityここまで


# 以下、Minecraftサーバーの設定
# Minecraftサーバー用のユーザーとディレクトリを作成
adduser minecraft
mkdir /opt/minecraft/
mkdir /opt/minecraft/server/
cd /opt/minecraft/server

# FabricとMODをダウンロード
curl -OJ https://meta.fabricmc.net/v2/versions/loader/1.20.4/0.15.9/1.0.0/server/jar
wget https://cdn.modrinth.com/data/8dI2tmqs/versions/Mxw3Cbsk/FabricProxy-Lite-2.7.0.jar
wget https://cdn.modrinth.com/data/gvQqBUqZ/versions/nMhjKWVE/lithium-fabric-mc1.20.4-0.12.1.jar
wget https://cdn.modrinth.com/data/uXXizFIs/versions/pguEMpy9/ferritecore-6.0.3-fabric.jar
wget https://cdn.modrinth.com/data/NRjRiSSD/versions/5xvCCRjJ/memoryleakfix-fabric-1.17%2B-1.1.5.jar
wget https://cdn.modrinth.com/data/fQEb0iXm/versions/bRcuOnao/krypton-0.2.6.jar
wget https://cdn.modrinth.com/data/nmDcB62a/versions/EL78UqrQ/modernfix-fabric-5.16.1%2Bmc1.20.4.jar


# サーバーファイルの生成・編集
java -Xms2G -Xmx2G -jar fabric-server-mc.1.20.4-loader.0.15.9-launcher.1.0.0.jar nogui
sleep 60
sed -i 's/false/true/' eula.txt
sed -i 's/online-mode=true/online-mode=false/' server.properties
sed -i 's/server-ip=/server-ip=127.0.0.1/' server.properties

# MODの導入
mv FabricProxy-Lite-2.7.0.jar mods/
mv lithium-fabric-mc1.20.4-0.12.1.jar mods/
mv ferritecore-6.0.3-fabric.jar mods/
mv memoryleakfix-fabric-1.17+-1.1.5.jar /mods
mv krypton-0.2.6.jar /mods
mv modernfix-fabric-5.16.1+mc1.20.4.jar /mods
java -Xms2G -Xmx2G -jar fabric-server-mc.1.20.4-loader.0.15.9-launcher.1.0.0.jar --nogui &
sleep 120
sudo pkill -9 java

# プロキシ通信用の秘密鍵を入力
sed -i "s/secret = \"\"/secret = \"$SECRET\"/" config/FabricProxy-Lite.toml

# 所有権の設定
chown -R minecraft:minecraft /opt/minecraft/

# 起動スクリプトの作成
touch start
printf '#!/bin/bash\nscreen -S minecraft -Dm java -Xms2G -Xmx2G -jar fabric-server-mc.1.20.4-loader.0.15.9-launcher.1.0.0.jar nogui\n' >> start
chmod +x start
sleep 1

# 停止スクリプトの作成
touch stop
printf '#!/bin/bash\nscreen -S minecraft -X stuff "save-all\\015"\nscreen -S minecraft -X stuff "stop\\015"\n' >> stop
chmod +x stop
sleep 1
# Minecraftサーバーここまで


# systemDスクリプトの作成
cd /etc/systemd/system/
touch velocity.service
touch minecraft.service
printf '[Unit]\nDescription=Velocity Server on start up\nWants=network-online.target\n[Service]\nUser=velocity\nWorkingDirectory=/opt/velocity/server\nExecStart=/opt/velocity/server/start\nStandardInput=null\nRestart=always\n[Install]\nWantedBy=multi-user.target' >> velocity.service
printf '[Unit]\nDescription=Minecraft Server on start up\nWants=network-online.target\n[Service]\nUser=minecraft\nWorkingDirectory=/opt/minecraft/server\nExecStart=/opt/minecraft/server/start\nExecStop=/opt/minecraft/server/stop\nRestart=always\n[Install]\nWantedBy=multi-user.target' >> minecraft.service
sudo systemctl daemon-reload
sudo systemctl enable velocity.service
sudo systemctl enable minecraft.service
sudo systemctl start velocity.service
sudo systemctl start minecraft.service
```

</details>

`VELOCITYURL`には[このページ](https://papermc.io/downloads/velocity)からコピーしてきたアドレスを入力してください。
![スクリーンショット_2024-04-13_0_17_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/e66dad8a-8256-cd80-8612-f0309730926c.png)

コマンドをコピーしたらインスタンスのスペックを決定します。
今回は「Networking type」を「Dual stack」にして、$20のプランを選択してください。

:::note warn
2024年5月1日以降はIPv4を含むサービスの価格が改定されます。
詳しくは[こちら](https://aws.amazon.com/jp/blogs/compute/announcing-ipv6-instance-bundles-and-pricing-update-on-amazon-lightsail/)。
:::

![スクリーンショット_2024-04-13_11_25_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/62815e85-3f49-6e5f-ac4a-9ef225a5dbb9.png)

最後に適当なインスタンス名を付けて「Create instance」ボタンを押します。
![スクリーンショット_2024-04-13_11_26_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/2ec8239d-07ef-5ce1-2c11-0eabb1276927.png)

この画面が表示されれていれば成功です。
セットアップコマンドの実行に時間がかかるため、10~15分ほど待ちます。
![スクリーンショット 2024-04-13 11.27.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/0d74bb75-fda7-d08d-0a64-c132b48bb7fe.png)

### 3. サーバーに接続する

インスタンスの起動に成功したら、サーバーへの接続テストを行います。
接続には、管理画面からポート開放の設定をする必要があります。

「⋮」ボタンを押して、「Manage」を選択することで管理画面を開くことができます。
![スクリーンショット_2024-04-13_11_54_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/e4ba35a7-8a30-b522-cbf5-55923a263d4f.png)

「Networking」タブを選択します。
![スクリーンショット_2024-04-18_12_12_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/d33c5186-589e-5a18-9638-1e4069b43c92.png)

下にスクロールして、「IPv4 Firewall」の項目を探します。
「Add rule」ボタンを押し、「Port or range」の入力欄に「25577」と入力します。
最後に「Create」ボタンを押すことでポート開放を行えます。
![スクリーンショット_2024-04-18_12_56_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/27b7c10a-72d0-d6c9-5d0a-af3326e44bfb.png)

同様に、統合版ユーザーに向けた設定も行います。
「Add rule」ボタンを押し、「Protocol」を「UDP」、「Port or range」の入力欄に「19132」と入力して、「Create」ボタンを押します。

最終的に次の画像のようになれば設定完了です。
画像の赤枠で囲んだ「Public Ipv4アドレス」は接続確認で使うのでメモしておきます。
![スクリーンショット_2024-04-18_13_16_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/336fa7ae-1ad9-e48c-905d-c87962e4f497.png)

最後に、自分のPCからMinecraftを開いて接続確認を行います。

<details><summary>Java版</summary>

Minecraftを開いたら「マルチプレイ」を選択します。
![2024-04-18_15_09_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/a6f876a7-6d0c-790f-621b-01e40990d797.png)

サーバー一覧画面が開かれるので「サーバーの追加」から情報を追加します。
![2024-04-18_14_55_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/2bcff3db-c4a8-b500-bf31-67de96f4ae07.png)

画像のように「サーバーアドレス」の欄に、「メモしたIPアドレス:ポート番号」の形式で入力してください。
![2024-04-18_13_29_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/c6489f69-1c74-d35b-3dbf-2d202888b926.png)

「完了」ボタンを押すとサーバー一覧画面に戻ります。
先ほど追加したサーバーをダブルクリックして接続します。
![2024-04-18_14_55_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/e22c353e-db85-8041-0a3c-5c10cd639592.png)

接続に成功するとワールドに入ることができます。
![2024-04-18_13.29.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/af69a6c3-90f4-e56b-5f50-23a8e0393174.png)

</details>

<details><summary>統合版</summary>

Minecraftを開いたら「プレイ」を押します。
![スクリーンショット__274_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/29d48ff3-4fc3-1861-4756-b0e88403c2f8.png)

「サーバー」タブを開きます。
1番下までスクロールすると「サーバーを追加」ボタンがあるのでそれをクリックします。
![スクリーンショット__269_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/d99a5f18-e0cb-8760-38a5-524b770bfa34.png)

サーバー情報を入力します。
画像のように「サーバーアドレス」の欄に、メモしたIPアドレスを入力してください。
![スクリーンショット__271_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/260a414b-be3a-c43a-f541-922fc5cf57c2.png)

「プレイ」を押すとサーバーに接続します。
接続に成功するとワールドに入ることができます。
![スクリーンショット (270).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/56b245f4-48a5-c20f-b6e5-376f349ca7dc.png)

</details>

### 4. バックアップの設定

:::note
ここから先は必須事項ではありません。
面倒な場合は飛ばしてもOKですが、実施することをお勧めします。
:::

#### 4-1. cronのインストール

万が一に備えて、Minecraftのバックアップ作成を行います。
まずは、Lightsailのコマンドライン環境に入ります。
「Connect」タブを開いて、「Connect using SSH」をクリックします。
![スクリーンショット_2024-04-19_14_50_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/fdb99e7a-994e-0801-bdef-9aa2ea348584.png)

写真のように文字が表示されれば接続成功です。
![スクリーンショット_2024-04-19_14_59_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/72343e9a-56f5-dc15-41e6-516ca1c89085.png)

コマンドをスケジュール実行できるcronを使って、自動でバックアップを作成できるようにします。
cronジョブを管理するためのツール、cronieをインストールします。

```bash
sudo dnf install -y cronie
```

インストールが完了したら、crontabを使ってcronジョブを作成します。

```bash
sudo crontab -e
```

crontabによってエディタ(vi)が開かれます。
`i`を入力しINSERTモードにして、次のコードをコピーしてください。

```cron:sudo crontab -e
10 9 * * * bash /root/backup.sh  >> /var/log/backup_log.txt 2>&1
```

コピーできたらescキーを押してコマンドモードに移行し、`:wq`と入力すると保存できます。
viの詳しい使い方は次の記事を参考にしてください。

https://docs.oracle.com/cd/E19253-01/816-3946/6ma6m5bnf/index.html

上のコードは、「毎日9時10分(UTC)に、`bash /root/backup.sh  >> /var/log/cron_log.txt 2>&1`を実施する」ということを表しています。
次の記事にわかりやすい説明があるのでカスタマイズの参考にしてください。
なお、時刻は協定世界時`(日本時間-9時間)`で入力するようにしてください。

https://www.server-memo.net/tips/crontab.html#toc11

コードをコピーしたら、バックアップの保存先の準備を行います。
今回の記事ではS3を利用しますが、他のストレージサービスを利用しても問題ありません。

#### 4-2. S3バケットの作成

https://aws.amazon.com/jp/s3/
>Amazon Simple Storage Service (Amazon S3) は、業界随一のスケーラビリティ、データ可用性、セキュリティ、パフォーマンスを提供するオブジェクトストレージサービスです。

まず、バックアップデータの保存先となる、「S3バケット」を作成します。
[AWSマネジメントコンソール](https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1)に戻り、検索欄に「S3」と入力してください。
一番上の「S3」をクリックすると、S3のコンソール画面に移動します。
![スクリーンショット_2024-04-18_20_27_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/50d2de8b-5158-8797-1350-1b2c2aae0c82.png)

「バケットを作成」ボタンをクリックしてバケット作成画面に移動します。
![スクリーンショット_2024-04-18_20_28_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/547e8fbe-6e29-e4e3-d9d7-1e1806ce80a2.png)

画像のようにバケット名を入力してください。
バケット名は世界で1つだけの名前になるように設定してください。
なお、このバケット名は後で使うのでメモしておいてください。
![スクリーンショット_2024-04-18_20_46_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/39acb1de-bbe0-8fde-ef00-262b63feab25.png)

下にスクロールして「バケットのバージョニング」の項目に移動してください。
バージョニングを有効にすると、同一のファイル名で複数のバックアップを取ることができます。
有効にしておくと、間違えて壊れたバックアップファイルをアップロードしてしまった時に、復旧しやすくなります。

::: note warn
バージョニングを有効にする場合は、後述のライフサイクルルールも設定してください。未設定の場合、バージョン数に上限がないため、コストが膨大になる可能性があります。
:::

![スクリーンショット_2024-04-18_20_49_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/43cf08bb-fc6e-80eb-9870-d5e1d1e6f605.png)

他の設定項目については特に変更する必要はないので、一番下までスクロールして「バケットの作成」を行なってください。
作成できない場合は、すでに使われている名前や、命名規則違反の名前を設定している可能性があるので、名前をつけ直してください。
![スクリーンショット_2024-04-18_21_35_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/ccd7c627-f4d3-d1e5-b6e8-e90a23cc1505.png)

バケットが作成されると、最初の一覧画面に戻ります。
![スクリーンショット_2024-04-18_21_40_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/3cc83b00-1cf7-2a01-5b53-adcccd8724ff.png)

バージョニングを有効化した場合は、ライフサイクルルールの設定も推奨します。

<details><summary>ライフサイクルルールの設定方法</summary>

バケット名をクリックして、詳細画面を表示します。
![スクリーンショット_2024-04-18_22_45_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/cd2cff66-1a9e-ad48-86c3-5ffdf6d58518.png)

「管理」タブを開き、「ライフサイクルルールの作成」ボタンを押すと、ルール作成画面に移動します。
![スクリーンショット_2024-04-18_23_15_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/e0f764ff-fe1d-9666-e44f-6a3e18e8f194.png)

「ライフサイクルルール名」を入力し、各種設定を画像のように行なってください。
![スクリーンショット_2024-04-18_23_21_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/a9c3bda0-d505-6bf6-6a0e-a0fd44028f24.png)

下にスクロールして、削除までの日数と保持するバージョン数を入力してください。
日数やバージョン数についてはお好みの数を入力してください。
![スクリーンショット_2024-04-18_23_21_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/bdf142de-9a0e-8fa3-81ad-435a3e5e31ce.png)

作成完了すると一覧画面に移動します。
![スクリーンショット_2024-04-18_23_41_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/ebd480c7-d736-08d6-bf96-13b1845cb51b.png)

</details>

#### 4-3. IAMの設定

次は、LightsailからS3に通信するための認証情報を設定します。
上の検索欄から「IAM」と検索して、一番上の項目をクリックし、IAMダッシュボードを開きます。
![スクリーンショット_2024-04-19_9_06_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/1f22411d-9181-9286-4732-aef9efac296b.png)

「ユーザー」をクリックして、IAMユーザーの一覧画面を開きます。
![スクリーンショット_2024-04-19_9_07_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/9690d720-024f-7a31-373b-170c27aebf77.png)

「ユーザーの作成」をクリックします。
![スクリーンショット_2024-04-19_9_18_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/b1a955f8-49cd-11bc-ffc2-60448073752a.png)

「ユーザー名」を入力して次に進みます。
![スクリーンショット_2024-04-19_9_18_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/fd74bdaa-535e-5ce3-80e5-a940e0ff9f8a.png)

許可の設定を行います。
「ポリシーを直接アタッチする」を選択し、「ポリシーの作成」をクリックしてください。
クリックすると別タブに移動し、カスタムポリシーの作成画面に移ります。
![スクリーンショット_2024-04-19_9_19_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/0c75cd7a-927b-f654-c6fb-59fadb52d5eb.png)

「サービスを選択」を押し、S3を選択してください。
![スクリーンショット_2024-04-19_9_19_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/f15e035a-1a25-5a68-581a-d8cd63446179.png)

次はアクションの追加を行います。
検索欄に「getobject」と入力して、「GetObject」アクションを追加してください。
同様にして「PutObject」も追加してください。
追加できたら、リソースの項目を「特定」と選択し、「ARNを追加」をクリックしてください。
![スクリーンショット_2024-04-19_10_43_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/a60b8670-a590-25c7-e335-9bf11ba90819.png)

ここでは、どのバケット・オブジェクトに対してアクションを許可するかを設定します。
「Resource bucket name」に先ほどメモしたS3バケット名を入力し、「任意のobject name」を選択します。
許可設定が完了したら「ARNを追加」ボタンを押し、設定を確定させます。
![スクリーンショット_2024-04-19_9_23_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/e23cc397-3d75-d036-7d7e-84b78fd82bd8.png)

「次へ」を押し、確認画面に移動します。
設定項目に問題がなければ、ポリシー名を入力して、「ポリシーの作成」ボタンをクリックします。
![スクリーンショット_2024-04-19_10_24_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/a17e695a-af20-fe2e-8e0a-e1a2b368fc21.png)

ポリシーが作成完了したら、前のタブに戻り、IAMユーザーの作成を行います。
「絞り込みタイプ」を「カスタマー管理」に変更します。
先ほど作ったポリシーが表示されるはずなので、チェックを入れます。
表示されない場合は、リロードボタンを押すと表示されるようになります。
チェックを入れたら「次へ」ボタンを押します。
![スクリーンショット_2024-04-19_10_25_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/3e320bbc-6465-4845-a432-07591cc44161.png)

設定項目に間違いがなければ、「ユーザーの作成」をクリックします。
![スクリーンショット_2024-04-19_10_25_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/2114f331-7045-c98d-518f-98d2e677fb16.png)

続いて、認証情報をLightsailで使うために、アクセスキーを作成します。
![スクリーンショット_2024-04-19_10_25_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/546f82b3-2e59-4ef7-37bf-a7acca114422.png)

最初にアクセスキーの利用目的を選択します。
「コマンドラインインターフェイス」を選択し、下のチェックボックスにチェックを入れ、次に進みます。
![スクリーンショット_2024-04-19_10_25_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/4bfde09e-0a45-1c4d-6edb-5fb6e2da6724.png)

アクセスキーに名前をつけて「アクセスキーを作成」ボタンを押します。
![スクリーンショット_2024-04-19_10_26_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/7ab5a493-3bdc-e55e-a796-3a7f49dab372.png)

作成が完了したら、「アクセスキー」「シークレットアクセスキー」をメモしてください。

:::note alert
アクセスキーの情報は厳重に保管し、他の人に**絶対に教えないでください**。
不正にサービス利用される恐れがあります。
:::

::: note warn
アクセスキーの情報を、忘れた・紛失した・メモし損ねた場合は、新しく作り直してください。
その際、前のアクセスキーは削除してください。
:::

![スクリーンショット_2024-04-19_10_26_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/7e131a12-e221-19d4-fe51-8e43bce9e5a6.png)

#### 4-4. バックアップスクリプトの作成

アクセスキーを取得したらLightsailのコマンドライン環境に戻ります。
awsコマンドを使って、Lightsailに認証情報を登録します。
わかりやすいように「s3」というプロファイル名をつけて登録します。

```bash
sudo aws configure --profile s3
```

画像のように、各項目次のように入力してください。

- AWS Access Key ID: メモしたアクセスキー
- Secret Access Key: メモしたシークレットアクセスキー
- Default region name: ap-north-east-1
- Default output format: 入力しない

![スクリーンショット_2024-04-19_15_51_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/71486ec4-79b8-7857-e64a-2f43af5fe613.png)

登録できたら、バックアップ用のスクリプトを作成します。
次のコマンドを入力して、ファイルの作成を行います。

```bash
sudo vi /root/backup.sh
```

エディタが開いたら`i`を入力しINSERTモードにして、次のコードをコピーしてください。
コピーできたらescキーを押した後、`:wq`と入力すると保存できます。
`S3_BUCKET`にはメモしたバケット名をコピーしてください。

```bash:/root/backup.sh
#!/bin/bash
start_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "-----------$start_time Backup start.----------"

# cronにパスを通す
PATH=$PATH:/usr/bin/aws
AWS_SHELL_PATH=/usr/bin/aws

# 先ほどメモしたバケット名をコピーする
S3_BUCKET=

# サーバーを停止
systemctl stop minecraft.service
sleep 60

# ワールドデータを圧縮してから転送し、最後に削除する
cd /opt/minecraft/server
tar -zcf world.tar.gz world/
$AWS_SHELL_PATH s3 cp world.tar.gz "s3://$S3_BUCKET" --profile s3
rm -rf world.tar.gz

# サーバーを起動
systemctl start minecraft.service

end_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "-----------$end_time Backup ended.----------"

```

保存できたら、このコマンドが正しく動作するか確認します。
次のコマンドを入力し、テスト実行します。

```bash
sudo bash /root/backup.sh
```

実行してから2~3分程度経ったら、S3バケットに移動して保存されているか確認します。
画像のようにファイルがアップロードされていれば成功です。
![スクリーンショット_2024-04-19_16_40_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123772/f6c63b8a-42e0-b558-1163-263e8940b015.png)

お疲れ様でした。

## サーバーコマンド集

### Velocity

```bash
# プロキシサーバーの起動
sudo systemctl start velocity.service

# プロキシサーバーの停止
sudo systemctl stop velocity.service

# プロキシサーバーの再起動
sudo systemctl restart velocity.service

# ログ確認
journalctl -u velocity.service

# ログ確認(新しい順から表示)
journalctl -ru velocity.service
```

### Minecraft

```bash
# Minecraftサーバーの起動
sudo systemctl start minecraft.service

# Minecraftサーバーの停止
sudo systemctl stop minecraft.service

# Minecraftサーバーの再起動
sudo systemctl restart minecraft.service

# バックアップの作成
sudo bash /root/backup.sh

# Minecraftのサーバーコンソールに入る(出る時は「ctrl + a」を同時押しした後、「d」を入力)
sudo -u minecraft screen -r minecraft

# MODの導入(導入後Minecraftサーバーを再起動すること)
cd /opt/minecraft/server/mods
sudo -u minecraft wget MODのダウンロードURL

# Minecraftのログ確認
cat /opt/minecraft/server/logs/latest.log

# バックアップの実行ログ確認
cat /var/log/backup_log.txt
```

## 各種サービスの比較・検討

:::note warn
下記の価格・為替レートは記事執筆時点(2024年4月19日)のものです。
現時点での価格とは異なる可能性があるため注意してください。
:::

Lightsail, EC2, 主要なVPSサービス数社を比較してきます。
AWS Well-Architected Framework[^1]に則って、どのサービスを利用するのが最適かを考えていきます。
この記事では趣味レベルの運用を想定しているので、お財布へのやさしさ、つまり「コスト最適化」の柱を最重要検討項目とします。
また、サーバー構築・運用に慣れていない人向けに、サーバー構築の容易さも検討項目に加えます。

[^1]: AWS Well-Architected Frameworkとは、優れたサービスを構築するためのノウハウ集である。6つの柱(「運用上の優秀性」「セキュリティ」「信頼性」「パフォーマンス効率」「コスト最適化」「持続可能性」)をベースとして、どのようにサービスを構築していくべきかが記述されている。

### コスト

各サービスCPU2~4コア、メモリ4GBでなるべく性能を揃えて比較しています。
EC2については、最もコストパフォーマンスに優れたt4gインスタンスで計算します。
料金の欄には、支払い金額の最小単位を記載しています。

|サービス名|CPUコア数|メモリ|ストレージ|料金|月額換算[^2]|支払い方法|
|---|---|---|---|---|---|---|
| Lightsail | 2 |4GB| 80GB<br> SSD | 4.32円/時 | 3089円<br>($20) | 後払い |
| EC2 | 2 |4GB| 30GB <br> SSD[^3] | 0.11円/分 | 4872円<br>($31.54)| 後払い |
| [XServer](https://game.xserver.ne.jp/) | 4 | 4GB | 100GB <br> SSD | 2200円/月 | 2200円 | 前払い|
| [ConoHa](https://www.conoha.jp/game/)<br>(時間課金) | 4 | 4GB | 100GB<br> SSD | 7.3円/時 | 3969円[^4] | 後払い |
| [ConoHa](https://www.conoha.jp/game/)<br>(1ヶ月プラン) | 4 | 4GB | 100GB<br> SSD | 2189円/月 | 2189円 | 前払い |
| [さくらのVPS](https://vps.sakura.ad.jp/)<br>(東京) | 4 | 4GB | 200GB<br> SSD | 3960円/月 | 3960円 | 前払い |

[^2]: 1ヶ月 = 30日とし、24時間起動し続けた場合の金額。
[^3]: 任意の容量を指定可能。1アカウント内の合計が30GBになるまで無料で利用可能。[詳細](https://aws.amazon.com/jp/ebs/pricing/)
[^4]: ConoHaでは月の最大料金が定められている。

月額換算で見ると、ConoHa(1ヶ月プラン)が最も良いように見えます。
ただ、利用料金を全額前払いする必要があるので、1ヶ月間きっかり使用しないと無駄になってしまいます。
利用期間が決まっていない場合は、LightsailやEC2、ConoHa(時間課金プラン)など、利用した分だけ支払う、オンデマンド形式のサービスを利用すると無駄を少なくできます。

逆に利用期間が明確に決まっていて、1ヶ月を超える場合には、他社VPSを利用する方がコストを抑えらえる場合が多いです。
ただし、長期間運用する場合は、障害の少なさ(=信頼性)やサポート体制の厚さなども重視すべきで、一概に安ければ良い、とは言えない点に注意が必要です。
<details><summary>長期利用時の月額比較</summary>

|サービス名|1ヶ月|3ヶ月|6ヶ月|12ヶ月|24ヶ月|36ヶ月|
|---|---|---|---|---|---|---|
| Lightsail | 3089円<br>($20) | 3089円 | 3089円 | 3089円 | 3089円 | 3089円 |
| EC2インスタンス| 4872円<br>($31.54) | 4872円 | 4872円 | 3579円[^5]<br>($23.17) | 3579円[^5]<br>($23.17) | 2510円[^5]<br>($16.25) |
| [XServer](https://game.xserver.ne.jp/) | 2200円 | 2200円 | 2200円 | 1800円[^6] | 1750円[^6] | 1700円[^6] |
| [ConoHa](https://www.conoha.jp/game/) | 2189円 | 1736円 | 1418円 | 985円 | 958円 | 846円 |
| [さくらのVPS](https://vps.sakura.ad.jp/)<br>(東京) | 3960円 | 3960円 | 3960円 | 3630円 | 3630円 | 3630円 |

</details>

[^5]: コンバーティブルリザーブドインスタンスで全額前払いした場合の金額。[詳細](https://aws.amazon.com/jp/ec2/pricing/reserved-instances/pricing/)
[^6]: キャッシュバックキャンペーン時はさらに割引される。

### サーバー構築・運用の容易さ

　EC2インスタンスは、サブネットやルーティングテーブルなど、ネットワークの構築からする必要があり、知識がないとなかなか手を出しづらいです。その分カスタマイズ性は高く、負荷に応じてサーバーの性能を上げ下げしたり、人がいない時間帯は停止してコストを抑えたりなど、柔軟な運用が可能です。
　一方、Lightsailや各社VPSは、ネットワークに関する知識がなくとも、ワンクリックで簡単に構築を行える点が強みです。設定できる項目に制限はあるものの、必要最低限揃っており特段困ることはない印象です。

### まとめ

以上より、ケース別に次のように使い分けるのが最適だと考えます。

- サーバー構築に自信がない、何も考えず運用したい
  - 運用期間が1ヶ月未満：Amazon Lightsail
  - 運用期間が1ヶ月以上：他社VPS
- 柔軟な運用をしたい：EC2
- とにかくコストを抑えたい：他社VPS

## 参考

https://docs.papermc.io/velocity/

https://wiki.geysermc.org/geyser/setup/

https://aws.amazon.com/jp/blogs/news/setting-up-a-minecraft-java-server-on-amazon-ec2/

https://calculator.aws/

https://aws.amazon.com/jp/architecture/well-architected/