Minecraft Server(統合版)をAWS上で安価に立てる

ゲーム

概要

  • Bedrock版をAWS EC2上に構築
  • EC2 インスタンスは定期的に停止/起動する
    • 使用しない時間帯は停止し、料金を抑える
    • Elastic IP 必須

サーバ構築

EC2構築

参考1: https://qiita.com/Hebbi554689332/items/c9718a414c732a0d66f1
参考2: https://dev.classmethod.jp/articles/new-minecraft-for-aws_ec2-instance/ (java版)

基本は参考2をベースに構築
変更したところは以下

  • OSイメージ: Ubuntu
  • インスタンスタイプ: t3a.small
  • セキュリティグループ: カスタムUDP, ポート: 19132

Elastic IP取得

EC2 は再起動すると PublicIPが変わるため、固定IPを取得、紐付ける

EC2 > ネットワーク&セキュリティ > Elastic IP > ElasticIP アドレスを割り当てる

作成完了したら
アクション > Elastic IP アドレスの関連付け
インスタンスに作成したインスタンスのインスタンスIDを入力 > 関連付ける

インスタンスログイン

Windows からログインするが、TeratermからSSHログインできなかったので、WSLを使用

powershell から下記を入力し、WSLインストール

wsl --install -d Ubuntu

wsl を起動後、下記コマンドを実行していく

# ホームディレクトリ移動
cd
# .ssh フォルダ作成
mkdir .ssh
# 秘密鍵ファイルコピー
 mv /mnt/c/Users/[鍵ファイルのパス]/minecraft.pem ./.ssh
# 権限確認
ls -al .ssh
-rwxrwxrwx 1 xxx xxx 1674 Jul  9 17:48 minecraft.pem

# 権限修正
chmod 600 .ssh/minecraft.pem

# 権限確認 (-rw-------)となっていればOK
ls -al .ssh
-rw------- 1 xxx xxx 1674 Jul  9 17:48 minecraft.pem

# ssh ログイン
ssh ubuntu@[Elastic IPで取得した固定IP] -i .ssh/minecraft.pem

事前準備

sudo apt -y update
sudo apt install -y unzip
sudo apt install -y screen

minecraft インストール

参考1をベースに

mkdir minecraft
cd minecraft
# リンクは最新版を(https://www.minecraft.net/ja-jp/download/server/bedrock(ubuntu用))から取得すること
wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.20.1.02.zip
unzip bedrock-server-1.20.1.02.zip

# サーバー起動
LD_LIBRARY_PATH=. ./bedrock_server

ログインできることを確認

権限設定

参考: https://matsu.teraren.com/blog/2023/02/06/post-14986/

vi ~/minecraft/server.properties

# デフォルトの権限をvisitor に変更
default-player-permission-level=visitor

vi permissions.json
特定の xuid を operator にする(xuid はサーバログから参照)

[
        {
                "permission": "operator",
                "xuid": "[xuid]"
        }
]

起動スクリプト作成

vi start_server.sh

#!/bin/bash
cd /home/ubuntu/minecraft && LD_LIBRARY_PATH=/home/ubuntu/minecraft /home/ubuntu/minecraft/bedrock_server | tee  /home/ubuntu/minecraft/applogs/minecraft_server_$(date +%Y%m%d_%H%M%S).log

サービス作成

sudo vi /etc/systemd/system/minecraft.service

[Unit]
Description=Minecraft Bedrock Server

[Service]
Type=forking
User=ubuntu
KillMode=none
Restart=on-failure
ExecStart=/usr/bin/screen -dmS minecraft /bin/bash -c "/home/ubuntu/minecraft/start_server.sh"
ExecStop=/usr/bin/screen -S minecraft -X stuff '^Ustop\r'

[Install]
WantedBy=multi-user.target
# minecraft サービス起動
sudo systemctl start minecraft.service

# 起動していることを確認
sudo systemctl status minecraft.service

● minecraft.service - Minecraft Bedrock Server
     Loaded: loaded (/etc/systemd/system/minecraft.service; disabled; vendor preset: enabled)
     Active: active (running) since Sun 2023-07-09 10:47:59 UTC; 5s ago

# screen 確認
screen -ls
There are screens on:
        1704.minecraft  (07/09/23 10:47:58)     (Detached)
# サービス有効化
sudo systemctl enable --now minecraft.service

EC2定期起動/停止

節約の為、使用していない時間帯はEC2停止、使用しそうな時間帯にEC2起動する

使用サービス

  • Lambda
  • Amazon EventBridge
  • IAM

Lambda

lambda > 関数の作成

関数名: start_minecraft_server
ランタイム: Python

import boto3

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name='ap-northeast-1') 
    ec2.stop_instances(InstanceIds=['(インスタンスID)']) 

関数名: stop_minecraft_server
ランタイム: Python

import boto3

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name='ap-northeast-1') 
    ec2.stop_instances(InstanceIds=['(インスタンスID)']) 

IAM Policy の作成

作成した lambda にはEC2を開始/停止する権限が無いため、権限を付与する

IAM > ポリシー > ポリシーを作成

JSON タブを開く > 下記を入力 (アカウントIDはAWSコンソール右上からコピーできる)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:ap-northeast-1:[アカウントID]:instance/[インスタンスIDを]"
        }
    ]
}

ポリシー名を入力 > ポリシーの作成
ポリシー名: access_minecraft_server_policy とか

Policy の紐づけ

lambda 作成時に Role が作成されているので、その Role に Policy を紐付ける
lambda に紐付けられたロールは、下記から参照可能
lambda > 設定 > アクセス権限 > ロール名

許可 > 許可を追加 > ポリシーをアタッチ > 作成したポリシーをチェック > 許可を追加

Lambda テスト

lambda > テスト > イベント名に適当な値を入力 > テスト

開始/停止が成功すればOK

Amazon EventBridge

Amazon EventBridge > スケジュール > スケジュールを作成
スケジュール名: start_minecraft_server_01, start_minecraft_server_02
頻度: 定期的なスケジュール
月~金: 18:00 開始
土, 日: 10:00 開始
フレックスタイムウィンドウ: オフ

AWS Lambda invoke > Lambda 関数を選択 > 次へ > デフォルトで次へ > スケジュールを作成

スケジュール名: stop_minecraft_server_01, stop_minecraft_server_02
頻度: 定期的なスケジュール
日~木: 26:00 終了
金, 土: 28:00 終了

その他

# screen 一覧
screen -ls
# screen アタッチ
screen -r [id]
# screen デタッチ(アタッチ後にscreenコマンド反応しない場合は別のsshセッションからデタッチする)
screen -d [id]

コメント

タイトルとURLをコピーしました