まりぴよこのブログ

日々の日記。技術ネタでまとまりきってないものの記録、伝わる文章の書き方を練習とか。

MinecraftマルチサーバーをGCPに上でケチケチ運用する

この記事は Minecraft Advent Calendar 2017 - 10日目の記事です。

Minecraftのmoddingやプラグイン作成・・とはあまり関係ないですが、 マルチサーバー環境を構築に関する記事です。

qiita.com

MinecraftマルチサーバーをGCP上に立ててサーバーup, downをslack commandから実行できる環境を整える

GCPにマイクラマルチサーバーを立てる

以前に書いた自分のブログ記事。 日付を見る限り1年以上前だったことに驚愕・・

GCP公式に載っているマイクラマルチサーバーの立て方をなぞった程度のもの

mpiyok.hatenablog.com

この続きを書く。

以下の前提 : インスタンスminecraftサーバーが起動するところまで終わっていること。

サーバー代をケチるために気軽に up down させたい

このインスタンス、社内メンバー向けのマイクラサーバーなので別に常時起動させておく必要もない。。

そして全員同じslack上にいるので、好きに up, downさせる状態にしておけばサーバー代が節約できるのでは・・と思い以下の目標を立てる。

目指すこと

  • slack commandで /minecraft up したらGAE instanceが起動
    • instance起動時にマイクラサーバーの java も起動
  • slack commandで /minecraft down したらマルチサーバーが停止
  • 停止→起動するとIPが変わってしまうので、 /minecraft /status したらサーバーのIPアドレスを返す

構成図

f:id:mpiyok:20171210093352p:plain

STEP 1 : instance起動時にマイクラサーバーの java も起動

disk mount (必要に応じて)

セットアップ時に別ディスクにインストールしたりとかしたので、マウントする

特に分けてなければ不要。

mountしたいディスクを調べる

gcloudにsshログイン後

> ls -al /dev/disk/by-id/

ディスク名が以下のような感じを例に /dev/disk/by-id/scsi-0Google_PersistentDisk_persistent-disk-1

server 起動時にディスクをマウント

mount -o discard,defaults {disc_name} {mount_destination} マウントするコマンドを /etc/rc.local に記述

記載例 :

mount -o discard,defaults /dev/disk/by-id/scsi-0Google_PersistentDisk_persistent-disk-1 /mnt/disks/minecraft

server起動後にマイクラサーバーも起動できるようにする

minecraft serverをスクリプト起動できるようにしておく

java -Xms1024M -Xmx1024M -d64 -jar minecraft_server.jar nogui

shell起動で chmod +x 実行できるようにしておく

server起動後に crontab で shellを実行

> crontab -e

cron設定をeditor編集

起動時にログを記載できるように以下のような感じにしておくと Good

@reboot /path/to/script/start_minecraft.sh >> /tmp/start_mc_server.log 2>> /tmp/start_mc_server_error.log

ここまで出来たら、google cloud consoleから、instance 停止・起動してみて、無事サーバー起動していることを確認する。

STEP 2 : slack commandに応答するスクリプトをGAEに置く

google cloud consoleにログインできなくても、slackからgce instanceが起動できるようにする。 slack commandから叩けるapiを準備する。 GAE(Google App Engine)でGoの組み合わせがおすすめ。(無料枠でいけるので)

基本手順はこちらが良い感じ

Compute Engine APIを使って、GAEからインスタンスを起動・停止する|apps-gcp.com|G Suite(旧:Google Apps) やGoogle Cloud Platform サービスについて紹介します

実際のGoスクリプトはこんな感じ

以下は自分の環境に合わせて適時修正

  • YOUR_GCP_PROJECT_NAME
  • YOUR_GCP_ZONE
  • YOUR_GCP_INSTANCE_NAME
  • YOUR_SLACK_TOKEN

※ YOUR_SLACK_TOKEN は次のステップで登録する slack slash command のもの

ディレクトリ構成

