🪐
TerraformCloudの変数をTerraformで管理するまで
はじめに
前回TerraformCloudの変数を設定しましたが、
この管理もTerraformで行いたいので試してみました。
こいつを使うようです。
前提
- terraform導入済み
- 現時点ではバージョン
0.12
以上が必要みたいです。 - わたしは
v1.5.1
で試しています。
- 現時点ではバージョン
Since v0.24.0, this provider requires Terraform >= 0.12.
流れ
- トークンを取得、tfeプロバイダで読み込み
- organization等各リソースを作成
手順
token設定
terraform cloudにアクセスするためのトークンを設定します。
種類や権限範囲などはこちら
本手順はユーザトークンで試しています。
取得したトークンを
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連携の例もドキュメントに乗っているため、必要に応じて参考にします。
変数設定
リストの場合こんな感じです。
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で管理するのは良いかもしれません。
参考
あとは公式ドキュメント
Discussion