Closed5
Terraform初心者の時に知っておきたかった豆知識・小技集
データタイプ
Terraformで頻出のデータタイプは以下の通りです。[1]
タイプ | 例 |
---|---|
string | "test" |
number | 15 |
bool | true |
list/tuple | ["us-west-1a", "us-west-1c"] |
map/object | {name = "Mabel", age = 52} |
null | null |
後はこれらを組み合わせて以下のようにも定義できます。
-
map(list):
{["a", "b"]}
-
list(number):
[1, 2, 3]
-
list(string):
["1", "2", "3"]
小技
Terraformでデバッグしたい
terraform console
コマンドを使うと関数や記述の確認など色々試せます。
$ terraform console
> ("1" == 1) ? true : false
false
> (1 == 1) ? true : false
true
Terraformの各変数の値を確認したい
terraform state list
と terraform state show
を組み合わせると確認できます。
$ terraform state list
data.aws_security_groups.A
data.aws_security_groups.B
data.aws_vpc.main
$ terraform state show data.aws_security_groups.A
# data.aws_security_groups.A:
data "aws_security_groups" "A" {
arns = [
"arn:aws:ec2:<region>:<accountId>:security-group/sg-xxx",
"arn:aws:ec2:<region>:<accountId>:security-group/sg-yyy",
"arn:aws:ec2:<region>:<accountId>:security-group/sg-zzz",
]
id = "<region>"
ids = [
"sg-xxx",
"sg-yyy",
"sg-zzz",
]
vpc_ids = [
"vpc-XXX",
"vpc-XXX",
"vpc-XXX",
]
filter {
name = "tag:Name"
values = [
"*-hogehoge-*",
]
}
}
💡新しい変数が表示されない場合、
terraform refresh
コマンドが便利[1]:
- 実体の内容に沿って、stateが更新されます。実体側が更新されることはありません。
- stateのoutputは追加・更新されます。実体は更新したくない(applyはしたくない)がoutputを追加・更新したい、といった状況では便利です。
空行の配列(list)を含む全ての配列を結合(マージ)する
普通に結合すると空行([""]
)も含まれます。
$ terraform console
> concat([""],["a","b", "c"],[1, 2, 3])
[
"",
"a",
"b",
"c",
1,
2,
3,
]
空行を排除するには実はこれをnullの配列([]
)にする必要があり、compact
[2]関数が便利です。
compact
takes a list of strings and returns a new list with any empty string elements removed.
> concat(compact([""]),compact(["a","b", "c"]),compact([1, 2, 3]))
tolist([
"a",
"b",
"c",
"1",
"2",
"3",
])
tolist()
[3]が付いてますがlist型([]
)の場合もlist型に変換するので無害です。
> tolist(["a", "b", "c"])
[
"a",
"b",
"c",
]
配列内の文字列のダブルクォートをエスケープして再度文字列に変換する
例えば、terraform内で配列を文字列として渡す場合、以下のように記述できます。
subnets = "[\"subnet-a\", \"subnet-b\", \"subnet-c\"]"
上記の変数をheredoc内で展開しても文字列なので怒られません。ただ、配列の変数に対して上記と同じことをする場合には少しコツが入ります。
以下のアウトプットがあるとします。
vpc.outputs.private_subnets => ["subnet-a", "subnet-b", "subnet-c"]
formatlistでエスケープした\(バックスラッシュ)
と`"(ダブルクォート)を組み合わせ、joinで配列の形にしていきます。
subnets = "[${join(",", formatlist("\\\"%s\\\"", vpc.outputs.private_subnets))}]"
// => subnets = "[\"subnet-a\", \"subnet-b\", \"subnet-c\"]"
Terraform/Terragruntで変数を文字として出力したい
Terraform/Terragrunt Init で変数が何故か勝手に解釈されるのを防ぐ: $$
をつけると出力時は $
になる。
generate "main" {
path = "main.tf"
if_exists = "overwrite"
contents = <<EOF_FILE
output "bucket_id_as_string" {
value = "$${aws_s3_bucket.mine.id}"
}
EOF_FILE
}
HereDocで毎回変更が走る
余分な改行やスペースを無理やり取り除いてMinifyする。
このスクラップは2022/10/29にクローズされました