知り合いと3人でいまさら 7 days to die を始めたら、ゾンビ+マイクラという感じでわりとおもろかったので、共有サーバがあればいいのにねということになり、職能を生かして検討していくお話。
ざっくりとした要件
- 7 days to die サーバを決まった数人で共有して使えるようにする
- AWSてなに?というレベルの人もいるので起動は簡単にしたい
- 使ってないときは自動で落ちるようにしたい
まなんとかなるんじゃない?
わいのスペック
- ネットワークエンジニア
- AWSアカウントは持ってる
- AWS solution architect 持ってる(が失効寸前)が、年に1回くらいしかさわらない
- スポットインスタンスを使ったことはない
- Linuxサーバは立てれるがそんなにしょっちゅうはさわらない
- でもサーバでやりたいことはググればだいたいできるはずと思ってる、くらいのレベル
- スプラ2のサーモンランの結果データをニンテンドーのサーバにAPIたたいて定期的に取りにいってそのデータを見える化、くらいのことはできる
- ただし人のscriptパクりながら実装できるレベル(一からつくるのはちときびしい)
ホントになんとかなるんか?
7 days to die サーバを決まった数人で共有して使えるようにする
要件
- あそべる時間帯がまちまちなので、遊べるときにいつでも使えるようにしたい。
- とはいえ常時稼働はもったいない
- 現在3人なので、最大で3-4人でつかえればよい。
実現方法
AWSのEC2でスポットインスタンス使う
- あまったPC使って自宅稼働でもいいけど電気代と熱がね、、
- サーバ建てるならいまどきクラウドが簡単よね
- スポットインスタンスで経費削減できるはず
- 本来費用の7-8割で使える。
- 全体の需要次第では停止させられるリスクはあるが、ゲームできなくなるだけなのでそんなに困らない。そんときゃエペやればいい。
- 後述の文献によると、スペックは c3.xlarge くらいでよさそう?
参考文献
- スポットインスタンス
- https://qiita.com/tonishy/items/fc226da30f6dbb845077
- 7d2dサーバ
- https://developer.valvesoftware.com/wiki/7_Days_to_Die_Dedicated_Server#Installation
- https://7daystodie.fandom.com/wiki/Linux_Server_with_Amazon_Linux_AMI
- https://github.com/rupertbg/aws-7days-server/blob/master/instance.yml
- https://qiita.com/3x10ce/items/7a6ba480b4b901b93e0d
やったことメモ
記憶が頼りなので多少たりないかも。
- スポットインスタンス建てる
- Game用のEBSを30GBで別diskで追加
- 万が一消えてもこれをattachすれば復旧容易なはず
- 参考にした link の記事ではスポットインスタンス停止すると消えてしまうとあるが、現在は永続にすれば停止してもdiskが消えることはなさげ。ラッキー。
- セキュリティグループのポート 26000-26003 開ける
- Game用のEBSを30GBで別diskで追加
- steamcmd インストール
- https://7daystodie.fandom.com/wiki/Linux_Server_with_Amazon_Linux_AMI
- 7d2d server インストール
- https://7daystodie.fandom.com/wiki/Linux_Server_with_Amazon_Linux_AMI
- サーバの設定 serverconfig.xml
- 起動、接続テスト
- デーモン化
- init に配置では動かず。。。
- 最近のLinuxだと Amazon Linux 2 だと systemd がよさそう?
- /etc/systemd/system/7d2dserver.service
- Restart = always
Type = simple
- 終了/起動テスト
- S3へのバックアップ実装
- https://qiita.com/3x10ce/items/7a6ba480b4b901b93e0d
- systemdの設定でつまづいた。
- 参考文献
- https://enakai00.hatenablog.com/entry/20130917/1379374797
- https://book-reviews.blog/systemd_error/
- https://qiita.com/comwing65/items/3386a061aeb3d2f81b81
- 常駐するタイプのものじゃないのでoneshot、でも終了は検知したいのでRemainAfterExit、になる?
- /etc/systemd/system/7d2dsavedata2S3.service
-
[Service] ExecStart = /etc/rc.d/init.d/svr_startstop start Type = oneshot ExecStop = /etc/rc.d/init.d/svr_startstop stop RestartSec = 10 RemainAfterExit = yes
-
- ※init.dにscript配置する想定だったので、そのままのpath使ってる
- /etc/systemd/system/7d2dsavedata2S3.service
- 参考文献
- 終了/起動テスト
- AMIイメージ作成
起動スイッチ実装
要件
- AWSてなに?というレベルの人もいるので起動は簡単にしたい
- Disocdeでボイチャしてるのでこれ使えたらいいね
実現方法
- Discode bot 経由でon/off実装する
参考文献
Discode Bot
- https://qiita.com/1ntegrale9/items/cb285053f2fa5d0cccdf
- https://qiita.com/1ntegrale9/items/aa4b373e8895273875a8
サーバ起動連携
- https://inframenma.com/minecraft-ec2-updown-discordbot/
- https://qiita.com/uni_ezobafun/items/616edc2f41801d8594a3
やったことメモ
- Discode Bot作成
- Tokenをメモ
- Discodeサーバへbotをjoinさせる
- Githubアカウント作成
- Githubでhttps://github.com/DiscordBotPortalJP/discordpy-startupのrepogitoryからprivateでcreate
- Herokuアカウント作成
- Configureから DISCORD_BOT_TOKEN の変数を設定
- Deploy→Repository nameで検索→Connect
- AutoDeploy有効にしdeploy branch
- Dynosのスライドを右に
- Discodeのオープンchatから動作確認 → bot完成
- Lambda 実装
- 起動 Lambda サーバ起動/停止script
- https://qiita.com/uni_ezobafun/items/616edc2f41801d8594a3
- script作成 ec2-up ec2-down
- API GW作成
- API から停止/起動テスト
- Bot側変更
- httpクエリ周りで若干はまる
- https://discordpy.readthedocs.io/ja/latest/faq.html#how-do-i-make-a-web-request
- https://aiohttp-hands-on.readthedocs.io/ja/latest/aiohttp_client.html
- https://www.twilio.com/blog/asynchronous-http-requests-in-python-with-aiohttp-jp
-
async def up7d(ctx): async with aiohttp.ClientSession() as session: async with session.get(EC2_up) as r: js = await r.json() await ctx.send(js)
- 動作確認
- httpクエリ周りで若干はまる
- 起動 Lambda サーバ起動/停止script
使ってないときは自動で落ちるようにしたい
要件
・ゲーム内に誰もいないときは経費削減のためサーバごと停止したい
実装方法
・7d2d telnet console から でユーザlist取得して誰もいなければサーバ落とす
参考文献
- https://github.com/rupertbg/aws-7days-server/blob/master/instance.yml
やったことメモ
参考つうか上記Github内で使ってるscript丸パクリしました。
- serverconfig.xml localからのtelnetだけを有効化
- expectはいってなかったのでyum install expect
- /opt/games/7days/listplayers.sh
-
#!/usr/bin/expect set timeout 20 spawn telnet localhost 8081 expect -re "Please enter password:" send "${ServerPassword}\r" expect -re "end session." send "listplayers\r" expect -re "in the game" send "exit\r"
-
- /etc/cron.hourly/idleshutdown.sh
-
#!/bin/bash output=$(/opt/games/7days/listplayers.sh); number=$(echo "$output" | grep "in the game" | grep -Eo "[0-9]{1,4}"); if [ "$number" -eq "0" ]; then shutdown -h now;
-
- 毎時01分にscriptが走りサーバが停止することを確認
総括
これを調べるところも含めて正味12hくらいで作れたのは、我ながらまあまあえらいので、ネットワークとかサーバのお仕事しててよかったと思いました。
Comments (0)