本記事は、Simutrans Advent Calender 2020 の記事として執筆しました。



序論

AWS(amazon web service)は、米国通販大手Amazon社が提供するクラウドサービスである。このサービスは、可用性の高いITインフラを短納期で柔軟に提供することから、多くのWEBサービスで活用されている。
本記事では、aws上の仮想サーバにNetSimutransサーバを構築し、メンテナンスフリーのNS主催の実現を模索するものである。


背景
休日総研は、NetSimutransの鯖主になり、自作アドオンの広報活動の展開を試みた。
しかし、自宅ノートPCを鯖機として提供するためには、以下のような課題があった。

・自宅PCのリソースを食う
・自室でのPCの夜間騒音
・長時間稼働による火災のリスク
・セキュリティ対策

これらの課題を解消するために、クラウドサービスのサーバをレンタルすることとし、
10月から12月にかけて、JHNSという自前NSを開催し、awsでのNS鯖構築のテストを行った。

サービス選定
筆者はサービス選定において、以下の要件を挙げた

・ノウハウがあること
・リソース設定が柔軟であること
・安価であること(社会人レベルで)

筆者は基盤SEとしてAWSの業務経験があり、
AWS上にサーバを構築することとした。

競合サービスのAzureは費用が高いため却下し、
レンタルサーバのサービスは、リソース変更が自由に行えないため却下した。



上記より、AWSサーバを使用したPoCを行い、
NSの状況によって変動する負荷に合わせて適切なインスタンスの規模を検討することとした。


設計

awsリソースの構成図を作成する。
設計で重視するのは、使用するリソースの数をおさえて費用を予測することと、ネットワークセキュリティの妥当性を検証することである。

draw.ioというソフトで、awsが提供するシンプルアイコンが利用可能である。PowerPointで行うより取扱いが容易であるため、こちらの活用を推奨する。

構成要素について、ある程度の説明をする。

kousei


VPC (Vertual Private Cloud)
クラウド内のネットワークである。閉域で、インターネットに公開されない。

Availability Zone
東京リージョン内に点在するデータセンター群を束ねたもの。
サーバを2台構築するとき、AZ-aとAZ-cにそれぞれサーバを分散配置すると、
AZ-aに属するデータセンターが爆発しても、AZ-cは無事なので縮退運転ができる。

Internet Gateway
通称IGW。閉域のVPCに入るための入り口をVPCに関連付ける。
クライアントはここからVPC内に入る。

Elastic IP
AWS内のサーバは再起動するごとにIPアドレスが変動するため、外からアクセスする用のIPアドレスを設定する。
ElasticIPは仮想サーバに割り当てられ、再起動でIPアドレスが変わってもそっちを指してくれる。
クライアントはサーバのIPアドレスを意識せず、EIPを入力することでNSに繋がる。

Network ACL
アクセスコントロールリスト。
VPCとVPCのアクセス制御を行う。
が、今回は使用せず、すべての通信を許可する。

Security Group
リソースごとのアクセスコントロールを決める。
つまり、仮想サーバに接続できるIP、ポート、プロトコルを設定できる。
外部→鯖へのインバウンド通信は
NSで使うポートのみ許可、
あとは自宅IPアドレスからの全通信を許可している。
鯖→外部へのアウトバウンド通信は全て開放している。


EC2(Elastic Compute Cloud)
仮想サーバである。
用途に合わせた特性・キャパシティを持つインスタンスが提供され、それを選択して利用することで、簡単にサーバを立てることができる。



EC2スペックの選定
スケールアップ・ダウンが自在なため、少量で起動しスペックが不足する場合にリソースを拡張することもできる。
費用は月額で借り切るものと秒単位での従量課金がある。今回はサーバのスペック変更を頻繁に行うことが予想されたため、従量課金方式を採用した。

費用の見積もりには、AWSが提供する計算ツールを使用することが出来るが、
「ざっくりaws」を使用した。


インスタンスはコンピューティング最適化インスタンス「t3.medium」を選択した。
これはNet Simutransの実行に十分な小さいスペックのインスタンスを選択するためである。
ノートPC程度の性能を出すため、vCPUを強化した。
(これは設計ミスで、NSマシンの選定においてはメモリを重視すべきである。)
このインスタンスサイズは、サーバの停止中であれば自由に変更可能である。
NSの規模によって適宜調整することで、最適なコストで運用することが可能だ。

