Terraformを使ってWebアプリケーション運用向けにGCEを構築する

普通の Web アプリケーション向け環境を Google Compute Engine(GCE)を中心に構成する、そんなよくあるシステムのサンプルです。
GKE とか登場しないトラディショナルな構成を先人の知恵に学びつつ機会がある度に色々考えますが、結局こんな感じになるのではと思ってます。

ソースコードはmazgi-showcase/202005.gce-webapp-environmentにあります。

なお Web アプリケーションの開発環境については次のような記事を書いてますので合わせてご参照いただけましたら幸いです。

Structure

今回作る構成です。

Web アプリケーション環境としては、委任した適当なサブドメインに HTTP または HTTPS でアクセスするとロードバランサを経由した GCE インスタンス”App”上の nginx がレスポンスを返します。
実際のシステムでは App 上に任意のアプリケーションを deploy する想定です。
SSL/TLS 証明書は GCP により自動更新されます、便利。

Web アプリケーションなので RDBMS とインメモリデータストアくらいは使うでしょうということで GCP のマネージドサービスを使って MySQL と Redis を提供します。
今回のサンプルでは可用性は担保していません。

deploy やメンテナンスのために開発者が GCE インスタンスに SSH ログインできるようにします。
その際、各インスタンスに直接 SSH 接続するのではなく、 Step にまず SSH ログインし、 Step から App などに SSH ログインするよう制約をつけます。
これは実際の Web アプリケーション環境でよくある構成だと思います。

また、他のシステムへの接続経路として固定 IP アドレスを振った Nat Gateway を立てます。
世の中には特定の IP アドレスのみから接続を受け付けるシステムが存在し、そういうシステムへの接続を想定しています。

以上のシステムを構成するにあたって使う GCP リソースはざっくり以下です。

環境構築の手順は README に、環境構築後の各 VM やマネージドサービスの操作は how-to-check-the-provisioned-environment.md にあります。

Points

サンプルとしてもしどなたかの参考になればうれしいですし、自分の備忘録としても部分部分を参照したいので、そこそこ実践的にしかしサンプルとして見通しが良いように以下を注意して作りました。

  • サンプルなので理解すべきツールを最小限にした
    • 実行手順は実質 Docker Compose のみ
    • provisioning は Terraform に寄せた
    • したがって Terraform で困難な VM 上の provisioning には触れない
  • サンプルなので簡単に実行したい
    • 手順は数ステップ
    • ブラウザ、Git、Docker があれば ok
    • ローカルへの gcloud コマンドインストール不要
    • ローカルへの terraform インストール不要
  • オートスケールなし
    • Managed instance groups(MIGs)使うと便利だが、MIGs の管理には Terraform は向いてないと思う
  • 実務でなんだかんだありがちな要件をなるべく入れた
    • 入り口 IP アドレス固定
    • 出口 IP アドレス固定
    • システムへの接続元限定(HTTPS, SSH)
    • SSH は Step サーバー経由
    • VM ログインへの各種制約を考慮

やっぱコンテナ使いたいですね。