こんにちは。スプラトゥーン3が9月に発売を迎えてはや3ヶ月弱が経ち、いよいよ新シーズンである Chill Season が幕を開けようとしています。
さて、私は以前以下のような記事を書きました。
AWS Lambdaを使ってスプラトゥーン2の戦績をstat.inkに定期保存できるようにした
この時はまだスプラトゥーン2でしたが、スプラトゥーン3でも同様に stat.ink で戦績を管理しています。また今回は以前からちょっと変わって Lambda ではなく Fargate を利用する様にしているので、その辺りを掘り下げていきます。
尚、スプラトゥーンや戦績管理の重要性、またその管理の手助けとなる stat.ink と言う外部サービスについては前回の記事をご参照下さい。
使用する主な技術やツール
s3s
スプラトゥーン2では splatnet2statink と言う Python 製のツールを使って、任天堂の API から直近の戦績を取得して stat.ink に送信していましたが、スプラトゥーン3からは s3s と言う、(仕組みはほぼ同じだが)全く新しいツールを使います。こちらも Python 製となっています。
コンテナ
今回のアプリは私が非公式にコンテナイメージをメンテしていますので、コンテナを使います。
なので準備が非常に簡単です。依存する pip パッケージやそれに必要なモジュールのインストール等はコンテナイメージ作成時に既に完了しているので、そのイメージを以下の Docker Hub から持ってくるだけですぐ使えます。
以下、 Docker Hub のリンクです:
https://hub.docker.com/r/isseim/s3s
AWS Fargate
https://aws.amazon.com/jp/fargate/
AWS が提供するサーバーレスのコンテナランタイムです。Lambda 同様自分でサーバーインスタンスを立てる必要がなく、コンテナを起動した時間に応じて課金されるので今回のニーズにはピッタリです。
(ただ Lambda でもコンテナは使えるので正直好きな方を使えばいいとは思います)
一応、アーキテクチャとしては、「実行するとまだ stat.ink に送っていない戦績を任天堂提供の API から取得し、 stat.ink に送信する」状態にしておいたタスク定義を用意し、それを EventBridge から定期実行します。図にするとこんな感じになります:
セットアップ
実はセットアップに必要な CFn のテンプレートを用意しています。今後リポジトリのコードベースに組み込もうと思っていますが、現状は BETA 的扱いなので Wiki に置いてあります。
https://github.com/issei-m/s3s-docker/wiki/AWS-Automation
こちらを使う前に、事前に以下の3つを用意する必要があります:
- 任天堂 API 及び stat.ink との連携に必要な s3s の設定ファイル
config.txt
- インターネットに接続可能な VPC サブネット
- 必要な通信に使うトラフィックを許可したセキュリティグループ
- 基本的には全ての egress トラフィックを許可したものを想定
特に1番目の
任天堂 API 及び stat.ink との連携に必要な s3s の設定ファイル
config.txt
これについては Docker Hub に書いてある通り、 s3s を初回で動す時は設定ファイルが無いので、設定ファイルを作る為に必要な情報を入力するプロンプトに従って情報を入力する事でコンテナ内部の /opt/s3s/config.txt
に出力されます。具体的には以下のコマンドを実行します:
docker run -it --rm --name s3s-for-config isseim/s3s -M
この状態で別のターミナルから docker cp
でファイルをローカルに持ってきます:
docker cp s3s-for-config:/opt/s3s/config.txt .
設定ファイルが取得できたら、最初のターミナルでは Ctrl-C を打ってコンテナを終了します。
config.txt を Parameter Store に保存する
ローカルに保存した config.txt を AWS Fargate で動かすコンテナに共有する必要があります。いくつか方法がありますが、 S3S_CONFIG
と言う環境変数で直接中身を渡す事ができるので、 AWS Systems Manager の Parameter Store に SecureString として保存をしておきます:
このパラメーターの ARN を控えておきます。今回は /s3s/config/main
と言う名前にしているので、 ARN は arn:aws:ssm:ap-northeast-1:************:parameter/s3s/config/main
の様な感じになります。
CFn 実行
先ほどの Wiki の YAML を automation_cfn_template.yaml
に保存し、以下を実行します:
aws cloudformation deploy \
--stack-name "s3s-automation" \
--capabilities CAPABILITY_NAMED_IAM \
--template-file ./automation_cfn_template.yaml \
--parameter-overrides \
ConfigSecretArn="<先ほど控えたパラメーターの ARN>" \
PublicSubnetId="<用意した VPC サブネットの ID>" \
SecurityGroupId="<用意したセキュリティグループの ID>"
この CFn は、以下の AWS リソースを作ります:
- ECS クラスタ (名前は
s3s-cluster
) - s3s の実行結果を出力する為の Log Group (名前は
/s3s
, リテンション期間は7日) isseim/s3s
を実行する TaskDefinitionS3S_CONFIG
に config.txt のパラメーターの内容がセットされる
- ↑の TaskDefinition でタスクを実行する権限を持つ IAM Role
- ↑の TaskDefinition を定期実行 (3時間に1回実行) する Event rule
実際に以下の様に3時間ごとに実行され、ログが溜まっていきます:
stat.ink にも連携されているのが分かります:
コンテナイメージのメンテについて
s3s の公式リポジトリでは以前から何回か公式リポジトリ内でイメージをメンテするかどうかの議論がされていましたが、作者の意向によりいずれも却下されています。
その代わりに (おそらく一番最初にコンテナイメージのメンテを始めた) 私の Docker Hub リポジトリが言及され、公式の Wiki に掲載される事になった為、これからもメンテしていく所存です。
とりあえず公式リポジトリの変更を自動で追える様に GitHub Action を作っている所です。
最後に
今後もスプラトゥーン3は盛り上がっていくと思います。皆さんも Chill Season では戦績管理を始めてみてはイカが?