📝

Terraform CloudのWorkspaceを作る

2020/09/24に公開

Terraform CloudのWorkspaceを作る

前回 Terraform Cloud にアカウントを発行したので Workspace を作ってみましょう。

とりあえず今はからですね、画面からポチポチ作っても良いのですが、せっかくなのでこれもTerraformで作ってみましょう。

Terraform Cloud Providerを使う

Terraform Enterprise Provider 略して tfe providerがあります。
これがTerraform Cloudを管理するTerraform Providerです。

とりあえずの provier定義は以下

provider tfe {}

オプションも指定できるが、環境変数でわたせるので今回はその方式

  • token
    • このあとで生成するトークンを指定
    • TFE_TOKEN の環境変数で指定可能、
  • hostname
    • デフォルト app.terraform.io なので通常利用であれば特に指定しなくてよいと思う
    • TFE_HOSTNAME の環境変数で指定可能

Terraform Cloud トークンを取得

Terraform Cloudの Settings を開いて、Teams設定からチームトークンを生成します。

生成されたトークンは Warning にもあるように一回きりなので気をつけてください。
紛失した場合は再作成してください。

Terraform で Workspace を作る

とりあえずかんたんなサンプルとして以下を用意します。
これはterraform cloud上に test workspaceを作るコードになります。

provider tfe {}

resource tfe_workspace test {
  name         = "test"
  organization = "mominosin"
}

最初に初期化して、TFE_TOKENに上で取得したトークンを渡しplanをしてみます。

❯ terraform init
❯ TFE_TOKEN=<TOKEN> terraform plan

planの結果はこのようになります。

❯ TFE_TOKEN=<TOKEN> terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # tfe_workspace.test will be created
  + resource "tfe_workspace" "test" {
      + auto_apply            = false
      + external_id           = (known after apply)
      + file_triggers_enabled = true
      + id                    = (known after apply)
      + name                  = "test"
      + operations            = true
      + organization          = "mominosin"
      + queue_all_runs        = true
      + terraform_version     = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

planで問題ないならapplyします。

❯ TFE_TOKEN=<TOKEN> terraform apply
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # tfe_workspace.test will be created
  + resource "tfe_workspace" "test" {
      + auto_apply            = false
      + external_id           = (known after apply)
      + file_triggers_enabled = true
      + id                    = (known after apply)
      + name                  = "test"
      + operations            = true
      + organization          = "mominosin"
      + queue_all_runs        = true
      + terraform_version     = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

tfe_workspace.test: Creating...
tfe_workspace.test: Creation complete after 0s [id=ws-KcNddjr6WWs4rEmP]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Resources: 1 added となっているので1つWorkspaceが作れたようです。

Terraform Cloud上を確認すると test workspaceが生成されています。

test workspaceを開くと、そのWorkspaceへstateファイルの保存先として指定する方法が書かれています。

トークンを渡さない場合

仮にトークンを渡さないとエラーになります。

❯ terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

Error: required token could not be found

  on workspace.tf line 1, in provider "tfe":
   1: provider tfe {}

最後に

今回は短めですが Terraform Cloud へ Terraformを使ってWorkspaceを作成する方法を書いてみました。

次回は workspace にgitや、環境変数などの設定を引き続きTerraformで作成していく予定です。

今回利用したコードは terraform-cloud-workspaces / pre_workspace においてあるのでご興味あれば御覧ください。

Discussion