Virtual MachinesでマイクラSpigot鯖ホストしてAzure Functinosで起動/停止制御をしたい
目的
マイクラ1.18がやりたいのでマルチ鯖をAzureで建てたい
前に建てたときはSpigotにMOD入れてやったのが便利だったので
それをやりつつ、Azure FunctionsにdiscordのSlash Command Interactionsを使用して
Discrodから仮想マシンの起動停止を制御したい
とりあえず参考になりそうな情報を貼っていくフェーズに突入です
Spigot鯖をubuntuで立てる
MS Tech Camp 6
たくのろじーさんのマイクラ鯖立てるやーつ
Discrod Slash COmmand + Azure Functionsの自分の記事
@azure/arm-compute
を使ってVMを起動
@azure/arm-compute
みたいな、ARM、つまりAzure Resource manager系のパッケージ、
テナントIDってやつ他色々なIDが必要らしく、これってどうやって取得するんだろうってなってます
と思ったらAzure Active Directoryに移動したらソッコー見つけた
なんか参考になりそうなので置いておく
とはいえ、サービスプリンシパルというものを作成して、
ここからClient IDやClientシークレットなる値を取得する必要がある
でも自分管理者にいない気がするけど、大丈夫かな
たくのろじーさんの本
なんか「azure virtula machine start azure functions」とかで検索すると
どうやらPowershell Coreを使うのが良いらしい
やっぱりARM系のAzure SDKを使うにはどうしてもService Principalを作らなきゃいけんらしくて
そこが怪しい
Powershell使いたくないなぁ
とりあえずUbuntu鯖を32GBメモリで作成
powershellからssh接続を試みたが、Permission are too open!!!と怒られてしまう
chmod 400を行えば良さげなんだけどpowershellにはchmodはない
なので以下のgistのコメントで対処したら接続できた
Virtual MachinesもAzure Storage Accountのファイル共有にマウントできるみたい
これができるとStorage Explorerからファイルを参照できるから助かるんだよな
本当にVMで行くべきかちょっと悩んでいる
もともとContainer Instancesでやっていたけど、コンテナの場合起動すればマイクラが遊べた
しかしVMの場合起動した後にわざわざSSHで接続して起動コマンドをたたかなくちゃいけない
ここでめんどくさいのはコマンドではなくssh接続で
.pemファイルが必要だしssh接続可能なクライアント(powershellとかPuTTYとか)が必要
毎回これしてからマイクラで遊ぶのめんどくさいな。。。
ここでContainer InstancesとVMの比較をしたい気がする
ACIはマイクラのコンテナがあればできるし、経験してるので安心
ただスペックをあまりいじりにくいのとスペックのわりにクレジットを食う
VMにすると料金は比較的安いイメージ
マイクラ鯖ならVMで建てる方が自然な感じもしなくもない
ただ起動がいちいちめんどくさい
起動がめんどくさい問題、
Ubuntu起動時にマイクラ鯖のコマンドを実行するスクリプトを組めばよいのではないかと思ったので
そこの調査をする
rc.local
なるファイルを編集するといいらしい
起動時にスクリプトを実行するのもありだけど、
なにやらVMのコマンドを外部から実行できる奴があるらしい
Azure CLIやPowershellから実行できるらしく、AzureFunctionsでもできるのではないか
つまり、
- VMを起動
- VMにRunShellScriptを実行
という処理をPowerShell on Azure Functionsで実装すれば良さげ
手元の環境でAzure CLIではコマンド実行に成功している
vmを起動するためにはこちらを使う
stopも同様
つまり、今欲しいのは
- File Shareにマウントされている
- spigotがインストールされている
そういうVMで
- VMの起動ができる
- VMにマイクラ鯖起動コマンドをたたける
PowershellのAzure Functionsと
- discord slash commandに対応した
TypeScriptのAzure Functions
Azure CLIでは
az vm start -g <resource group name> -n <resource name>
でVM起動ができる。stopのときにDNSの予約もしてくれている。おk
stopとdeallocateの違い
ホントはdeallocateしたいけどPublic IPなくなるのやだな
deallocateコマンド、つまりVMのプロビジョニングを切ったとしてもDNS名は変わらなさそう
それだったら喜んでdeallocateしませう
そしてなんとaz vm stop
では割り当てを保持するが
Stop-AzVMは割り当てを解除する、ここは注意ポイントな気がする
PowershellでVMの制御をする場合、
ManagedIDというものを設定しなくてはいけなかった
以前にやった作業ログ
ドンピシャな記事
実際の作業に入る。
まずはStorageAccountの作成
なんか詳細設定で階層構造名前空間を有効にする
続けてVMにStorageAccountのFileShareをマウントした
例ではWindows仮想マシンに対してマウントする方法らしい、
自分は間違ってローカルのWindowsでこれやったので、いきなりネットワークドライブが追加されてビビった(あほ
今回はUbuntuで鯖を立てるので
VMにsshで接続したのちファイル共有>接続のときにLinuxを選択する
これを実行すると、/mnt以下にマウントされる
今回は/mnt/minecraft
を作った。そしてssh上でsudo vim hello.txt
でテキストを編集してみた
そしたらAzure Storage Explorerで見てみると、いい感じにマウントされてた
次はポート開放
たくのろじさんの本を参考に
こちらを参考に1.18.1をインスト
しかし1.18.1のビルドツールにはJava17が必要とのこと
そしてBuildToolをJavaでビルドするときに、sudoつけないとpermissionがなかった
実行してたら30分後くらいにgit系のエラーが出て止まった、ツライ
mergeがどうたらこうたらというエラーが出た
そういえばgitとかインストールしてなかったけどいつの間にか使えるようになってたな
翌日鯖を立ち上げたら/mntの中にminecraftはなかった、つらい
もしかしたらプロビジョニングを解除したらマウントされていたネットワークドライブは切断される......?
でもプロビジョニング解除しないと課金されて辛いので解除します、
ってことでfile共有は使えません、ツライ
ということで~/minecraft
以下で昨日と同じことやったら爆速で鯖ができました、ええええ
マイクラDiscordプラグインのwikiがあったよ
ワールドのシード値はserver.propertiesで変えられるっポイ?
ここにVMの起動停止を制御するAzureFunctionsのコードを書いていく
Stop-AzVM、powershell上でユーザ入力を受け付けてしまうので、
-Forceオプション付けないとAzureFunctionsではエラーになる、知見だ
マイクラ鯖の作成には成功したが、
外部から調整しようとしたときにちょっとめんどくさいなって思ったので
前やったACIでやろうかなってなりました