grasys blog

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 から作成画面に入ります。

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

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

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

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

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

  • Terraform Working Directory

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

  • Automatic Run Triggering

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

  • VCS branch

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

  • Include submodules on clone

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

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

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

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

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

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

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

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

tf変数の設定

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

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

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

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

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

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

ひとまず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 しましょう。

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

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

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

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

まとめ

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

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


株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。

grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud (GCP)、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。

お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。


採用情報
お問い合わせ