AWSを使わずに自前でネイティブアプリのサーバー側を構築した話

2024/07/20に公開

前提

とある企業で仮想通貨のアプリを中国企業から買収し、有料会員情報から開発環境までをごそっと移管することがあり、開発を進めていくフェーズから参画させていただいた。

その時に、本番環境はすでに動いていてそれなりのアクセス数があった中、STAGE環境が存在してなかったため、開発効率向上のためにSTAGE環境を0から作った話。

AWSを全く使わず、クラウドサーバーだけでロードバランサからDBまで作っていた環境のため、STAGE環境も同じように自前で作っていく。

状況

  • Linodeのアカウントがあり、本番サーバーだけが稼働している
  • 本番サーバーは全部で20台以上
  • Gitlabのリポジトリがいくつかある
  • どのサーバーでどのソースコードが動いているかわからない
  • ドキュメントはなく、READMEの記載もほぼない
  • 先方に聞くことができる体制はあるが、当時の開発者に聞けるわけでもなく、技術的な回答は得られない

やったこと

まずは各サーバーの役割を知るために、ロードバランサっぽい名前がついているサーバーの調査をした。
案の定、HAproxyが動いていて、ロードバランサとして動かしているような設定値があることがわかった。

さらに調べると、CloudFlare経由でリクエストが飛んできて、ロードバランサでリクエストを各サーバーに飛ばしていることが判明。
リクエストの内容から各サーバーの役割がぼんやり見えてきた。

メインのいわゆるバックエンドと呼ばれるサーバーは、アプリからリクエストを受け、DBから必要な情報を取り出したり、登録/更新/削除をしていた。
バッチ処理が動いていて、世界中のWebサイトからスクレイピングして情報を保存しているサーバーもあった。

MySQLが動いているDBサーバーやRedisが載っているサーバーも自前で、用意して各種設定をして使用していた。

VPNを構成しているWireguardが動いているサーバーがあり、VPNを経由しないと各サーバーにログインできないようになっていた。

リポジトリを調査していると、Ansibleのリポジトリがあり、Ansibleを活用して各サーバーを作り上げただろうということが分かった。
だが、このAnsibleがそのままでは動かなく、ここではこうしたかったんだろう…と想像してみていくしかなかった。

アプリのざっくりした仕様

アプリを触っていてざっくり以下の機能があることが分かった。

  • 世界中の取引所からの価格、出来高を取得してデータとして保存、アプリから取得して表示する。
  • コインペア情報はウォッチリスト登録、アラート登録が可能
  • 各Webサイトから仮想通貨に関するニュースを取得してデータとして保存、アプリからニュースが見れる。
  • 主要な取引所に接続して、売買取引ができる。
  • 取引所とAPI連携して資産をポートフォリオで見れる。
  • チャット機能
  • 有料会員機能
  • 有料会員になると広告が非表示になったり、アラート登録数無制限になったり、様々できることが増える。

STAGE環境を作るためにどうしたか

全体のざっくりした仕様とサーバー構成がわかってきたため、まずは必要最低限のサーバーを選出した。
例えば、APIを処理するバックエンドサーバーは本番環境だとおそらく負荷を考慮して5台ほど稼働してロードバランサで振り分けていたが、STAGEだと1台で十分とした。

最低限のサーバーを選出して構成したところ図のようになった。

これらをAnsibleで作れるよう、Ansibleを構築していった。
本番環境はUbuntu16で動いていたところ、STAGE環境用のサーバーを用意したときはLinodeはUbuntu18以上しか扱えなかった。playbookで用意してあったものをそのまま流してもエラーになるところがあったため、調べながら試しながら構築していったためかなり苦労した…

こうして何とかできあがったSTAGE環境に対して、アプリもSTAGE環境用(リクエストはSTAGEのドメインに飛ぶようにしたもの)を用意して、動かしたところ、案外すんなり動いた。

最後に

AWSを一切使わず、クラウドサーバーだけで一通りの構築をすることができた。
VPSも自前で作っているため、開発者のユーザー管理、サーバー稼働状況管理ができた上で、各種EC2役割りのサーバー、RDS役割りのサーバー、ロードバランサ役割りのサーバーなど動かすことができている。

コストもクラウドサーバーのレンタル費しかかからないのでかなり抑えられているはず。

次回は、これをAWSで作った時の費用と見比べてみようと思う。

Discussion