概要
- 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]
コメント