スプラトゥーン2の戦績をstat.inkへ自動でアップロードする仕組みをつくった話【GCE】
きっかけ
任天堂公式アプリNintendoSwitchOnline(通称:NSO)では50件までしか表示されないんですよね。もっと遡って振り返りたい、そう思ったのがきっかけです。
程なくして調べた訳ですが、あるじゃないですか!集計できるサイト!アップロードできるツール!
ただ、都度自分でアップロードするのはとても面倒ですし、忘れそうです。そこで、アップロードを自動で実行する仕組みを考えました。具体的には、クラウド上に建てたCentOSを利用してsplatnet2statinkを指定の時間に実行できればなと。
閃いたのはいいですが、メリットが薄いと作業しようとは思えないので、メリットとデメリットを挙げてみます。
メリット
リザルトを50件以上保存できる
戦績を証明できる(誰でも見られる)
デメリット
導入作業が面倒
ストーカーにプレイ時間を把握される可能性がある
うーん、イーブンですね。しかし、GoogleCloudPlatformで指定の構成で建てられれば実質無料との情報が!
…作業します。
導入作業
登録
下記のリンクから登録します。
クレジットカードの登録が必要ですが、勝手に課金されることはないとのことですので安心です。
プロジェクトの作成
プロジェクトの選択→新しいプロジェクト→プロジェクト名を設定→作成
インスタンスの作成
Google Compute Engine→VMインスタンス→作成
マシンタイプ:e2-micro
リージョン:us-west1
ゾーン:us-west1-a
ブートディスク:CentOS 7 標準永続ディスク 30GB
上記は無料枠の条件ですが、変わる可能性があるので一応以下を確認してください。
SSH接続
SSHボタンを押します。
splatnet2statinkのインストール
下記をコピーして貼り付けてください。
# yumのupdate(kernelを除く)(とても時間が掛かります)
sudo yum -y update --exclude=kernel*
# 必要なパッケージのインストール
sudo yum -y install git python3
sudo pip3 install -r ./requirements.txt
# 作業フォルダをホームディレクトリに
cd
# splatnet2statinkのダウンロード
git clone https://github.com/frozenpandaman/splatnet2statink.git
# 作成されたディレクトリに移動し、スクリプトを実行
cd splatnet2statink
python3 ./splatnet2statink.py
splatnet2statinkの初期設定
python3 ./splatnet2statink.pyのコードがうまく動けば、色々尋ねてきます。以下要約です。
stat.ink からAPIキーをコピーして貼り付ける
「ja-JP」と打つ
表示されたURLをブラウザのアドレスバーにコピーして開く
ログインした後、「この人にする」 ボタンのリンクをコピーして貼り付ける
「0」を入力する
スクリプトを作成
バトルのリザルトとサーモンランのリザルトを両方取得した後に、インスタンスを閉じるように書きます。「5分も無駄に起動しておくなんて勿体無い」等という謎の省エネ魂を燃やして「sleep 5m」の記述を省略すると、メンテナンスできなくなります。気をつけて!!!(あかやすはコレでした)
vim ./splatnet2statink.sh
「i」を押した後、下記を貼り付けます。ユーザー名(akayas0707の部分)は各自のものに書き換えてください。
#!/bin/bash
# updateCheck_splatnet2statink
git --git-dir=/home/akayas0707/splatnet2statink/.git --work-tree=/home/akayas0707/splatnet2statink pull
sudo pip3 install -r /home/akayas0707/splatnet2statink/requirements.txt
# battleResult
python3 /home/akayas0707/splatnet2statink/splatnet2statink.py -r
wait
echo battleResult done.
# salmonrunResult
python3 /home/akayas0707/splatnet2statink/splatnet2statink.py --salmon -r
wait
echo salmonrunResult done.
# shutdown
sleep 5m
sudo shutdown -h now
貼り付けた後、「esc」を押してから「:wq!」と入力して保存します。
その後、スクリプトに権限を与えます。
sudo chmod 777 ./splatnet2statink.sh
起動時にスクリプトを実行する設定
先にsplatnet2statink.shの絶対パスを調べておきます。
readlink -f ./splatnet2statink.sh
スクリプトをサービスユニットとして登録して自動起動するようにします。
sudo vim /etc/systemd/system/autorun.service
「i」を押した後、下記を貼り付けてuserNameを書き換えます。
[Unit]
After=network.target
[Service]
User=root
ExecStart=ここにsplatnet2statink.shの絶対パスを記述
[Install]
WantedBy=multi-user.target
「esc」を押してから「:wq!」と入力で保存します。
自動起動を有効にします。
sudo systemctl enable autorun.service
シャットダウンの権限を付与
まずはユーザー名を調べます。
users
次にvisudoを編集します。慎重に作業してください。
sudo visudo
最終行に下記2行を追加します。userNameのところは確認した名前を入力してください。編集しないで戻りたい時は、「:q!」で保存せずにファイルを閉じる事ができます。
## SSH to Shutdown
userName ALL=NOPASSWD: /sbin/shutdown
ここまで上記がうまく行っていればSSH接続したウィンドウは閉じてOKです。
GCEのインスタンスを自動起動する設定
此処から先はGUIでの操作です。
GoogleCloud→ComputeEngine→VMインスタンスに戻りましょう。
インスタンススケジュールを開く
スケジュールを作成を押す
名前は任意、リージョンはインスタンスと同じ、CRON式を使用にチェック、開始時間を「45 * * * *」、終了時間を「10 * * * *」、タイムゾーンは日本標準時とする
左上「≡」をクリックしIAMと管理を開く
左カラムにあるロールを開く
ロールを作成をクリック
ロールのリリース段階を「一般提供」にする
権限の追加で「compute.instances.start」「compute.instances.stop」を追加し、作成をクリック
左カラムにあるIAMを開く
Google提供のロール付与を含みますにチェックを入れ、「@compute-system.iam.gserviceaccount.com」で検索をかける
✎(鉛筆マーク)をクリック
ロールを作成したカスタムロールにして保存をクリック
左上「≡」をクリックしComputeEngine→VMインスタンス→インスタンススケジュールに戻る
作成したインスタンスのスケジュール名を開く
スケジュールにインスタンスを追加をクリックし、インスタンスを追加する
躓いたら
自動起動がうまくいっていると、インスタンスが起動してから大体5分後にシャットダウンされる為、まずはシャットダウンをキャンセルするためにサービスを止めましょう。
#サービス停止
sudo systemctl stop autorun.service
#サービス再起動
sudo systemctl restart autorun.service
下記は問題解決の一例です。
#serviceのステータスを確認
systemctl status autorun.service -l
#splatnet2statink.shの絶対パスを参照
readlink -f splatnet2statink.sh
Q&A
Q. 1時間に1回は過剰!2時間に1回更新の設定がしたい!
A. 作成したインスタンススケジュールは編集できないため、再度作成します。起動時間のところを「0 */2 * * *」とすれば「0:00, 2:00, 4:00,…22:00」となります。奇数時間で指定する場合は「0 1-23/2 * * *」で「1:00, 3:00, 5:00,…23:00」となります。起動時間に合わせて終了時間も設定してください。
Q. アップロードされているか不安。確認する方法は?
A. 一番確実なのは実際にサモランなりナワバリなりをして設定した時間まで待ってstat.inkにアップロードされているかを確認する方法です。もしアップロードされていなかったら、次はVMインスタンスを疑います。オブザーバ日リティを確認すれば起動しているかどうかは判断できます。動いていたら、次はサービスを疑います。…と、このように外堀から詰めていくと原因究明が楽になるのでおすすめです。
あとがき
実はGCPを利用したのが初めてでした。あかやすも調べながらの作業でしたので拙い部分あるかと思います。
それにしても、自動化に気が付いたのがかなり遅くなってしまった…スプラトゥーン3ではもっと早い段階から仕組みづくりをしようかと思います。