Slackからminecraftのサーバーを起動する

 随分前から(多分 RubyKaigi2018 の年ぐらいから)Ruby on Jets というAWS Lambdaで動作するフレームワークが気になってた。何か新しいことをするときはこれを使おうと思ってたのだけども、特に使いたいと思うような場面が来なかった。

もともと、何か問題を解決したいことをモチベーションにコードを書いていたんだけど、何か特定のフレームワークを使いたいから、という理由で書くことがなかった。というよりも、結局何か解決をしようとしない限りブラウザやターミナルにHello Worldを書いて終わってしまう。そうするとなんか実行環境は整うだけで、ノウハウみたいなところが身につかないよね。

今回は急にminecraftをしたくなった。というのもThe Unusual SkyBlock(以下TUSB)というマップが配布されており、これがなかなかに面白そうだった。

昔の記憶でプレイ動画は見ていたけど幾度もバージョンアップを重ねてよりよいマップになっていて体験してみたいと思ったのがきっかけ。

導入方法は簡単で配布されているマップデータをダウンロードしてセーブデータを格納するディレクトリに格納するだけ。ただ、僕はこれをマルチプレイでやりたいと思ったのでVPS上に起動しようと思ったんだけど、せっかくだからもう少し技術的なチャレンジにつなげようと思った。それが、今回のタイトルである。

minecraftのサーバーを常時稼働しておくとお金がかかる。と言っても月額の料金は恵比寿駅周辺のランチ2食分(今となっては自炊がメインなのでこのたとえは不適当かもしれないが)程度なのだが、必要なときに必要なインスタンスだけを立ち上げられるようにしたい。そこで検索に出てきて参考にしたのが下記の記事(同僚だった)

https://morishin.hatenablog.com/entry/minecraft-lambda-function

AWS LambdaをからDigitalOceanのインスタンスを起動、終了やマップデータのバックアップができるLambdaの関数を実装していた。

また、minecraftのサーバーはDockerから立ち上げることが可能でTUSBのマップデータをS3の保存しておき起動時に環境変数でURLを渡すだけで展開できるのも便利だった。

https://github.com/itzg/docker-minecraft-server

基本構成はmorishinさんと同じでSlackのSlash CommandからAWS Lambdaを呼び出す。ただ僕の場合はDegitalOceanのインスタンスではなく、EC2上に起動させるところだけが違う。

ハマリポイントというか困りポイントはエラーログの見方がやや分かりづらいというのがある。基本的にはAWSのコンソール上で見ることになるが、各関数ごとにロギングされるので遷移しながらログを読むことになって大変だった。基本的にはLambdaにデプロイする前に手元でテストすることになるのだが、同じIAM Policyを使ってやるのがよい。自分のIAMユーザーの認証情報を使うと権限の扱いが違うのでデプロイしたあとにLambdaに適用していたPolicyに権限足らんやんけ、というのが発生しがち。

あと dotenv で環境変数を管理しているのがちょっといただけなかったが、秘匿値の取扱いは難しいししょうがないね...。ここに関しては Parameter Store に切り出せると良いのかもしれないなぁと思ったりした。

基本的にはインスタンスの起動時に --restart オプションをつけたコンテナが起き上がるので、そのままIPアドレスとポート番号をminecraftの画面に入力すればよい。

まだマップデータのバックアップが実装されていなかったりインスタンスIDが固定なので誰も使うことができないなどあるのでちまちまやっていく。

とりあえずGWは何もなかった!ということにはならなかったのでよしとしよう。

この記事が気に入ったらサポートをしてみませんか?