+ app.yaml
+ minecraft/
`-- ip.go

gcp instance up, down, check status by GAE

(なぜかgistのインデントスペースがズレる・・)

deploy

SDKの設定など諸々 gcloud 関連のコマンドを作業マシンで使えるようにしておく

Deploying a Go App  |  App Engine standard environment for Go  |  Google Cloud Platform

起動スクリプトのルートディレクトリで

$ gcloud app deploy

デプロイ出来たら以下でアクセス、レスポンスが返ってくることを確認する

gcloud app browse

GETリクエストを受けた時に

{
  "message": "OK"
}

のようにjsonを返すようになっているので、ブラウザが立ち上がって、 message が表示されたらデプロイはOK。

この時のブラウザURLに次の slack slash command からPOSTリクエストを送る

STEP 3 : Slack slash commandの登録

api.slack.com

STEP 4 : Let's multi play :)

コマンド呼び出してみる

f:id:mpiyok:20171209150125p:plain


ここまで書いておいてアレですが、結局遊び終わってすぐに down させてることは稀で、ほぼ常時起動に近い状態なんですよね・・

というのも、夏休みに会社メンバーの家族たち(小学生)が遊びに来たりしていたので、いちいち父・母・叔父・叔母に「マイクラやらせて〜」だの、 再起動でIP変わって「なんかマイクラできないんだけど?」などをくるのも面倒だしな・・というわけで、結局常時起動。。

ただ、時々javaのプロセスだけ落ちてたりするので、繋がらないな〜となった時に手軽にサーバーを up, down できるのはかなり便利♪

私の個人アカに立てるサーバーなのでみんなで投げ銭してサーバー代をカンパしようかとか言ってたのですが、 みんなで使ってるならいいよと会社から補助が出るようになったので、そんなに気にせず起動しっぱなしになっているともいう。。

最後に弊社マイクラ村の様子をチラリと・・

第一期村

マイクラプレイスキルヘボヘボの私が建て・・てる途中で割れ窓が放置されているキャビン (綺麗に写真撮ってくれた人がいたので、ちょっとかっこよく見える)

f:id:mpiyok:20171209151024p:plain

なんでもすぐに自動化する・建築もできる匠の建てたホテル

f:id:mpiyok:20171209151221p:plain

一人でマイクラをプレイした時には何が何やら・・?で途方にくれたと言ってた人が建てた城(写真は建築中の時。最終的には屋根までしっかり完成した)

マルチだといろいろみんなが教えてくれるので捗るらしい(にしてもデカイ・・)

f:id:mpiyok:20171209151810p:plain

石の一級建築士が建てた数々の建造物の写真が見当たらなかったのが残念・・

第二期村

私の都合で第一期村のデータを脇によけ(理由忘れたけどインスタンス新しく作り直した)まっさらにした土地にも更に開拓の手が。。

自動化の匠の真骨頂・自動さとうきび回収タワー 村人は一生さとうきびには困らない・・・

f:id:mpiyok:20171209151318p:plain

弊社マイクラサーバーにて、初めてマイクラと出会ったはずのデザイナさんの建築した家

最近マイクラデビューしたとはとても信じられない・・

やはりデザイナ職とマイクラは非常に相性が良いのだな。。

f:id:mpiyok:20171209151440p:plain

第二期村のマップ(最近マイクラデビューしたはずのデザイナさん作) きっちりした性格が出ている。。

f:id:mpiyok:20171209152255p:plain


最後に軽く宣伝

弊社では 一緒にマイクラを遊んでくれる じゃなかった・・一緒に開発に取り組む仲間を募集しています!

全員がリモートワークの会社です。

ゲーム好きが多いので、こんな感じでoffを楽しんだりもしています〜

もちろんゲーム特に興味ないよ?って人もいます。

多様な生き方・価値観を尊重する文化を大切にする集団です。

heartrails.github.io

デザイナ募集

heartrails.github.io

エンジニア募集

heartrails.github.io