安全かつ最小にTerraformでGPUサーバーを起動する(GCP編)
普段の仕事でやっている ML Ops 業務の振り返りを兼ねて最低限必要そうな VPC 構成用の Terraform Module for GCP です。
Module には"最小構成"の機械学習環境を作るサンプルを同梱しています。
mazgi/simple-vpc/google | Terraform Module Registry
Structure
⬇️ くらい"最小"です。
- Virtual Private Cloud(VPC) Network を 1 つ作る
- VPC Network の中に GPU 付きの仮想マシン、“Google Compute Engine(GCE)インスタンス"を 1 つ起動する
- GCE インスタンスに SSH ログインする
- GCE インスタンス上の Docker で Jupyter Notebook を起動する
- Jupyter Notebook に HTTP アクセスする

とてもシンプルですね。
ただし最低限のネットワークセキュリティとして接続元 IP アドレスを限定します。
接続元を IP アドレス制限することで、万が一 SSH の設定を間違えたりパスワードなしで Jupyter Notebook を起動してしまっても想定外のアクセスを軽減できます。
簡単な構成なので GCP の Web コンソールからでもそれほど手間なく作れますがちゃんと"Infrastructure as Code(IaC)“します。
インフラ構成をコードとして表現することでバージョン管理やレビュー, 共有, 再現, 複製ができるようになります。
そして IaC ツールである Terraform の Module にすることでより再利用しやすくなります。
GCP Resources
しかし"最小"とはいっても次のようないくつかの GCP リソースを使っています。
google_compute_address
google_compute_firewall
google_compute_network
google_compute_router
google_compute_router_nat
google_compute_subnetwork
今回使う GCE をはじめとした"Infrastructure as a Service(IaaS)“でインフラ構成を考えるとやはりこれくらいのコンポーネントを使う必要が生じます。
その代わりに IaaS は自由度が高く多様なインフラを構成できることが魅力です。
VPC Network も GCE インスタンスも複数作ることができますし、1 つの VPC Network は複数の Region にまたがり、VPC Network 内の各 Subnet は複数の Zone にまたがります。
したがって GCE インスタンスを複数の Zone に配置して水平分散することで可用性を担保できます。
ただし今回は図の赤矢印のところに GCE インスタンスを 1 つ作って起動したいだけなので Zone はあまり意識しません。

今回のように明示的に GCE インスタンスを起動する以外にもAI Platformを始め、あまりネットワークや仮想マシンを意識せずに Jupyter Notebook を使えるサービスもあります。
How to build this structure
今回のサンプルと Module のソースコードはこちらで公開しています。
README 通りに Credentials などを用意し apply
すると GPU インスタンスが起動します。
なおサンプルでは Service Account を使っています。
mazgi/terraform-google-simple-vpc/examples/simple-ml
Terraform 0.12 に対応したので "${}"
が減ってスッキリしました。
module の output からオブジェクトを返せようになったので map
や zipmap
で無理矢理加工する必要も無くなりました 🎉
0.12
対応の差分はdddaf8637e2c956b9b047e7ae00ec9399dcdb018などがわかりやすいです。
That’s all
普段の実務では色々な要件や制約もありシンプルなまま維持するのは難しいこともあるのですが、個人でこうやって基礎から振り返っていくと良い復習になると感じました。
筋トレ的にエンジニアリングの基礎体力を養うためにやっていきたいところです。
なお、実務の泥臭い話はもし ⬇️ builderscon CfP が通ればできる予定です(宣伝)。