Terraform CloudでGCPインスタンスを作る

前回 のTerrafrom Cloud VCSの設定の続きです。

この間にTerraform Cloudが正式に発表されました。 https://www.hashicorp.com/blog/announcing-terraform-cloud/

驚くことに5ユーザのチームまでは無料で使用できます。太っ腹!

では早速、 Getting Startedに従ってWorkspacesの作成から始めていきます。

Workspaceの作成

WorkspaceはVCSリポジトリで設定した構成ファイル(.tf)と変数の値(.tfvars)、リソースの状態(.tfstate)、履歴と実行ログがセットで含まれています。

プロジェクト単位にWorkspaceを分割して使うことが多いです。この場合、本番、開発などの環境は変数で切り分けます。

今回は前回作成したVCS設定を利用して、bitbucketにterraform-cloud-for-blogというリポジトリを用意してあります。

Wordspace作成画面

右上の New workspace から作成画面に入ります。

TerraformCloud Workscape作成

最初に設定済みのVCSを設定します。前回作成したBitbucket CloudのVCSを選択します。

TerraformCloud Workscape作成

Bitbucket内でどのリポジトリを設定するか選択します。

私の場合は作成したリポジトリは出てこなかったので入力しました。

当然ですがVCS作成時に入力したアカウントでアクセスできる必要があります。公開リポジトリはクラウド上のリソース管理という観点から全くオススメしません。

TerraformCloud Workscape作成

Workspaceの設定をします。Workspace名はわかりやすい名前で良いと思います。

Advanced options で設定できる項目は4つです。

  • Terraform Working Directory

デフォルトではリポジトリのルートでTerraformは実行されますが、例えば同一リポジトリに複数の環境が存在するような場合にはデプロイ対象とするサブディレクトリ名を設定します。

  • Automatic Run Triggering

これは Terraform Working Directory を設定した場合にのみ有効です。指定したサブディレクトリに含まれるファイルが更新された場合のみ自動実行されますが、そうでない場合は無視します。

  • VCS branch

デフォルトブランチを設定します。

  • Include submodules on clone

チェックするとサブモジュールのクローンが実行されます。

TerraformCloud Workscape作成

ワークスペースの作成にはTerraform Cloud上で オーナー 権限が必要なので注意です。

これで無事にワークスペース terraform-cloud-for-blog が作成されました。

GCP サービスアカウントの作成

Terraform CloudからGCPリソースの操作が可能になるように権限を付与します。GCP上でサービスアカウントを作成し、json鍵を発行。その鍵をTerraform CloudのWorkSpaceに設定します。

通常のサービスアカウント作成と同じ手順で作成します。

GCP サービスアカウント作成

権限は必要な権限を割り振りましょう。今回のblogの内容では Compute 管理者 で十分です。

この次の画面ではキーの作成を行って下さい。作成したキーを元に次の作業です。

tf変数の設定

さきほど作成したサービスアカウントをtf変数に設定します。

TerraformCloud Configure variables設定

Terraform Variables にはアクセス用のサービスアカウントの他にGCPプロジェクト名も設定してしまいましょう。GOOGLE_CREDENTIALS という変数と PROJECT_ID を作成します。

変数設定時にはHCLとSebnsitiveというオプションがあります。

変数はデフォルトでは文字列です。HCLにチェックを入れるとリストやマップ形式の変数を記述することができるようになります。

Sensitiveにチェックをすると誰も設定値を閲覧することができなくなり、更新だけ可能です。GOOGLE_CREDENTIALSは機密情報ですのでチェックしてみました。

また Environment Variables を設定することも可能です。こちらは Terraform 実行時に設定される環境変数です。

TerraformCloud Configure variables設定

ひとまず2つの変数を設定して完了です。

tfファイルの作成

Terraform Cloudが管理するリソース用のtfファイルを作成します。terraform-cloud-for-blogリポジトリにインスタンスを定義します。

variables.tf

variable "GOOGLE_CREDENTIALS" {}
variable "PROJECT_ID" {}

provider "google" {
    credentials               = var.GOOGLE_CREDENTIALS
    project                   = var.PROJECT_ID
    region                    = "asia-northeast1"
    zone                      = "asia-northeast1-a"
}

instances.tf

resource "google_compute_instance" "terraform-cloud-test" {
  name                = "terraform-cloud-test"
  machine_type        = "n1-standard-1"
  zone                = "asia-northeast1-b"

  depends_on          = [
    google_compute_address.terraform-cloud-test
  ]

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

  network_interface {
    network           = "default"
    access_config {
      nat_ip          = google_compute_address.terraform-cloud-test.address
    }
  }

  service_account {
    scopes = [
      "cloud-platform"
    ]
  }
}

addresses.tf

resource "google_compute_address" "terraform-cloud-test" {
  name        = "terraform-cloud-test"
}

簡単にインスタンスを1台と外部IPを1つだけの構成です。commitしておきます。

Run Terraform

Run画面から Queue Plan をえいやっと押してみましょう。インタラクティブに terraform plan が始まります。plan が終わると確認待ちになります。 Confirm & Apply しましょう。

TerraformCloud Run

コメント入力欄が現れて、再度ボタンがでます。ちょっと冗長。

TerraformCloud Run

実行結果。。。エラーになりました。サービスアカウントの指定が悪かったようです。(上記の例は修正済みです)

TerraformCloud Run

修正して、commitするとまたplanが始まります。

TerraformCloud Run

再度Applyしましょう。今度は成功しました。

TerraformCloud Run

まとめ

Terraform Cloudを使ってインスタンスを作成してみました。

よりセキュアに、例えばTeam機能を使ってConfirm権限のあるメンバーを限定する、などいう使い方がおすすめです。(ただし有償)