Что делает console
terraform console, это REPL (Read-Eval-Print Loop). Вы вводите
выражение, Terraform его вычисляет и печатает результат. Похоже на
python или node без флагов.
Это самый недооценённый инструмент Terraform, он бесплатный, не меняет state, не ходит в облако (кроме чтения уже-зарефрешенных данных), но экономит часы на дебаге.
Базовое использование
cd ~/myproject
terraform console
Появится приглашение:
>
Вводите выражения:
> 1 + 2
3
> "hello, " + "world"
"hello, world"
> upper("terraform")"TERRAFORM"
> length([1, 2, 3, 4])
4
Выйти, exit или Ctrl+D.
Проверка переменных и locals
> var.region
"us-east-1"
> local.name_prefix
"linuxlab-dev-us-east-1"
> local.common_tags
tomap({"Env" = "dev"
"ManagedBy" = "terraform"
"Project" = "linuxlab-terraform-course"
})
Это самый главный use case. Когда locals собирается из 5
вложенных функций, глазами разобраться нельзя. В console, один
ввод, и видно реальное значение.
Проверка типов
Функция type(), спецоператор, доступный только в console:
> type(var.region)
string
> type(var.tags)
map of string
> type([1, 2, 3])
tuple([number, number, number])
> type(toset(["a", "b"]))
set of string
Полезно когда не уверен, list ли это или tuple, map ли это или object. См. hcl-types для разницы.
Доступ к state
После apply все созданные ресурсы доступны в console:
> aws_s3_bucket.demo.arn
"arn:aws:s3:::linuxlab-hello-abc123"
> aws_s3_bucket.demo.tags
tomap({"Owner" = "student"
})
> [for b in aws_s3_bucket.many : b.id]
[
"linuxlab-count-0-abc",
"linuxlab-count-1-def",
]
Это безопасно, никаких изменений. Просто чтение state через те же выражения, что в HCL.
Тестирование функций
Перед тем как писать выражение в HCL, проверьте его в console:
> format("%s in region %s", upper("dev"), "us-east-1")"DEV in region us-east-1"
> merge({a = 1, b = 2}, {b = 99, c = 3}){"a" = 1
"b" = 99
"c" = 3
}
> [for x in [1, 2, 3, 4] : x * 2 if x > 2]
[
6,
8,
]
Это намного быстрее, чем «правлю HCL → запускаю plan → читаю diff → понимаю что выражение не то». Console, это unit-тест для одной строки.
Не-интерактивный режим, echo
Иногда нужно в скрипте получить значение одного выражения:
echo 'type(var.tags)' | terraform console
echo 'aws_s3_bucket.demo.arn' | terraform console -no-color
Через stdin. Удобно для CI или для документации.
Multi-line выражения
В REPL можно ввести несколько строк, обернув в скобки:
> {name = "myapp"
tags = {Owner = "platform"
}
}
{"name" = "myapp"
"tags" = {"Owner" = "platform"
}
}
Это удобно для тестирования сложных object-литералов.
Подводные камни
-
Console требует валидный конфиг. Если в HCL ошибка (битый синтаксис): console не стартует. Сначала
validate. -
Console читает текущий state. Если state пустой (до apply).
aws_s3_bucket.demo.arnупадёт с «resource not found». Это логично: ресурса ещё нет. -
Console не делает refresh. Значения берутся из state-файла как он есть. Если в облаке что-то поменялось снаружи, console этого не увидит. Чтобы обновить:
terraform refresh(но он опасен, меняет state). -
Sensitive значения маскируются. Если output помечен
sensitive = true, в console будет(sensitive value). Чтобы увидеть,nonsensitive()функция. -
Workspace имеет значение. Console работает в активном workspace. Если переключился на staging, видишь staging-state.
terraform workspace show, текущий. -
Console не запускает provisioners. Никаких
local-exec, никаких внешних команд. Только чистые выражения.