MinIRはどのように作られたか

はじめに

beatorajaの認知度が高まっていくに連れて、IRがない という声を多く目にするようになりました。
正確に言えばIRがないというのは誤りで、Chroma IRが存在していましたが、広く公開されているIRではありませんでした。

というわけで、「ないなら作ればいい」のノリで作成したのが現在稼働中のMinIRです。
本記事では、このMinIRがどのようにして作られたかを解説します。


やることはそんなに多くない

さて、そもそもIRはどのような仕組みなのでしょうか。

やることは「データを送り、保存する」「データを取得し、表示する」の2つです。

必要なのは

  • IRのデータの受け口
  • IRのデータを保存するための場所
  • IRデータの送信機構
  • IRデータの表示機構

の4つです。
そんなに多くありません。


必要なものを具体的に

必要な「機能」を抽出したところで、具体的に何が必要かを考えていきます。

IRのデータの受け口

データを受け取る「サーバー」が必要です。

IRのデータを保存するための場所

保存箇所である「データベース」が必要です。

IRデータの送信機構

同じく、データ取得命令を処理する「サーバー」が必要です。

IRデータの表示機構

表示用に「Webページ」が必要です。

こうしてみると、レンタルサーバを借りて、内部にデータベースとWebページ機構を組み込めば良さそうですが…


サーバーレスという選択 - Amazon Web Service

レンタルサーバを借りてどうこうするのは、意外と管理・維持が面倒です。
死活監視やリソース監視、パッチの適用など、サーバーを正常に動作させ続けるためにさまざまな作業が必要です。

そのため、MinIRでは、「サーバーレスアーキテクチャ」を採用しています。

サーバーレスアーキテクチャ

サーバを自前で用意せず、サーバーを持つ事業者が提供するサービスを活用してシステムを構築します。

MinIRでは「サーバーを持つ事業者」はAmazon、「サーバーを持つ事業者が提供するサービス」はAmazon Web Serviceです。

Amazon Web Service (AWS)

アマゾン ウェブ サービスでは、コンピューティング、ストレージ、データベース、分析、ネットワーキング、モバイル、開発者用ツール、管理ツール、IoT、セキュリティ、エンタープライズアプリケーションなど、グローバルなクラウドベース製品を幅広く利用できます。これらのサービスを使用すると、企業や組織はより迅速かつ低い IT コストでスケールすることができます。AWS は最大規模の企業と注目を集めている新興企業から信頼されており、ウェブアプリケーション、モバイルアプリケーション、ゲーム開発、データ処理、データウェアハウス、ストレージ、アーカイブなど多様なワークロードを支援しています。

製品ページより引用 (https://aws.amazon.com/jp/products/)

簡単言えば いろんなサービスがあるから、それらをうまく組み合わせて活用してね! でしょうか。
実際、その通りなので、MinIRで利用しているサービスを解説します。


MinIRで利用するAWSサービス

MinIRで利用するサービスは主に下記の3つです。

  • AWS Lambda (lambda)
  • Amazon DynamoDB (DynamoDB)
  • Amazon Cognito (Cognito)

AWS Lambda

(「ラムダ」って読みます)
イベントに対してコードを実行するサービスです。
「データを受け取る」「データ要求に対して送信する」の2つの役割に対してこのサービスを使います。

具体的には

  • データを受け取る
    • 受け取ったスコア・譜面データをDynamoDBに保存する
  • データ要求に対して送信する
    • 要求に沿う形でスコア・譜面データをDynamoDBから取得し、返却する

を行います。

コードはNode.jsJavaC#GoPythonが選択できますが、MinIRではNode.jsを採用しています。 (Node.jsの説明はこの辺とかかな?)

ひと月あたり

  • 1,000,000回(100万回)の呼び出し
  • メモリを400,000GB(40万GB)秒利用する
    • 例1:256MBの処理を4秒で1GB秒
    • 例2:1GBの処理を0.5秒で0.5GB秒

を満たすまでは無料です。

(AWS Lambda 料金)

Amazon DynamoDB

(「ダイナモDB」って読みます)
データベースサービスですが、一般的なリレーショナルデータベース (RDB)ではありません。
NoSQL データベース (NoSQL)と呼ばれる非リレーショナルデータベースです。

NoSQL データベースとは一意キーの単純な組み合わせを格納したデータベースです。
以下は簡単な例です。

一意キー
ユーザーID + 譜面IDスコア、記録日時 …
譜面IDタイトル、BPM、総ノーツ数 …
ユーザーIDbio、ライバル情報 …

※MinIRが上記の例の通りに作られているわけではありません

キーと値のペアのため、RDBとは違ったメリット、デメリットが存在します。

RDBNoSQL
データ参照複数の表と関係性を持ち、SQLを用いて、高度な条件でのデータを取得できる他のデータとの関係性がないため、複雑な参照には不向き
トランザクションデータの不整合は起こらない結果整合性を持つ(即座にデータの変更が反映されるとは限らない)
処理速度強固なトランザクション処理を行うため、それほど速くはない大量のデータを扱うサービスで参照や追加処理が主な処理である場合、高速

上記だけ見ると、IRのようなデータ保存・更新サービスではNoSQLは不向きなのでは?と思われると思います。
その通りです。
ユーザー・スコア・譜面 など、リレーショナルなデータ参照があるのでRDBのほうが向いているのですが…。

残念ながら、RDBは無料で運用できません。

AWSにもAmazon Relational Database Service (RDS)というサービスがありますが、無料で利用することはできません。
Amazon以外のサービスも同様です。

DynamoDBは料金体系が複雑ですが、IRのような単純なWebサービス構築ならば無料で運用できるはずです。

  • 25 GB の保管は無料
  • 読み込み/書き込み容量が少なければ無料

(Amazon DynamoDB 料金)

MinIRでは前述したlambdaと連携して、データの書き込み、読み込みを行います。

Amazon Cognito

(「コグニト」って読みます)
ユーザー認証や情報を取り扱うサービスです。

  • パスワードや個人情報の管理
  • (自前でやろうとすると大変な)2段階認証
  • 自前の認証サービス

と、ユーザー管理・運用に最低限必要なのが揃ってます。めっちゃ楽です。
(やろうと思えばtwitterでのログインも実装できますが、MinIRでは採用してません。)

同じく、lambdaと連携して、ログイン処理、ユーザーデータの追加・取得を行います。

ひと月あたり5万ユーザーまでは無料です。
(AWS Cognito 料金)


サービスを組み合わせる

上記で紹介したAWSサービスを組み合わせるとこんな感じになります

  • ログイン処理
    1. lambdaにログイン情報送信
    2. lambdaからCognitoに情報問い合せ
    3. Cognitoからlambdaに結果返却
    4. lambdaから結果返却
  • スコア送信処理
    1. lambdaにスコア情報送信
    2. lambdaからDynamoDBに書き込み
    3. (必要なら)lambdaから処理結果を返却

なんとかうまくいきそうです。
残りは保存されたスコアを表示するIRページの作成です。


Webページも無料で作る -Github Pages-

GitHub Pages とは、GitHubによる、静的サイトのホスティングサービスです。
GitHubのアカウントがあればすぐに公開できるので、非常に手軽です。

  • 静的サイト (HTML や CSS, 画像など) を公開できます
  • JavaScriptが動作します
  • 独自ドメインOK
  • 無料

htmlをうまーく配置すれば、それだけでサイトが公開できます。
データの取得(lambdaの呼び出し)にはjavascriptを用います。

サイトのソースコードはこちらです。
静的サイトなので、基本全公開です。

MinIRのデザインにはMaterial Design Lite、テンプレートエンジンにはReactを利用しています。
(詳細情報は各公式ページへ。)

というわけで、スコアビューワーもできました。


まとめ(システム全体像)

こんな感じになりました。
基本的にはlambdaを経由して、データの流れを作ります。


おわりに

というわけで、このような流れがあってMinIRは作られました。
無料でクラウドサービスを利用でき、サービス開発ができるなんていい時代だぁ…
AWS便利だからみんな使おうね!
IRを新しく作るのもいいぞ。