😎

レンタルサーバーと AWS を連携する構成の考察

に公開

はじめに

タイトルの通りですが、レンタルサーバーと AWS をうまく連携させる構成を考えてみました。

構成1. そもそも AWS を使わない

タイトルに合わない内容ですが、今までの構成も載せておきます。

レンタルサーバーは Proxy サーバーとして全リクエストを受け付け、サービスごとに立ち上げた Docker に振り分ける構成にしていました。
各サービスごとに Docker を立ち上げるので、サービスごとの分離は可能な構成です。

これでも悪くないのですが、色々問題もあります。

  • レンタルサーバーの負荷が上がる
    • Proxy サーバーの責務のみならず、各プロジェクトごとの Docker も動作させるとなると、それなりに高負荷になります。
  • サービスを作り替える時、DB のデータを飛ばしてしまう可能性がある
    • ボリュームでうまく管理すればいいと言えばそれまでですが、プロジェクトを Git などで管理する以上、どこまでを差分管理すべきで、どこまでを分離させるかが難しくなります。
    • かくいう自分も一度データを全て吹っ飛ばした経験があり…トラウマです。

構成2. データ管理のみ AWS に移譲する

データ管理 (DB) のみ AWS に移行した構成です。
DB 部分は RDS、DynamoDB など適宜使い分けます。

この構成であればデータ管理を分離できるので、うっかりデータを飛ばしてしまうこともありません。
(そもそも構成、手順を厳格化しておけば問題ないのですが…)

また、副次的にローカルの開発環境から DB に接続することも容易いです。

構成3. Web サーバーも AWS に移譲する

Web サーバーも EC2 で AWS 内に立ち上げることで、レンタルサーバーの責務をさらに軽くした構成です。
また DB へのアクセスを VPC 内に閉じれるので、データ管理も堅牢になります。
ただ料金はそれなりに発生してしまうので、費用対効果によりけりだとは思います。

終わりに

現状考えられる最適解は、下記のようになると思います。

  • 開発環境は Docker で立ち上げる
    • 使わない環境は落とす
  • 本番環境はプロキシのみレンタルサーバーが担い、他は AWS に移譲する
    • 公開するテスト環境も含む

図としてはこんな感じです。

ポイントは『常時稼働とするか否か』なのではないかと (執筆中に) 気付きました。
開発時のデータ永続性が不要であれば DB も Docker 内に含むことも可能ですが、複雑性が増すような気もしますし…ま、そのあたりはケースバイケースですね!便利な言葉!
(ローカルスタックも活用すればいいのでは…?という気もするので、今後試してみます)

今後着手する開発は予算と相談しながら、構成もしっかり考えていこうと思いました。
個人開発も頑張るぞ!

後日談

ローカルスタック活用

これは結構いい感じにいきました。
DynamoDB の構成を色々いじりながら考えることができるので、本当に初期のスタートアップには向くと思います。
ただ、どこまで行っても疑似環境なので、AWS との齟齬に悩まされたりもします。
(e.g. ローカルスタックではインデックスのキーになる要素も定義しておかないといけない)

サーバーレス

こいつが神すぎました。
Web サーバー (EC2) の部分が Lambda になるイメージです。
これであれば必要な時にのみ立ち上がってくれるので、構成3でもそこそこコストを抑えられます。
DynamoDB が常時立ち上がることにはなりますが、大したデータ量ではないので全然問題ないと思っています (開発用のデータ量なんて微々たるものですし)。
結局今は構成3に落ち着いています。

Discussion