7 days to die サーバをAWSのスポットインスタンスで建てた話

知り合いと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 開ける
  • steamcmd インストール
    • https://github.com/rupertbg/aws-7days-server/blob/master/instance.yml
  • 7d2d server インストール
    • https://github.com/rupertbg/aws-7days-server/blob/master/instance.yml
    • サーバの設定 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使ってる
    • 終了/起動テスト
    • 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)
          
          
        • 動作確認

使ってないときは自動で落ちるようにしたい

要件

・ゲーム内に誰もいないときは経費削減のためサーバごと停止したい

実装方法

・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)

› No comments yet.

コメントを残す

Allowed Tags - You may use these HTML tags and attributes in your comment.

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Pingbacks (0)

› No pingbacks yet.