---
title: "Terraform CloudでGCPインスタンスを作る | grasys blog"
url: "https://blog.grasys.io/post/kyouhei/terraform-cloud-setting-creating-gce-instance/"
description: "前回 のTerrafrom Cloud VCSの設定の続きです。 この間にTerraform Cloudが正式に発表されました。 https://www.hashicorp.com/blog/announcing-terraform-cloud/ 驚くことに5ユーザのチームまでは無料で使用できます。太っ腹！ では早速…"
---

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

-   ![](/_astro/noicon.CTHOhNiB_1HMs6A.webp)[kyouhei](/authors/kyouhei/)
-   公開日：2019年11月25日
-   カテゴリー：[Tech](/categories/tech/)
-   タグ：[#Terraform](/tags/terraform/)

![Terraform CloudでGCPインスタンスを作る](/_astro/og-image.DDSiu2Ny_XHpDd.webp)

[前回](https://blog.grasys.io/post/kyouhei/terraform-cloud-setting-vsc-bitbucket-cloud/) のTerrafrom Cloud VCSの設定の続きです。

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

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

では早速、 [Getting Started](https://www.terraform.io/docs/cloud/getting-started/index.html)に従ってWorkspacesの作成から始めていきます。

## Workspaceの作成

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

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

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

### Wordspace作成画面

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

![Wordspace作成画面（1）](/_astro/01-11-7-1024x159-b6af2a52.YWSKxonf_sYfVR.webp)

![Wordspace作成画面（2）](/_astro/02-12-6-1024x781-952c08eb.CHdB0_d2_2v1Ab8.webp)

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

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

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

![Wordspace作成画面（3）](/_astro/03-13-6-1024x838-8062b735.BAL_mDKn_Z27QpYv.webp)

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

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

-   Terraform Working Directory

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

-   Automatic Run Triggering

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

-   VCS branch

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

-   Include submodules on clone

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

![Wordspace作成画面（4）](/_astro/04-14-5-1024x772-60b71aef.TXz4Hwr4_Z4EoWV.webp)

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

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

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

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

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

![GCP サービスアカウントの作成の画面](/_astro/05-15-5-1024x652-b96c058f.CDKgL8G6_Z1RL2ib.webp)

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

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

## tf変数の設定

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

![tf変数の設定の画面（1）](/_astro/06-16-3-1024x478-a5dfd9ce.d4Azj41y_ZKJR5Y.webp)

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

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

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

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

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

![tf変数の設定の画面（2）](/_astro/07-17-3-1024x906-4b883142.BK7Z6QMI_1jzIX4.webp)

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

## tfファイルの作成

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

`variables.tf`

Plain textcontent\_copy

```
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`

Plain textcontent\_copy

```
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`

Plain textcontent\_copy

```
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` しましょう。

![Run Terraformの画面（1）](/_astro/08-18-1-840x1024-93b6dcae.m9kYCRsa_wqYSu.webp)

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

![Run Terraformの画面（2）](/_astro/09-19-1024x421-764cdf7c.DOM1FAaw_2u7zoz.webp)

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

![Run Terraformの画面（3）](/_astro/10-20-1001x1024-65ee3c41.DPdBaSnp_iAHmt.webp)

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

![Run Terraformの画面（4）](/_astro/11-21-3-1024x753-96a3e702.KIudykG__Z1RTsaY.webp)

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

![Run Terraformの画面（5）](/_astro/12-22-2-1024x846-1878302e.CI_1lwi9_cifV.webp)

## まとめ

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

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

## この記事を書いた人

[![](/_astro/noicon.CTHOhNiB_Z24aAgM.webp)](/authors/kyouhei/)

### [kyouhei](/authors/kyouhei/)

kyouheiのプロフィールと執筆記事をご覧いただけます。

[プロフィールと記事一覧](/authors/kyouhei/)