はじめに
2022年12月現在、我が家ではminecraftが流行している。特にメインユーザーである子供(幼児)は放っておくとずっとやっている。
ゲームは1日1時間とかゲームのし過ぎは教育上よくないとか、今回はそういう話ではない。
あるとき、幼児から皆で一緒に「マイクラしたい」と強い要望が寄せられた。
要望をいただき調べてみると、マイクラ統合版のdockerイメージがあるではないか!
あれ?これEC2でマイクラサーバー立てられるんじゃね?と思った私は早速本格的な調査を行い、諸々の設定作業を進めて行った。
結果、無事出来たので、この記事はそんな諸々の設定作業をまとめたものである。
そろそろ年末だし、今年の年末年始はご家族でブランチマイニングに勤しんでみてはいかがでしょうか。
AWS EC2インスタンスの新規作成
手始めにEC2を用意します。
なお、画面のキャプチャでは個人情報やよくわからない乱数が表記された部分等を一部マスクしています。
起動するインスタンスの設定をしていきます。
今回は以下の内容で起動します。この辺りはお好みに合わせて適宜変更してください。
- minecraftというタグをつける
- AMIはAmazon Linux 2 を使用する
- インスタンスタイプはt3.smallを使用する
- 一番安いのはt2.microだが、同様のことをしている他のブログ等を見てみるとt3.smallを選択していたので同性能のインスタンスタイプを選択する
- t2.microでも動くかもしれないが未確認
- 任意のキーペアを選択する
- ネットワークはデフォルトのものを使用する
- セキュリティグループは今回用に新規作成する
- 後ほどセキュリティグループの設定追加を行う
- ストレージは8GB
- 高度な詳細は触らない
以上の設定でEC2インスタンスを起動しました。
セキュリティグループの設定
minecraft-bedrock-serverではUDPの19132ポートを使用して通信をするようですがデフォルトのセキュリティグループ設定では通信が出来ません。
そのため、セキュリティグループのインバウンドルールに設定を追加してUDPの19132ポートの通信を許可します。
まずは作成したEC2を選択し、画面下部のタブから「セキュリティ」を選択、その後、「セキュリティグループのリンク」を押下します。
以下ルールを追加して「ルールを保存」を押下します。
- タイプはカスタムUDPを選択
- ポート範囲は19132を入力
- 許可するIPアドレスの範囲を「0.0.0.0/0」を入力
Elastic IPアドレスの割り当てと関連付け
我が家のminecraft運用では、使用したい時にEC2を起動し、夜寝るとき等使用しない時間帯には停止するということをしています。
EC2は起動時間に対して課金されるため、少しでも費用を安く抑えるためです。
そして通常のEC2は停止したり開始したりするとパブリックIPアドレスが変わってしまいます。
これの何が困るのかというと、起動の度に新しいIPアドレスを入力してminecraftを開始しなくてはならないという点です。
我が家のminecraftメインユーザーの幼児にはIPアドレスの概念が分かりません。
そこで登場するのがElasticIPアドレスで、これを設定するとEC2のパブリックIPアドレスを固定化し、EC2起動の度にIPアドレスが変更されなくなります。我が家はこの設定が必須となっています。
なお、このElasticIPは若干の費用が掛かりますし、必須の作業ではありませんので、上記の事情が許容できるならば行わなくても問題ありません。
事情を説明したところで、それでは作業を行って行きます。
まずは「Elastic IP」リンクを押下します。
これでElasticIPアドレスが発行されました。次は発行されたElasticIPアドレスをEC2に関連付けます。
「Elastic IPの関連付け」を選択します。
インスタンスに「先ほど作成したECのID」を入力して「関連付ける」を押下します。
発行されたElasticIPアドレスとEC2が関連付きました。
docker インストール
まずはEC2にSSHログインします。
$ ssh -i '~/.ssh/aws-xxxxxxxxx.pem' ec2-user@54.xxx.xxx.xxx
以下のコマンドを順に実行してdockerをインストールします。
$ sudo yum install -y docker # dockerのインストール
$ sudo service docker start # dockerの起動
$ sudo usermod -a -G docker ec2-user # ec2-userをdockerグループに入れる。これでec2-userがdockerコマンドを実行できる
$ sudo docker info # dockerの起動確認
$ sudo systemctl enable docker # サーバー起動時にdockerを起動する
以下のコマンドを順に実行してdocker-composeをインストールします。
$ sudo mkdir -p /usr/local/lib/docker/cli-plugins
$ sudo curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
$ sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
$ docker compose version
dockerでminecraft-bedrock-serverを立ち上げる
作業ディレクトリを作成します。
$ cd
$ mkdir minecraft
ディレクトリ配下は以下のような構成にしました。
minecraft
- backups
- config.yml
- docker-compose.yml
version: '3.4'
services:
minecraft_server:
container_name: minecraft_server
restart: always
image: itzg/minecraft-bedrock-server:latest
environment:
SERVER_NAME: MY_SERVER_NAME
EULA: "TRUE"
GAMEMODE: survival
DIFFICULTY: normal
LEVEL_NAME: MY_WORLD
MAX_PLAYERS: 4
TZ: Asia/Tokyo
ports:
- 19132:19132/udp
volumes:
- ./data:/data
stdin_open: true
tty: true
minecraft_backup:
container_name: minecraft_backup
image: kaiede/minecraft-bedrock-backup
restart: always
tty: true
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./backups:/backups
- ./data:/server
depends_on:
- "minecraft_server"
environment:
TZ: Asia/Tokyo
containers:
bedrock:
- name: minecraft_server
worlds:
- "/server/worlds/MY_WORLD"
schedule:
interval: 2h
trim:
trimDays: 2
keepDays: 14
minKeep: 2
以上の作成が終わったらdockerでminecraft-bedrock-serverを起動します。
$ cd minecraft
$ docker compose up -d --build
こちらのコマンドを実行し、以下が表示されれば通常に起動しているかと思います。
$ docker compose ps -a
NAME COMMAND SERVICE STATUS PORTS
minecraft_backup "/usr/local/bin/entr…" minecraft_backup running (starting)
minecraft_server "/usr/local/bin/entr…" minecraft_server running (healthy) 0.0.0.0:19132->19132/udp, :::19132->19132/udp
いよいよプレイできるか試してみる
さあ、メインイベントです。ここまでの所作が全て上手く完了していればもうminecraftをプレイできるはずです。
minecraftの画面で必要情報を入力して繋いでみてください。
ヒャッハー!出来たぜ!
Let's Enjoy Playing!!!
AWS EC2インスタンスの停止
使用しないときはEC2を停止しておくと費用を安く抑えられます。
終わりに
最後に以下の仮定で料金を見積もってみる。見積もりが誤っていても責任は持てない。
- 東京リージョンを使用する
- 1日10時間EC2を起動し、14時間は停止する
- EC2が起動している時間はEC2の料金がかかり、停止しているとElasticIPの料金がかかる
- EC2の起動料金は「0.0272 USD/時間」
- ElasticIPの起動料金は「0.005 USD/時間」
この仮定で計算すると
- 1日の料金は(0.0272USD * 10時間 + 0.005USD * 14時間) = 0.342USD
- 1か月の料金は 0.342USD * 31日 = 10.602USD
- 記事執筆時点の1USDが132.25円なので、日本円にすると 10.602USD * 132.25円 = 約1,402円
全然お支払いできる現実的な費用ではないか。
もしかしたらネットワーク転送量とか、EBSとか、私の知らない領域でも若干課金が発生するかもしれない。
なお、EventBridge&Lambdaと組み合わせると、指定の時間に開始したり停止したりスケジュール管理が出来そうだが、それはまた別の機会に。
参考記事
以下の記事には大変お世話になりました。
AWS EC2インスタンスにdockerとdocker-composeをインストールして簡単なWEBサービスを立ち上げる方法
起動時の環境変数関連
https://github.com/itzg/docker-minecraft-bedrock-server#server-properties
https://minecraft.fandom.com/wiki/Server.properties#Bedrock_Edition_3