AWS EC2にdockerをインストールしてminecraft-bedrock-server(minecraft統合版)を立ち上げてプレイするまで

# はじめに
2022年12月現在、我が家ではminecraftが流行している。特にメインユーザーである子供（幼児）は放っておくとずっとやっている。
ゲームは1日1時間とかゲームのし過ぎは教育上よくないとか、今回はそういう話ではない。
あるとき、幼児から皆で一緒に「マイクラしたい」と強い要望が寄せられた。
要望をいただき調べてみると、マイクラ統合版のdockerイメージがあるではないか！
あれ？これEC2でマイクラサーバー立てられるんじゃね？と思った私は早速本格的な調査を行い、諸々の設定作業を進めて行った。
結果、無事出来たので、この記事はそんな諸々の設定作業をまとめたものである。
そろそろ年末だし、今年の年末年始はご家族でブランチマイニングに勤しんでみてはいかがでしょうか。

# AWS EC2インスタンスの新規作成
手始めにEC2を用意します。
なお、画面のキャプチャでは個人情報やよくわからない乱数が表記された部分等を一部マスクしています。

「インスタンスを起動」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/69dd0bc5-8a23-1efa-e1f4-c83db2754b4d.png)

起動するインスタンスの設定をしていきます。
今回は以下の内容で起動します。この辺りはお好みに合わせて適宜変更してください。

- minecraftというタグをつける
- AMIはAmazon Linux 2 を使用する
- インスタンスタイプはt3.smallを使用する
  - 一番安いのはt2.microだが、同様のことをしている他のブログ等を見てみるとt3.smallを選択していたので同性能のインスタンスタイプを選択する
  - t2.microでも動くかもしれないが未確認
- 任意のキーペアを選択する
- ネットワークはデフォルトのものを使用する
- セキュリティグループは今回用に新規作成する
  - 後ほどセキュリティグループの設定追加を行う
- ストレージは8GB
- 高度な詳細は触らない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/4cab0e1f-b153-45fd-1cbb-1c4d9bb61898.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/d50cfbe6-50e9-bb2d-9146-727c53e92f56.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/d9ea1723-405e-ed21-09fa-1d8ce798aac1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/37a9a72a-305f-1fe7-00d2-1535327ad97c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/db8e97d8-3924-7e48-156e-3a98b2e50b24.png)

以上の設定でEC2インスタンスを起動しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/5e2e9f93-5984-7e4c-c686-02301dbf798e.png)

# セキュリティグループの設定
minecraft-bedrock-serverではUDPの19132ポートを使用して通信をするようですがデフォルトのセキュリティグループ設定では通信が出来ません。
そのため、セキュリティグループのインバウンドルールに設定を追加してUDPの19132ポートの通信を許可します。

まずは作成したEC2を選択し、画面下部のタブから「セキュリティ」を選択、その後、「セキュリティグループのリンク」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/8d0d7e56-ab60-cb0e-baa3-4711536cebfc.png)

「インバウンドルールの編集」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/92f242bf-1e59-8369-e040-87a546321351.png)

以下ルールを追加して「ルールを保存」を押下します。

- タイプはカスタムUDPを選択
- ポート範囲は19132を入力
- 許可するIPアドレスの範囲を「0.0.0.0/0」を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/0d49a7a9-5c30-0a66-2bad-d740347b0e09.png)

設定が追加できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/3551f8e8-1c3d-98ca-7310-00c1f4af06c6.png)

# Elastic IPアドレスの割り当てと関連付け
我が家のminecraft運用では、使用したい時にEC2を起動し、夜寝るとき等使用しない時間帯には停止するということをしています。
**EC2は起動時間に対して課金されるため、少しでも費用を安く抑えるためです。**
そして通常のEC2は停止したり開始したりするとパブリックIPアドレスが変わってしまいます。
これの何が困るのかというと、起動の度に新しいIPアドレスを入力してminecraftを開始しなくてはならないという点です。
我が家のminecraftメインユーザーの幼児にはIPアドレスの概念が分かりません。

そこで登場するのがElasticIPアドレスで、これを設定するとEC2のパブリックIPアドレスを固定化し、EC2起動の度にIPアドレスが変更されなくなります。我が家はこの設定が必須となっています。

なお、**このElasticIPは若干の費用が掛かりますし、必須の作業ではありませんので、上記の事情が許容できるならば行わなくても問題ありません。**

事情を説明したところで、それでは作業を行って行きます。
まずは「Elastic IP」リンクを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/cc093f2e-927c-e946-0e93-b0fd68f26300.png)

「Elastic IPアドレスを割り当てる」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/1f67761d-4c95-e6a7-3541-e67a999d77cd.png)

特に何も変更せず「割り当て」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/2b9e93ee-2eb0-65e5-9fc6-f7f1ac64948d.png)

これでElasticIPアドレスが発行されました。次は発行されたElasticIPアドレスをEC2に関連付けます。
「Elastic IPの関連付け」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/a327f23b-782f-f652-1d3f-af2257332712.png)

インスタンスに「先ほど作成したECのID」を入力して「関連付ける」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/9fa6af43-e821-1824-66c7-3c3d6d516ce1.png)

発行されたElasticIPアドレスとEC2が関連付きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/9710f790-2357-cdc3-7c38-11b5366617f3.png)

# docker インストール

まずはEC2にSSHログインします。

```bash
$ ssh -i '~/.ssh/aws-xxxxxxxxx.pem' ec2-user@54.xxx.xxx.xxx
```

以下のコマンドを順に実行してdockerをインストールします。
```bash
$ 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をインストールします。
```bash
$ 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を立ち上げる

作業ディレクトリを作成します。
```bash
$ cd
$ mkdir minecraft
```

ディレクトリ配下は以下のような構成にしました。
```
minecraft
  - backups
    - config.yml
  - docker-compose.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
```

```config.yml
containers:
  bedrock:
    - name: minecraft_server
      worlds:
        - "/server/worlds/MY_WORLD"
schedule:
  interval: 2h
trim:
  trimDays: 2
  keepDays: 14
  minKeep: 2
```

以上の作成が終わったらdockerでminecraft-bedrock-serverを起動します。

```bash
$ cd minecraft
$ docker compose up -d --build
```

こちらのコマンドを実行し、以下が表示されれば通常に起動しているかと思います。

```bash
$ 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の画面で必要情報を入力して繋いでみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/66841e9e-7ff1-1026-9e73-442d42186631.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/e9f60f4c-95a1-8b8c-f7a0-39ab7c9e7efc.png)

ヒャッハー！出来たぜ！
Let's Enjoy Playing!!!

# AWS EC2インスタンスの停止
使用しないときはEC2を停止しておくと費用を安く抑えられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/70086178-4abf-3b79-eb19-333c6cb73c8f.png)

# 終わりに
最後に以下の仮定で料金を見積もってみる。見積もりが誤っていても責任は持てない。
- 東京リージョンを使用する
- 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と組み合わせると、指定の時間に開始したり停止したりスケジュール管理が出来そうだが、それはまた別の機会に。

# 参考記事
以下の記事には大変お世話になりました。

[【Docker】minecraft統合版サーバーを立てる。](https://nekoy3.net/2022/03/02/docker-bedrock/)

[AWS EC2インスタンスにdockerとdocker-composeをインストールして簡単なWEBサービスを立ち上げる方法](https://qiita.com/y-dobashi/items/e127211b32296d65803a)

起動時の環境変数関連
https://github.com/itzg/docker-minecraft-bedrock-server#server-properties
https://minecraft.fandom.com/wiki/Server.properties#Bedrock_Edition_3