リモート開発メインのソフトウェア開発企業のエンジニアブログです

AWS Fargate を使ってスプラトゥーン3の戦績を stat.ink に定期保存できるようにした

こんにちは。スプラトゥーン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 から定期実行します。図にするとこんな感じになります:

雑な図
Moba Pro

セットアップ

実はセットアップに必要な 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
config.txt をコンテナ内部で作る様子

この状態で別のターミナルから 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 として保存をしておきます:

Parameter Store に config.txt の中身をそのまま格納している

このパラメーターの 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 を実行する TaskDefinition
    • S3S_CONFIG に config.txt のパラメーターの内容がセットされる
  • ↑の TaskDefinition でタスクを実行する権限を持つ IAM Role
  • ↑の TaskDefinition を定期実行 (3時間に1回実行) する Event rule
作られたリソース達

実際に以下の様に3時間ごとに実行され、ログが溜まっていきます:

Log Group に実行の記録が残る

stat.ink にも連携されているのが分かります:

stat.ink の戦績一覧

コンテナイメージのメンテについて

s3s の公式リポジトリでは以前から何回か公式リポジトリ内でイメージをメンテするかどうかの議論がされていましたが、作者の意向によりいずれも却下されています。

その代わりに (おそらく一番最初にコンテナイメージのメンテを始めた) 私の Docker Hub リポジトリが言及され、公式の Wiki に掲載される事になった為、これからもメンテしていく所存です。

とりあえず公式リポジトリの変更を自動で追える様に GitHub Action を作っている所です。

最後に

今後もスプラトゥーン3は盛り上がっていくと思います。皆さんも Chill Season では戦績管理を始めてみてはイカが?

← 前の投稿

Test React Custom Hooks with Jest and Testing Library

次の投稿 →

Google Pixel Watch でHello Worldを表示してみた

コメントを残す