linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • База знаний
  • Шпаргалка
  • Capstone
  • Собеседование
home/terraform/kb/Провайдеры/tf-utility-providers

kb/providers ── Провайдеры ── intermediate

Утилитарные провайдеры: random, time, null, terraform_data

Провайдеры, которые не управляют облаком, а помогают HCL. `random`, генерация ID/паролей. `time`, задержки и timestamp-метки. `null`, устаревший «нерессурс» для триггеров. `terraform_data`, современная замена `null_resource`, встроена в Terraform. Каждый снимает конкретное ограничение деклеаративного подхода.

view as markdownaka: terraform-utility-providers, terraform-helper-providers

Что такое утилитарный провайдер

Большинство провайдеров (aws, kubernetes, github) представляют внешнюю систему. API облака или сервиса. Утилитарные провайдеры, это не API, а функциональность языка: генератор случайных значений, таймер, триггер. Они дают то, чего нет в HCL встроено.

Все они official HashiCorp, версии стабильные, breaking-changes редкие.

random

Генерация значений, детерминированно в пределах state'а, случайно при создании.

hcl
terraform {
  required_providers {
    random = {
      source  = "hashicorp/random"
      version = "~> 3.6"
    }
  }
}
resource "random_id" "suffix" {
  byte_length = 4
}
resource "aws_s3_bucket" "demo" {
  bucket = "linuxlab-${random_id.suffix.hex}"
}

random_id.suffix.hex, 8-символьный hex (4 байта * 2). Уникален при создании, дальше зафиксирован в state. На каждый последующий plan, тот же.

Подвиды

ResourceЧто генерируетГлавное use-case
random_idBytes → hex/base64Уникальные суффиксы имён
random_stringСтрока из символовИмена, пароли (не очень)
random_passwordСтрока с минимумом классовРеальные пароли (sensitive)
random_petПара слов «honest-zebra»Человекочитаемые имена для лабы
random_uuidUUID v4Корреляция, request IDs
random_integerЧисло в диапазонеСлучайный порт, индекс
random_shuffleПеремешивает списокAZ-распределение

keepers, перегенерация при изменении

hcl
resource "random_id" "suffix" {
  byte_length = 4
  keepers = {
    bucket_name = var.bucket_name
  }
}

Если var.bucket_name поменялся, random_id пересоздаётся → новый hex → новый бакет. Связка «при смене N → новый случай».

Без keepers значение никогда не меняется без явного taint / -replace.

time

Манипуляции с временем в HCL.

hcl
terraform {
  required_providers {
    time = {
      source  = "hashicorp/time"
      version = "~> 0.12"
    }
  }
}

time_static, momentum при создании

hcl
resource "time_static" "created_at" {}
resource "aws_s3_bucket" "demo" {
  bucket = "linuxlab-${formatdate("YYYYMMDD", time_static.created_at.rfc3339)}"
}

Фиксирует timestamp в state при первом apply. Дальше, не меняется. Полезно для иммутабельных меток (имя бакета содержит дату создания).

time_sleep, задержка в apply

hcl
resource "aws_iam_role" "app" {
  name = "app"
  # ...
}
resource "time_sleep" "wait_for_iam" {
  depends_on      = [aws_iam_role.app]
  create_duration = "30s"
}
resource "aws_eks_cluster" "demo" {
  depends_on = [time_sleep.wait_for_iam]
  # ...
}

IAM-роль создана, но AWS eventually consistent, пока propagation, eks не видит роль. time_sleep ждёт 30 секунд между ними.

Это обходной путь, не решение. Если можно увидеть готовность через data source, лучше так. Если нет, sleep. Но он есть.

time_rotating

hcl
resource "time_rotating" "cert" {
  rotation_days = 30
}

Атрибут id меняется каждые 30 дней. В связке с random_password

  • keepers даёт «ротировать пароль раз в месяц». Редко полезно, обычно секрет-менеджеры (Vault) делают это лучше.

null_resource (устаревший)

Старый паттерн, «не-ресурс» из провайдера null, чтобы повесить triggers и provisioner:

hcl
resource "null_resource" "bootstrap" {
  triggers = {
    version = var.script_version
  }
  provisioner "local-exec" {
    command = "./bootstrap.sh"
  }
}

