Terraform + GCP + Docker を試してみました

Terraformとは

hashicorpが開発している、インフラ構築や設定をテンプレートファイルを使って自動化することができるツールです。
https://www.hashicorp.com/
複数のクラウドサービスやツールに対応しています。
(AWS、Azure、Docker、GCP、Herokuなど)
chefとかansibleといったプロビジョニングツールとは違い、土台自体を作ってくれます。
内部的にはユーザーが書いたインフラの設定をみてAPIを呼んでいるだけですが、呼び出してくれるだけでなく状態を保持してくれます。また、リソース同士の依存関係も表現してくれ、先に必要なインスタンスを作り終わるの待ったりしてくれるので、まだ実際に作成されていないリソースのIPアドレスを設定することができます。
tfstateというjsonファイルにリソースの状態を保存しており、必要最低分の差分のみ反映してくれます。

GCE + Docker の環境をTerraformで作る

試しに下記のような環境を作成してみます。


terraformをインストールします。
$ brew install terraform
エラーが出てきました。
Error: error satisfying plugin requirements
プロバイダが無いとのことなのでinitをしてダウンロードします。
$ terraform init
GCPユーザー用の公式ドキュメント
https://www.terraform.io/docs/providers/google/index.html
最低限、terraformの起動に必要なのは下記ファイルです。
  • 認証用のJSONファイル(GCPから取得)
  • クレデンシャル、プロジェクト名、リージョンを記載したTFファイルを作成
  • 構築するサーバーを記載したTFファイルを作成
今回はterraformディレクトリを作成し、その配下に3つのファイルを配置します。
~/terraform
├── gsp_instance1.tf
├── gcp_provider.tf
└── my-test.json
認証用のjsonファイルはGCPのコンソール画面から取得します。
今回はダウンロードしてきたファイル名の名前を「my-test.json」にリネームしておきました。

Provider設定ファイルを作成(GCP用)

gcp_provider.tf ファイルを作成します。
公式ドキュメントにサンプルコードがあるので、それを参考に作成しました。jsonファイル名とプロジェクト名を指定します。
Terraform公式ドキュメント_Google Cloud Provider
// Configure the Google Cloud provider
provider "google" {
  credentials = "${file("my-test.json")}"
  project     = "my-gce-project-id"
  region      = "us-central1"
}

Instance設定ファイルを作成

gcp_instance1.tf ファイルを作成します。
このファイルに構成するサーバーの設定を書きます。
こちらも公式ドキュメントにサンプルが載っているので参考にしました。
Terraform公式ドキュメント_Google Compute Instance
resource "google_compute_instance" "centos7-01" {
  name         = "centos7-01"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  tags = ["terraform", "test"]

  boot_disk {
    initialize_params {
      image = "centos-cloud/centos-7"
    }
  }

  // Local SSD disk
  scratch_disk {
  }

  network_interface {
    network = "default"

    access_config {
      // Ephemeral IP
    }
  }

  metadata {
    foo = "bar"
  }

  metadata_startup_script = "echo hi > /test.txt"

  service_account {
    scopes = ["userinfo-email", "compute-ro", "storage-ro"]
  }
}
定義のチェックをします。コードに間違いがあるとエラーになります。
「Plan: 1 to add, 0 to change, 0 to destroy.」と返ってくれば大丈夫です。
$ terraform plan
GCEにデプロイします。
$ terraform apply
質問にyesと答えると、デプロイされます。
簡単にインスタンスが作成できました。

所感

AWSでもGCPでも利用できて、テンプレートファイルを作成してしまえば一撃で環境が構築できてしまうのは、とても便利でした。このツールを利用して環境構築の改善ができれば良いと思っています。