Closed5

Terraform初心者の時に知っておきたかった豆知識・小技集

harrythecodeharrythecode

小技

Terraformでデバッグしたい

terraform console コマンドを使うと関数や記述の確認など色々試せます。

$ terraform console
> ("1" == 1) ? true : false
false
> (1 == 1) ? true : false
true

Terraformの各変数の値を確認したい

terraform state listterraform 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",
]
脚注
  1. https://zenn.dev/shonansurvivors/articles/7368bcd8965064 ↩︎

  2. https://developer.hashicorp.com/terraform/language/functions/compact ↩︎

  3. https://developer.hashicorp.com/terraform/language/functions/tolist ↩︎

harrythecodeharrythecode

配列内の文字列のダブルクォートをエスケープして再度文字列に変換する

例えば、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\"]"
harrythecodeharrythecode

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
}
このスクラップは2022/10/29にクローズされました