長いことテスターやってますが、サーバーはいまだによくわかりません。
「サーバーログを検索できる程度の知識はあったほうがいいよね」ということで、LPICレベル1のテキストを読みはじめましたが、正直 ( ´_ゝ`)フーン で通り過ぎてしまう・・・
これはやはり触ってみるのが一番なのでは?と考えていたところ、ちょうど息子から「友達とマイクラやりたい。MOD入りで」と。そうだ、マイクラサーバー作ろう。
幸いちょっと検索すればいろんな人がマイクラのマルチサーバーの作り方を解説してくれていて、書いてあることをまるパクリすれば起動するのは簡単でした。でも、「この数字は何?」とか「このコマンドは何やってるの?」とか「どうしてそれが必要なの?」とかまで解説しているのは見つけられず・・・。これじゃあ、息子から突っ込まれたら答えられない!母の威厳が!
というわけで、この記事ではマルチサーバーを動かす、というよりは、その過程で出てきた普通は基礎すぎてスルーされる内容を、LPICの教科書片手に調べたメモとともにまとめてみました。(知識ゼロの中学生でも理解できるように)
前提
- AWSアカウントを持っていること
- Mincraft Java版を持っていること
AWS(Amazon Web Services)はいわゆる「クラウド」。インターネットを介して必要なサービスを利用できるクラウドインフラサービスのこと。今回はAmazon EC2(Amazon Elastic Compute Cloud)というサービスを利用して「仮想サーバー」を作成し、そこに必要なプログラムをインストールしてマインクラフトのマルチサーバーを動かします。
余談:なぜEC2?
- PCのスペックの問題-ゲームをするときにマルチサーバーとして自機を動かしながらクライアントとしてそこに参加するようにするには、息子のマシンはパワー不足
- EC2ならサイズ変更可能、使った分だけお金払えばいい(常時起動はしない想定。ちなみに常時起動でそこそこのスペック要求するならCONOHAとか使った方が安くなる場合も)
- 社内勉強会で使ったことあるから馴染みがある(初見じゃない、ってレベルですが)
- なにより、AWSアカウント持ってる(前にお父さんがARKサーバー立ててた・・・)
- 家のルーターのポートを開放するのがめんどくさい
ちょうど2021/12/10に『マインクラフト』Java版にセキュリティ上の問題(Log4jの脆弱性)が判明しました。
公式サイトでは同問題への対応を盛り込んだ「1.18.1 Release Candidate 3」を配信中なので、これ以降のバージョンであれば大丈夫だと思いますが、古いバージョンやサードパーティ製のものを使う場合には注意が必要になるのかなと思います。
古いバージョンを動かしたい&EC2で対策したい場合はALBを導入してWAFをくっつけてしまうのが手っ取り早いと思います。ちなみに、ALBは有料です。(ディメンションがややこしくて金額の見積もりが結構大変)
バニラ編
まずは公式バニラからじゃね?ということで、マイクラ公式の2021/12/13 現在最新版である minecraft_server.1.18.1.jar を動かしてみます。
手順は以下です
-
EC2インスタンスを作成する
-
EC2インスタンスに接続する
-
Javaをインストールする
-
マインクラフトサーバー環境構築
-
クライアントからマイクラサーバーにログインする
-
終了する
1.EC2インスタンスを作成する
AWS EC2というのは、AWSが提供している仮想サーバー構築サービスです。昔はPC本体を買ってきてそこにいろいろインストールして、ネットワークにつないで、とやることがたくさんありましたが、EC2を使えばクラウド上に簡単にサーバーが作れます。
このサーバーは物理的に一台のPCとして実態があるわけではなく、AWSクラウドのメモリ上に展開されたプログラムとデータの集合です。でも、利用者からみると一台のコンピュータが稼動しているように見え、実際のコンピュータと同じようにその上でソフトウェアを起動することができます。こうした仮想的なコンピュータとして起動したものを「仮想化インスタンス」と呼びます。EC2インスタンスはこうした仮想化インスタンスの一つです。
EC2ではいろいろなOSが使えますが、今回はLinux系のAmazon Linux2を使用します。理由は無料で楽(配布元が同じAWS)だからです。(WindowsはOSの使用料がかかります)
メモ:Linuxって?
1.1. AWSコンソールでEC2をクリック
リージョンが日本になっているか確認します。デフォルトではたいてい北米になっています。
※画像は2021/12初旬のものです。画面はちょこちょこ変わったりするので、参考程度に。
メモ:リージョンって?
1.2. EC2インスタンスのコンソール画面で「インスタンスを起動」をクリックします
ステップ 1 : Amazon マシンイメージ(AMI)
【Amazon Linux 2 AMI】 を選択します。
cpuのタイプを先に選択するようになっていました。(先月まではなかった)
料金表を見たらt4gのほうがt3より微妙に安かったので、t4g Armを選択しました。
ステップ 2 : インスタンスタイプの選択
【t4g.small】 を選択します。
メモ:インスタンスタイプって?
t4g.small を選択したのは、マイクラのサーバー要件から決めました。
参考サイト:Minecraft Wiki サーバー要件
今回、友達と楽しむ程度なのでプレイヤーは多くても5~6人程度、バニラなので最低限でよい、とするとCPUはintel Core2程度で、RAMは2GB、ディスクは200MBあればよいことになります。なので、メモリ=2GiB を基準に選択し一番安いt4g.small(vCPU=2)を選びました。実際にこれで足りるのかは動かしてみてからですね。ちなみに、t4gとt3の違いはCPUでt4gはArmベース、t3はIntelベースです。まあ、そんなに処理速度要らないだろう・・・。バニラだし。
ステップ 3 : インスタンスの詳細の設定
ステップ 4 : ストレージの追加
デフォルトのまま
※ディスクはOS用以外にはマイクラ用に200MBあればよい。
ステップ 5 : タグの追加
キーに「Name」を指定して値を設定すると、作成したリソースに名前を付けることができます。作成したインスタンスはインスタンスIDで区別できますが、意味のない数字&文字列なので、直感的にわかりやすい名前を付けておくことをお勧めします。
※タグをつけることにより、「このタグのついているリソースの一覧を検索する」といったこともできるようになります。
とりあえず、以下の値を入れました。
キー=Name
値=Mincraft_vanilla
ステップ 6 : セキュリティグループの設定
新しいセキュリティグループを作成します。
作成中のインスタンスはこのセキュリティグループに属することになります。
セキュリティグループ名と説明に適当に名前を入れ、インスタンスに出入りする通信を制御するルールを設定します。
- SSHのデフォルトポートは22なので、22番には自分のIPアドレスを設定します。
- マインクラフトのデフォルトポートは25565番なので、IP制限はせずに、すべて通れるようにしておきます。
タイプ | ポート番号 | ソース |
---|---|---|
SSH | 22 | 自分のIPアドレス |
カスタムTCP | 25565 | 0.0.0.0/0 |
※自分のIPアドレスは、「ソース」のプルダウンで「マイIP」を選択すると自動で表示してくれます。
※IPアドレスの制限をしたくない場合は「0.0.0.0/0」と入力します。
インスタンスを作成してできたLinuxサーバーに、JavaやマイクラサーバーをインストールするのにはSSHを使用します。なので、自分はSSH接続ができるようにしておく必要があります。でも他人にSSH接続を使われると困るので、SSH用のポート22番には自分のIPから来た通信だけを通すように設定します。
対して、ゲームに参加する友達はマイクラに到達できないといけないので、マイクラに通信するポート25565番はどんなIPでも接続できるようにします。
メモ:SSHって?
メモ:ポートって?
ウェルノウンポートはIANA(Internet Assigned Number Authority)が管理しています。
登録済みポートもIANAが管理していますが、IANAに登録されていない番号もあります。
IPアドレスが番地(マンション)、ポートが各部屋、と考えるとわかりやすいです。外から来た人(通信)はマンションの入り口で部屋番号の呼び鈴を押します。呼び鈴を押された部屋の住人(アプリケーション等)はインターホンに出て応対します。
つまり、22番に来たものはSSHが対応する、25565番に入ってきたものはマイクラが対応する、と通信を分けることによってサーバー上の複数のサービスが混乱なく動きます。
使わないポートは閉じておくのが基本です。というのは「ポートスキャン」と呼ばれる攻撃手法があるからです。ポートスキャンは、呼び鈴を押しまくって、住人がいるかどうか、どんな人がでてくるのか調査する、という感じです。ポートの開閉状況やサービス、バージョンなどがわかれば、それを足掛かりに情報を取得したり攻撃したりできてしまう場合があります。使うポートのみ開けるのが基本です。
ステップ 7 : インスタンス作成の確認
この画面で、これから作成するインスタンスの設定内容が確認できます。
「起動」をクリックします
「既存のキーペアを選択するか、新しいキーペアを作成します。」ダイアログ
以下の手順で新しいキーペアを作成してキーペアをダウンロードします。
- 「新しいキーペアの作成」を選択
- このインスタンスのキーであることがわかるように「キーペア名」に名前を入力します「Mincraft_vanilla_key」
- 「キーペアのダウンロード」をクリックしてキーペアを保存します
- 「インスタンスの作成」をクリック
起動中のインスタンスの確認
『ステータスチェック:2/2 のチェックに合格しました』 と表示されたら出来上がり。
起動したサーバーのIPアドレスは「パブリックIPv4アドレス」と書かれているものになります。
2.EC2インスタンスに接続する
さて、AWSクラウド上に「Mincraft_vanilla」というインスタンスを作成しました。このインスタンスではAmazon Linux2というOSが起動している状態になっています。
このLinuxサーバーに接続して、Javaとマインクラフトサーバーをインストールしなければならないのですが、それにはまず、サーバーに入らなくてはなりません。
サーバーに入るにはSSHクライアントを使います。自分のPCにSSHクライアントがインストールされていない場合には、インストールします。今回は定番ツール、TeraTerm を使用しました。
TeraTermを起動すると接続先を入力する画面が表示されます。
ホストにサーバーのIPアドレスを入力し、OKをクリックします。
SSH認証画面が表示されたら
- ユーザー名にEC2のデフォルトユーザー名である「ec2-user」
- 認証方式は「鍵を使う」を選択して秘密鍵にインスタンス起動時に作成してダウンロードしておいたキーペアの
Mincraft_vanilla_key.pemファイルを指定します。
OKをクリックすると下のような画面になり、EC2インスタンスに接続されました。
3.Javaをインストールする
メモ:Javaって?
Minecraftはもともとjavaで開発されていて、PC+Java環境で動くJava版と各種プラットフォームで動く統合版があります。今回はJava版(minecraft_server.1.17.1.jar)なので Corretto 17 をインストールします。
※minecraft_server.1.17.1.jarに対応するjavaのversionは16以上
メモ:インストールするということ
Linux系OSにソフトをインストールする場合、こうしたパッケージをインストールすることになるのですが、汎用性の高い機能をもつライブラリやプログラムはオープンソースが多く、様々なソフトで共通に使われていたりすることが多々あります。
たとえば、あるパッケージAに含まれるファイルAをパッケージBが使う、という場合、パッケージBはパッケージAがインストールされていないと動かないことになります(パッケージの依存関係)。また、パッケージAではファイルZのバージョン1を使うけれどパッケージBではファイルZのバージョン2を使う、といった場合、ファイルZは名前がおなじなので2種類インストールすることができません(パッケージの競合)。パッケージ管理システムではこうした依存関係や競合を監視して、インストールやアンインストールの際に警告を発してくれます。
Amazon Linux2のようなRed Hat系のOSは、パッケージ管理システムとしてRPM「Red Hat Package Manager」→「RPM Package Manager」を採用しています。
RPMはrpm 形式のパッケージがインストールされると、その情報を「/usr/lib/rpm」に格納します。このデータのまとまりを「RPM データベース」といいます。この情報を使って、RPMはパッケージをインストール・アンインストール・アップデートする際に依存関係のあるファイルについて警告を発してくれます。
yumはRPMパッケージを統合管理するものと考えればよいです。
yumがRPMと違うところは、依存関係の解決を(ある程度)自動でやってくれるというところ。というのは、yumは「リポジトリ」にパッケージの配布元情報を持っており、足りないファイルがあればその情報に基づいてダウンロードしてきてくれたりします。
Amazon Linux2にはyumもはじめらか含まれているので、rpmパッケージをインストールする際にはyumコマンドを使用できます。パッケージの入手先は
/etc/yum.repos.d
ディレクトリ以下にあるリポジトリ情報の設定ファイルにあります。
ところで、上のAmazon Linux2の最初の画面に「セキュリティに必要なパッケージがあるからアップデートしろ」という旨のメッセージが出ています。
yum update
を実行すると、インストールされている全パッケージが最新版にアップデートされるので、実行しておきましょう。
yumコマンドを使って、Javaをインストールします。
Java16をインストールすればいいので Amazon Corretto 16 をインストールしようと思ったら、もう17が出てました。今回は Amazon Corretto 17 を使ってみます。
# Amazon Corretto 17 をインストール
sudo yum -y install java-17-amazon-corretto-devel
# インストールされているか確認
sudo java -version
最後にComplete!
と表示されて、インストール完了です。
インストール出来たらjavaのバージョンを確認してみましょう。
メモ:このコマンドでやっていること
・
java -version
はjavaのバージョンを確認するコマンドです。javaがインストールされていればバージョンを返しますが、インストールされていないとcommand not found
(コマンドが見つかりません)と返してきます。
※ちなみに、各コマンドの頭につけている
sudo
はsudoコマンドと呼ばれるもので、sudo コマンド
と指定することで、「スーパーユーザー(rootユーザー)」の権限が必要なコマンドをsudoコマンド経由で実行させることができます。
メモ:correttoのインストールが失敗したら
AMIのバージョンによるのか、時期的なもの(corretto17がリリースされたばかりだった)かわかりませんが、yum パッケージマネージャーで Corretto RPM リポジトリ (Amazon Linux AMI など) を使用するには、Corretto パブリックキーをインポートし、リポジトリをシステムリストに追加する、という作業が必要な場合があるようです。
上はインストールできなかった時のキャプチャ。yumは「リポジトリ」にパッケージの配布元情報を持っている必要があるのですが、
No package java-17-amazon-corretto-devel available.
...ないって怒られてますね。
そこでCorretto パブリックキーをrpmコマンドでインポートして、リポジトリファイルをcurlコマンドで持ってきます。
# Corretto パブリックキーをインポート
sudo rpm --import https://yum.corretto.aws/corretto.key
・
rpm --import
はrpmコマンドで、ここではパッケージの署名確認等に使用する公開鍵のインポートをしています。
# リポジトリをシステムリストに追加
sudo curl -L -o /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo
・curl -L -o
はcurlコマンドで、これはさまざまなプロトコルに対応したデータを転送するためのコマンドです。
curlコマンドは通常では実行結果として取得するHTMLは標準出力(コンソール画面)に表示しますが、-o
オプションを使って-o [ファイル名] [ファイル取得元アドレス]
のようにすると、取得結果をファイルに保存します。
-L
は取得元がHttpステータス300番台で別のURLへの転送(リダイレクト)する場合に、リダイレクト先まで行くようにします。(このオプションがついてないと、自動でリダイレクトしない)
リポジトリを見ると、
corretto.repo
が追加されているのがわかります。この後のインストールは成功しました。
(log4j騒ぎの後で作り直したときはリポジトリ追加しなくてもインストールできたので、今後は必要なくなるのかも?)
4. マインクラフトサーバー環境構築
いよいよ、マインクラフトサーバーを作ります。
4.1 準備
マインクラフトサーバー用作業ディレクトリを作成する
デフォルトユーザーのディレクトリ( /usr/ec2-user) の下に minecraft というディレクトリを作成します。
#ディレクトリの作成
mkdir ~/minecraft
#作成したディレクトリに移動する
cd minecraft
#カレントディレクトリ(今いる場所)を確認する
pwd
メモ:ここまでに出てきたLinuxコマンド
ls 内容を表示したいディレクトリ| |mkdir|ディレクトリを作成する|mkdir ディレクトリ名| |pwd|現在いる位置を表示する|-| |rm|ファイルやディレクトリを削除する|rm ファイル名またはディレクトリ名| |mv|ファイルを移動する|mv 移動元 移動先|
※ディレクトリの指定の仕方等がわからない場合は、「Linux パス」とかで検索してみよう!
マインクラフトサーバーjarファイルをダウンロードしてくる
公式のバニラサーバーは以下のページに置いてあります。
https://www.minecraft.net/ja-jp/download/server
このページに minecraft_server.1.18.1.jar のリンクがあるので、リンク先URLを確認してcurlコマンドでとってきてもいいですが、せっかくTeraTermをインストールしたのでTeraTermのSCPを使ってみます。
公式のサーバーダウンロードページにあるリンクをクリックすると自分のPC(ローカル)にダウンロードが始まります。server.jar
というファイルがダウンロードされたと思います。
同じページに書いてある起動コマンドに合わせて、ファイル名をserver.jarからminecraft_server.1.18.1.jarに変更しておきます。
※起動コマンドのファイル名を変えてもよいのですが、ファイル名にバージョンを入れておいた方が後でわからなくならなくていいかな?と思って変えてみました。
TeraTermを起動してファイル > SSH SCP...
を選択します
ウィンドウが開いたら上半分に送信するファイルと送信先を入力して「send」ボタンを押すとサーバーにファイルがコピーされます。
項目 | 入力内容 |
---|---|
From | ダウンロードした minecraft_server.1.18.1.jar ファイルのパス |
To | /home/ec2-user/minecraft |
メモ:コマンドでやりたい人
4.2 起動する
初回起動
ダウンロードサイトでは、実行用のコマンドとして以下のように書かれています。
java -Xmx1024M -Xms1024M -jar minecraft_server.1.18.1.jar nogui
javaの引数部分 -Xmx1024M -Xms1024M
これは使用するメモリの最大値と最小値をMBで指定しています。
今回は t4g.small でメモリが2Gしかないので、とりあえずこのままでいきます。(後々、メモリ使用量を見てチューニング…)
初回起動ではサーバーは起動しません。EULA(利用規約)に同意してください、という旨のINFOが表示されて停止します。
利用規約に同意する
初回起動でマインクラフトサーバーのパッケージが解凍されて、複数のファイルが出現しています。
その中に eula.txt というファイルがあるので、ファイルを開いて eula=false
と書かれている部分を eula=true
と書き換えます。
単なるテキストファイルの中身を書き換えるだけなのですが、Linuxではviエディタという、一般人にはちょっとなじみのないエディタを使うので注意が必要です。
メモ:viエディタで編集
(1) 「vi [編集したいファイル名]」と入力して、編集したいファイルを開く
vi eula.txt
ファイルを開いた直後は入力ができない「コマンドモード」になっています。
(2) 「i」と入力して「インサートモード」に変更する
左下に「インサートモード」を示す「INSERT」という文字が表示されていればインサートモードです。
(3) eula=false を eula=true に書き換える(BackSpaceキーは使えるけど、Deleteキーは使えないので注意)
(4) ESCキーを押してインサートモードを終了する
(5) コマンドモードに戻って、保存して終了するコマンド「:wq」を入力してEnterを押します。
画像では「:wq」と入力していますが、「:w」で保存、「:q」で終了のように別々に入力してもOKです。
viの詳しい使い方は、「vi 使い方 linux」で検索してみてください。
もう一度起動する
java -Xmx1024M -Xms1024M -jar minecraft_server.1.18.1.jar nogui
利用規約に同意してから上のコマンドを実行すると、今度はサーバーが起動してワールドの生成が始まります。
コンソールには起動時のログが次々と表示されていきます。
最後に Server thread/INFO:Done
のような文字列が表示されたら完了です。
これでEC2にマイクラサーバーが立ち上がりました!
5. クライアントからマイクラサーバーにログインする
自分のPCから入ってみます。
マインクラフトランチャーの最初の画面で「マルチプレイ」を選択して「マルチプレイで遊ぶ」画面を表示します。
「サーバーを追加」でサーバー情報を追加してから接続してもよいですが、今回EC2は使用時にのみ起動する想定&IPを固定していないので、起動ごとにIPが変わってしまいます。なので、ダイレクト接続でつないでみます。
サーバーアドレスにIPアドレスを入力してサーバーに接続します。
一緒に遊ぶ友達に、IPアドレスを連絡して接続してもらいます。
6.終了する
-
マインクラフトを停止する
サーバのコンソールからstop
と入力します。
後述のゲームクライアントからの/stop
(要権限)でもOKです。 -
EC2インスタンスを停止する
EC2コンソールから「インスタンスを停止」します。停止しても作ったサーバーやデータは残っているので、次回開始時に続けて遊べます。「インスタンスを終了」すると、EC2インスタンスが削除されるのでせっかく設定したサーバーも消えてしまいます。お金の節約のために「遊ばない時はサーバーを止めたい!」という方は、停止を選択してください。
-
作成済みのEC2インスタンスを開始する
EC2コンソールから設定済みのインスタンスを選択し「インスタンスを開始」すると、EC2インスタンスが起動します。インスタンスが起動したら、SSHでログインして再度マイクラサーバーを起動してください。
おまけ マイクラのコマンド
OP権限を設定する
マイクラのゲームクライアントから「minecraft_server」を停止させることもできます。
ゲーム画面のコマンド入力を表示して「/stop」と入力すればよいのですが、これはオペレータ権限(OP権限)をもったアカウントでなければ実行できません。
アカウントにオペレータ権限を付与するにはサーバのコンソールから「op コマンド」を実行します。
すでにオペレータ権限を持っているアカウントであればゲームクライアントからでもOP権限を与えることができますが、最初の一人(自分)にはコンソールから付与するのが簡単でよいです。(もう一つ、サーバーのops.jsonファイルを書き換えることでも付与可能なのですが、これはちょっと面倒なので割愛)
op権限はサーバーの停止のほかいろいろ強力なことができるので、信頼できる人にしか付与してはいけない
内容 | コマンド |
---|---|
OP権限を付与する | op アカウント名 |
OP権限を取り消しする | deop アカウント名 |
ホワイトリストを有効にする
ホワイトリストを有効にして、ホワイトリストに載っているアカウントしか接続できないようにすることができます。サーバー荒らし対策としては一番楽で確実だと思うので、うちわで楽しむならやっておいた方がよいです。
ホワイトリストコマンドも、サーバのコンソールからとクライアントのゲーム画面からのどちらからでも実行できます。
内容 | コマンド |
---|---|
ホワイトリストを有効にする | whitelist on |
ホワイトリストを無効にする | whitelist off |
登録済みアカウントのリスト表示 | whitelist list |
ホワイトリストにアカウントを追加 | whitelist add アカウント名 |
ホワイトリストからアカウントを削除 | whitelist remove アカウント名 |