※t型インスタンスのキャパシティ選定の注意点
t型インスタンスはバースト型と呼ばれ、通常CPU負荷の小さい動作を想定している。
CPUクレジットというCPUの利用権のような概念が存在する。
CPUの使用率がキャパシティ毎に設定された閾値を下回るとクレジットがもらえ、閾値を超過する高負荷時には消費される。
t3.mediumは20%が閾値で、サーバ起動時など一時的な高負荷時にはCPUクレジットを消化して対応する。
つまり、常時CPU負荷が30%を超過するような使用法をすると、CPUクレジットが枯渇して機能不全を起こす。
例えばこれより安価なt2.microは閾値が10%なため、Simutransを起動するとあっという間にリソースが枯渇してしまう。t3、また最新のt4インスタンスを使用する際はCPU使用率をCloudWatchで監視し、
最適なリソースを確保することが必要だ。




構築


Pakset作成

pak128.EDOに自作アドオン放り込んで、
あとWikiで公開されているsimuconfを突っ込んで完成。
リモートデスクトップで移しておく。


運用保守

サーバが止まったのかクライアント環境トラブルなのかを切り分けるために、ゲーム停止後に自動復旧するbatを作成した。以下にBatの例を示す。



ユーザの実行対象はsim_wait.batである。コードの例を以下に示す。
:LOOP

call ".\sim.bat"
echo %DATE% %TIME%

py "C:\alertdiscord.py"
GOTO LOOP
実行機能となる、sim.batの構成は以下のとおりである。
エラー終了するとsim.batが落ち、sim_wait.batがエラーを発砲して次のループする。
"C:\JHNS\sim-WinGDI64-OTRPv27_2.exe" -server -fps 60

exit /b

また、下記サイトの記載を参考に、
Sendkeyを利用して、エスケープキーをクリックするbatを配置し、実行した。


sendkey.bat
:LOOP

"sendkeys\SendKeys.exe" Simutrans [ESC]

TIMEOUT /T 3600 /NOBREAK

GOTO LOOP 

また、インフラ系ITシステムにおいて、顧客が提供者より先に障害に気付くのは問題である。
JHNSは、クライアントより先に鯖落ちを検知することを目的に、
障害発生をJHNS用Discordへ通報するpythonスクリプトを作成した。

DiscordのWebhook機能を使用して、Simutrans本体が落ちた場合、
通報する仕組みとした。
なお、Pythonの実行環境は作業端末からコピーして鯖機に入れる必要がある。

alertdiscord.pyを以下に示す。
import requests

discord_webhook_url = 'https://discordapp.com/api/webhooks/****************'

data = {"content": "テスト・JHNSで障害が発生しました。サーバを復旧します"}
requests.post(discord_webhook_url, data=data)

下記にメッセージを示す。
alert_disco

運用していると気づかないので、鯖主にメンションを飛ばしたほうが良い。

Simutrans.exeを初回起動するとき、Windowsファイアウォールの警告が出るが、
ここで通信を許可する必要があり、これは本体のVUPのたびに必要となる。
ネットワークが理論上繋がっていてもNSにアクセスできない場合、
これが悪さをしていることを疑ってみるとよい。


費用
アカウント作成から1年以内のため、割引が一部適用されたが、
11月の1か月のNSの運営に要したトータルの費用は33.98USD(12月14日現在、3526円)であった。


課題と展望

NSの再起動について、
ahakuoku氏作成の「らくらくNS」の提供を受け、仕様理解を進めていたが、
現状のJHNSでは、自製のbatでやりくりしていた。
高機能なプロダクトを流用する方が構築工数を節約できるため、
今後は作りこみを排したサーバ構築を研究したい。

鯖主になるためには、設定や構築の技術的ハードルのみならず、

だれが機材を提供するかの調整、自宅回線がNSに向かないなど、
環境的なハードルを排すことが必要である。
またOA用PCをゲームサーバとして公開するため、
セキュリティの対策も必要となる。

本手法で1か月程度の短期のNS運営を身内で行う場合、
参加者などから3600円かき集めてくれば、
下記に示すような煩雑な操作は全て不要になる。

NS専用機材
自宅ネットワークの強化
自宅PCの設定変更・長時間稼働
自宅PCのセキュリティ対応

将来的には、インスタンスのイメージを利用した、
高速かつ柔軟なNSの展開を目指したい。

以上