🪐

TerraformCloudの変数をTerraformで管理するまで

2023/12/30に公開

はじめに

前回TerraformCloudの変数を設定しましたが、
この管理もTerraformで行いたいので試してみました。

こいつを使うようです。
https://registry.terraform.io/providers/hashicorp/tfe/latest/docs

前提

  • terraform導入済み
    • 現時点ではバージョン0.12以上が必要みたいです。
    • わたしはv1.5.1で試しています。

Since v0.24.0, this provider requires Terraform >= 0.12.

流れ

  • トークンを取得、tfeプロバイダで読み込み
  • organization等各リソースを作成

手順

token設定

terraform cloudにアクセスするためのトークンを設定します。
種類や権限範囲などはこちら
https://developer.hashicorp.com/terraform/cloud-docs/users-teams-organizations/api-tokens#access-levels

本手順はユーザトークンで試しています。

取得したトークンを

terraform {
  required_providers {
    tfe = {
      version = "~> 0.51.1"
    }
  }
}

provider "tfe" {
  token    = var.token #####
}

のように設定します。
ここのトークンが誤っていると、後のリソース作成時にこのようなエラーを出します。

│ Error: Error creating the new organization <organization名>: unauthorized
│ 
│   with tfe_organization.main,
│   on main.tf line 13, in resource "tfe_organization" "main":13: resource "tfe_organization" "main" {

organizations設定

resource "tfe_organization" "main" {
  name  = "<organization名>"
  email = "<通知用メールアドレス>"
}

organization名は世界で一意の必要ありです。

project/workspace設定

resource "tfe_project" "main" {
  name         = "test-project"
  organization = tfe_organization.main.name
}

resource "tfe_workspace" "main" {
  name         = "test-workspace"
  organization = tfe_organization.main.name
  project_id   = tfe_project.main.id
}

このworkspaceはCLI-Drivenになるようです。
VCS連携の例もドキュメントに乗っているため、必要に応じて参考にします。
https://registry.terraform.io/providers/hashicorp/tfe/latest/docs/resources/workspace#example-usage

変数設定

リストの場合こんな感じです。

resource "tfe_variable" "list" {
  key          = "list"
  value        = jsonencode(["queue1", "queue2", "queue3"])
  category     = "terraform"
  workspace_id = tfe_workspace.main.id
  description  = "list"
  sensitive    = false
}

jsonencodeを使わないとこのようにエラーを出します。

╷
│ Error: Incorrect attribute value type
│ 
│   on main.tf line 56, in resource "tfe_variable" "list":56:   value        = ["queue1", "queue2", "queue3"]
│ 
│ Inappropriate value for attribute "value": string required.

主要なデータ型の変数をまとめたため、よかったら使って下さい。

terraform cloud variables
resource "tfe_variable" "string" {
  key          = "string"
  value        = "string"
  category     = "terraform"
  workspace_id = tfe_workspace.main.id
  description  = "string"
  sensitive    = true
}

resource "tfe_variable" "number" {
  key          = "number"
  value        = 10
  category     = "env"
  workspace_id = tfe_workspace.main.id
  description  = "number"
  sensitive    = false
}

resource "tfe_variable" "bool" {
  key          = "bool"
  value        = true
  category     = "env"
  workspace_id = tfe_workspace.main.id
  description  = "bool"
  sensitive    = false
}

resource "tfe_variable" "list" {
  key          = "list"
  value        = jsonencode(["queue1", "queue2", "queue3"])
  category     = "terraform"
  workspace_id = tfe_workspace.main.id
  description  = "list"
  sensitive    = false
}

resource "tfe_variable" "map" {
  key = "map"
  value = jsonencode(
    {
      "queue1" = 10
      "queue2" = 20
      "queue3" = 30
    }
  )
  category     = "terraform"
  workspace_id = tfe_workspace.main.id
  description  = "map"
  sensitive    = false
}

resource "tfe_variable" "object" {
  key = "object"
  value = jsonencode(
    {
      name = "test-sqs-queue"
      tags = {
        Environment = "Test"
        Project     = "Terraform Practice"
      }
      delay_seconds = 10
    }
  )
  category     = "terraform"
  workspace_id = tfe_workspace.main.id
  description  = "object"
  sensitive    = false
}

resource "tfe_variable" "tuple" {
  key = "tuple"
  value = jsonencode(
    [{
      name = "aaa"
      age  = 27
      }, {
      name = "bbb"
      age  = 33
    }]
  )
  category     = "terraform"
  workspace_id = tfe_workspace.main.id
  description  = "tuple"
  sensitive    = false
}

既存のworkspaceに変数を設定する(DataSource)

こっちを使うパターンのほうが多いでしょうか。
Data Sourceへ既存リソースの情報を入れればOKです。

data "tfe_organization" "main" {
  name = "<org名>"
}

data "tfe_project" "main" {
  name         = "<project名>"
  organization = data.tfe_organization.main.name
}

data "tfe_workspace" "main" {
  name         = "<workspace名>"
  organization = data.tfe_organization.main.name
}

resource "tfe_variable" "string" {
  workspace_id = data.tfe_workspace.main.id
}

おわりに

多くの変数をterraform cloudで定義する場合、terraformで管理するのは良いかもしれません。

参考

https://zenn.dev/momin/articles/27d33122020c50d407c7
https://brendanthompson.com/til/2021/03/hcl-enabled-tfe-variables
あとは公式ドキュメント

Discussion