Работает до сих пор, но не используется в новом коде. Заменён на terraform_data.

terraform_data (с TF 1.4+)

Встроен в Terraform, не нужен отдельный provider.

hcl
resource "terraform_data" "bootstrap" {
  input = var.script_version
  triggers_replace = [var.script_version]
  provisioner "local-exec" {
    command = "./bootstrap.sh"
  }
}

Преимущества:

  • Не требует required_providers.null, встроен.
  • Может хранить значение (input): становится доступен через terraform_data.bootstrap.output.
  • triggers_replace, список, при изменении любого → ресурс пересоздаётся.

terraform_data как «buffer» для значения

hcl
variable "image_tag" {
  type    = string
  default = "latest"
}
resource "terraform_data" "image_version" {
  input = var.image_tag
}
resource "aws_ecs_task_definition" "app" {
  # ...
  container_definitions = jsonencode([{
    name  = "app"
    image = "myrepo/app:${terraform_data.image_version.output}"
  }])
  lifecycle {
    replace_triggered_by = [terraform_data.image_version]
  }
}

При смене tag, task definition пересоздаётся принудительно через replace_triggered_by. Это паттерн «канарейка»: связать lifecycle тяжёлого ресурса с лёгким индикатором.

Когда какой провайдер

НужноИспользуй
Уникальный суффикс имениrandom_id
Сильный парольrandom_password
Метка времени созданияtime_static
Подождать пока AWS «дойдёт»time_sleep
Триггер пересоздания при изменении Xterraform_data с triggers_replace
Прогнать local-exec при измененииterraform_data с provisioner
Хранить вычисленное значение между resourcesterraform_data.input/output

Подводные камни

  • random в LocalStack, тот же что в реальном AWS. Этот провайдер не зависит от облака. Тесты с LocalStack полноценны для random/time/terraform_data.

  • random_password НЕ безопаснее random_string. Оба используют crypto/rand. Но random_password маркирован sensitive, не печатается в логах. Для секретов всегда random_password, чтобы пароль не утёк через terraform output / plan-логи.

  • Значение random_* ROTAТE'ится только через -replace или keepers. Просто apply его не меняет. Это фича, не баг: иначе на каждом apply бакет назвался бы иначе.

  • time_sleep тратит реальное время apply. 30s на каждом apply, плохо для CI. Используй только когда альтернатива не работает.

  • null_resource deprecated, не запрещён. Старый код можно не мигрировать; новый, пиши на terraform_data. Между ними нет разницы в поведении, есть в эстетике и интегрированности.

  • provisioner на terraform_data, last resort. Idempotency не гарантирована, errors сложно обрабатывать, sandboxing нулевой. Замена, local-exec через external provider data source (см. tf-archive-external-http).

  • random ресурс попадает в state с открытым значением. Это очевидно для random_id, но random_password тоже в state в открытом виде, sensitive только в выводе. Защищай state.

§ команды

bash
terraform state show random_id.suffix

Что внутри: byte_length, hex, b64_url, b64_std, dec. Все формы одного значения.

bash
terraform apply -replace=random_id.suffix

Принудительно перегенерировать. Каскадно пересоздаёт всё что от него зависит.

bash
terraform plan | grep terraform_data

Видеть triggers_replace в работе: что заставит пересоздать.

§ см. также

  • tf-provider-blockБлок provider: кому Terraform будет звонитьБлок provider настраивает плагин: в какой регион AWS обращаться, какие endpoints использовать, какие credentials брать. Один такой блок на провайдера в большинстве случаев хватит.
  • tf-resource-lifecyclelifecycle: управляем поведением resourceБлок lifecycle настраивает четыре поведения: create_before_destroy (zero-downtime), prevent_destroy (защита от удаления), ignore_changes (игнор drift по атрибутам), replace_triggered_by (пересоздать по сигналу).
  • tf-archive-external-httparchive, external, http: данные снаружи в HCLТри провайдера для получения данных снаружи Terraform. `archive`, упаковка файлов в zip (lambda code, layers). `external`, вызов любого скрипта с JSON I/O. `http`. GET-запрос к URL, парс ответа. Все три, data sources, читают, не пишут. Полезны где declarative HCL не доходит.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки