
マイケル
みなさんこんにちは!
マイケルです!

エレキベア
こんにちクマ〜〜〜

マイケル
これまで制作したいくつかのアプリについて、ニフクラ mobile backend (NCMB) というサービスを使用してランキング処理を実装していたのですが、2024/4よりサービスが終了してしまいました。
ニフクラ mobile backend - サービス提供終了のご案内

▲NCMBを使用したランキング処理 (ゴーゴーゴロヤン)

▲NCMBを使用したランキング処理 (エレキシューティング)

エレキベア
長らくお世話になったクマ・・・
おつかれさまクマ・・・

マイケル
そういうわけで移行先をどうしようかとしばらく悩んでいたのですが、
ここらでサーバも一台持っておくかと踏み切り、簡易的な自作のランキングAPIを作成することにしました。
実際に作成したAPIと実行サンプルは下記になります。

▲ランキング処理のサンプル
GitHub - unity-go-ranking-sample

エレキベア
APIも自分で作るとはまた思い切ったクマね

マイケル
サーバ台はかかるけどドメインを設定しておけばアプリ側の対応が不要になるし
このブログのコメント機能など他にもサーバを使用したい用途があったのが決め手ですね・・・

エレキベア
まあ確かに一台持っておくと便利そうクマ

マイケル
サーバに関しては今回は VPS を使用することにして、XServer VPSの2GBプランを契約しました!
API実装の他、こちらのデプロイ方法についても軽く記載しておきますので、同様にサーバを立てたい方は参考にしてください!

エレキベア
値段もそこまで高くないクマし、
固定料金な分、AWSとかと比べて個人開発で使いやすそうクマね
GoでのランキングAPI実装

マイケル
まずはGoで実装したランキングAPIの内容について紹介します。
こちらはリポジトリの下記フォルダに格納してあります。
GitHub - unity-go-ranking-sample / go-ranking-api

エレキベア
Goは前の記事でも軽く触ったクマね

【Go言語】Gin、GORMでシンプルなREST APIを作成する【CRUD】
2024-03-26

マイケル
今回のAPIも上記のコードをベースに作成しています。
GoでのAPI作成の基礎知識について知りたい方は上記記事もご参照ください!
API設計

マイケル
まずテーブル定義、API定義に関しては下記のように設定しました。
立ち上げるサーバを最低限で済ませられるよう、アプリIDを渡すことで複数アプリで使用できるようにしています。
テーブル定義
mst_apps(アプリ情報マスタ)
Id | Name | ClientKey |
---|---|---|
アプリID | アプリ名 | クライアントキー |
integer | string | string |
scores(ランキングスコアテーブル)
Id | AppId | Type | Name | Score |
---|---|---|---|---|
スコアID | アプリID | スコア種類 | プレイヤー名 | スコア |
integer | integer | integer | string | integer |
API定義
URL | Method | Description | Requests |
---|---|---|---|
ranking/scores | GET | ランキング情報取得 | app_id: アプリID type: スコア種別 limit_count: 取得最大数 order_desc: 値降順で取得するか? |
ranking/scores | POST | ランキング情報登録 | ※mst_appsのテーブル定義と同様 |

エレキベア
最低限の構成って感じクマね
scoresテーブルにゲーム内のスコアを登録するクマね
実装内容

マイケル
次に実装内容について見ていきます。
ルーティング処理

マイケル
先ほど載せたルーティングについては、controllerに定義してあります。
リクエストパラメータを受け取った後にDBアクセスする流れで、そちらはrepositoryの方に記述してあります。
▲ルーティング定義
▲DB操作処理

エレキベア
SQL実行くらいで難しいことは特にしていないクマね
Basic認証処理

マイケル
そして認証方式については、今回はBasic認証を使用しています。
簡易的なAPIなのでこの方式を採用しましたが、重大なデータを扱う場合にはよりセキュリティ強度の高い方式を選択したほうがいいかもしれません・・・
また、Basic認証は通信盗聴の恐れがあるので、最低限HTTPSでの通信は必須にしましょう。

エレキベア
Basic認証はユーザID、パスワードの組み合わせを
リクエスト時に付与することで認証する方式だったクマね

マイケル
今回はアプリ側にユーザ作成は行わないため、代わりにアプリIDとそれに対するトークンをセットにして送信しています。
Ginの機能でBasic認証を設定し、ルーティングに紐づけたRouteGroup単位で設定するようにしました。
▲ランキング処理のRouteGroup返却
▲GinでのBasic認証登録

エレキベア
gin.BasicAuthで設定しているクマね

マイケル
アプリに紐づくトークン情報はmst_appsに設定しているため、repository内で取得して返却しています。
今回はIDの番号によってランキング対象のアプリかどうかを判断するようにしました。
▲mst_appからのクライアントキー取得
▲アプリ情報との整合性チェック

エレキベア
これで簡易的な認証の実装も完了クマね
Unity側での実装

マイケル
ランキングAPIをUnityで実行するサンプルについても作成しました。
こちらは以前作成したUnityWebRequestのサンプルをベースに修正したものになります。

▲ランキング処理のサンプル
GitHub - unity-go-ranking-sample / unity-ranking-project
▲リポジトリ

【Unity】UnityWebRequestを使ってCRUD機能を実装する【Ruby on Rails】
2021-12-12

マイケル
ランキングAPI実行処理は主にRankingApiSettings、RankingApiServiceになります。
特に特殊なことはしておらず、UnityWebRequestで作成したAPIを叩いているだけです。
▲ランキング処理設定クラス
▲ランキング処理サービスインターフェイス
▲ランキング処理サービスクラス

エレキベア
アプリID、トークンを設定した設定ファイルをサービスに渡して実行するクマね
一般的なAPIリクエストクマ〜〜

マイケル
これでAPIとの繋ぎ込みまで確認することができました。
XServerVPSへのデプロイ

マイケル
最後におまけにはなりますが、作成したAPIをVPSで起動するまでの手順についても紹介します。
VPS構成

マイケル
今回、VPSは下記構成のものを契約しました。
XServerはスケールアップ・ダウンが可能なため、もしスペックが足りなくなったら拡充する戦法です。
種類 | 概要 |
---|---|
VPS | XServer VPS |
CPU | 3Core |
メモリ | 2GB |
SSD | 50GB |
イメージタイプ | Ubuntu 22.04 |

エレキベア
費用も最低限に抑えたいクマからね〜〜
Docker環境構築

マイケル
Docker環境の構築についてですが、イメージタイプはUbuntuを使用しているため
一般的なUbuntuのDocker環境構築手順と同様の手順になります。
Docker - Install using the apt repository
▲Docker環境のインストール
▲Gitのインストール

エレキベア
Ubuntu上にDockerを導入してリポジトリをクローンする流れクマね
ドメイン設定

マイケル
次にドメインの設定についてです。
こちらはVPSのサーバ名を直接指定してもよいですが、今後の移行のしやすさも考えて独自ドメインを取得・設定しておくことにしました。

エレキベア
アプリから呼び出すとなると再提出も面倒クマからね・・・
ドメインサービス側の設定

マイケル
まずはドメインの取得とVPSとの紐付けについてです。
今回は お名前com で取得したので、下記のようにドメイン側のネームサーバ設定にVPS指定のものを設定します。

▲VPSのネームサーバを設定

エレキベア
ドメインサーバ側で認識するための設定クマね
VPS側の設定

マイケル
次にVPS側で独自ドメインの追加を行います。
デフォルトで設定されるNSレコードの他、Aレコード、CNAMEレコードを設定します。
ホスト名 | 種別 | 内容 |
---|---|---|
[独自ドメイン] | A | [VPSのIPアドレス] |
www.[独自ドメイン] | CNAME | [独自ドメイン] |

▲VPS側でNSレコード、Aレコードを設定する

マイケル
この状態でVPS側のポートを解放してURLにアクセスすると
Ubuntuのトップ画面が表示されるようになっているはずです。

▲VSP側で必要なポートを空けておく

▲この状態で独自ドメインにアクセスするとApacheの画面が表示される

エレキベア
これでドメインとの紐付けが完了したクマね
apacheの独自設定

マイケル
基本的にはこれで使用できるようになったのですが、今回は費用を抑えるために一つのサーバ内でドメインやポートを振り分けれるようにします。
そのためApache設定でVirutualHostを使用して設定します。

エレキベア
メモリ容量は心配クマが、複数アプリ立ち上げることも可能にするクマね

マイケル
UbuntuのApacheフォルダは/etc/apache2になります。
その中のapache2.confがルートになっていて、ここから各設定を読み込んでいます。
▲apache.conf内で各設定を読み込んでいる

マイケル
デフォルトで用意されているsites-enabled/000-default.confをコピーして独自設定ファイル(今回はvhosts.conf)を作成し、下記のようにリバースプロキシでアクセスするようにします。
▲000-default.confをコピーしてvhosts.confを作成
▲8080ポートでの接続設定

エレキベア
独自ドメイン/apiでアクセスされた時に自身の8080ポートに接続しているクマね

マイケル
あとはproxyモジュールをインストールしてApacheを再起動すれば完了です!
▲proxyモジュールの導入

マイケル
http:[独自ドメイン]/apiのURLでアクセスすると、localhostの時と同様にAPIアクセスできるようになっていると思います。

エレキベア
HTTP経由でのアクセスはこれでクリアクマね
SSL設定

マイケル
最後に、HTTPS経由でアクセスできるよう証明書とApacheの設定を行います。
証明書のインストール

マイケル
VPS上での証明書インストール手順については公式がまとめてくれています。
今回はpython3-certbot-apacheを使用して証明書を作成しcronで更新処理を設定しました。
▲certbotのインストール
▲証明書更新のcron設定

エレキベア
証明書は一ヶ月で切れるクマから定期的な更新処理が必要クマね
apacheの設定

マイケル
次にApache側の設定も変更します。
下記サイトを参考にさせていただきながら設定しました。
Apacheのリバースプロキシをhttps化する手順について - Rainbow Engine
▲有効にした時点でvhosts.confを元にvhosts-le-ssl.confが生成される
▲HTTPS接続設定

エレキベア
作成した証明書を指定するクマね

マイケル
今回はBasic認証を使用してるので、HTTP経由でのアクセスはできないように対応します。
最初に作成したvhosts.confの内容はコメントアウトしましょう。

マイケル
最後に確認として、HTTPS経由でのみアクセスできることを確認できれば、設定は完了です!!

エレキベア
長かったクマ〜〜〜
おわりに

マイケル
というわけで今回はランキングAPIの作成とVPSへのデプロイについてでした!
どうだったかな??

エレキベア
サーバ構築は難しそうなイメージだったクマが、
これくらいなら個人でも全然立てれるクマね

マイケル
自分だけのサーバ環境が出来たからこれからいろいろ遊べそうだね!
今回は用途が限られていたので簡易的な仕組みで構築しましたが、がっつりサーバエンジニアを目指したい方は認証周りももう少し踏み込んで挑戦してみてください!

マイケル
それでは今日はこの辺で!
アデューー!!

エレキベア
クマ〜〜〜〜〜
【Unity】GoでのランキングAPI実装とVPSへのデプロイ方法についてまとめる【Go言語】〜完〜