CertMaster

🏗️ Advanced Patterns & Import

Dynamic blocks, moved block, import, lifecycle hooks, refactoring

Terraform Associate · TF-Associate · ⏱️ 20 min · ❓ 4 вопр.

🔄 Dynamic Blocks

Динамическое создание повторяющихся вложенных блоков. `dynamic "ingress"` и блок `content`. Комбинируется с `for_each`. Например: список правил security group. Очень полезно для сложных ресурсов (ALB listener rules, IAM policy statements).

📦 moved Block (Terraform 1.1+)

Решает проблему со state при переименовании ресурса или перемещении в модуль. Декларативная альтернатива `terraform state mv`. `moved { from = aws_instance.old to = aws_instance.new }`. Отображается в plan, без destroy+recreate. Необходим при реструктуризации модулей.

📥 import Block (Terraform 1.5+)

Передача существующего ресурса под управление Terraform — декларативно. `import { to = aws_s3_bucket.main id = "my-bucket-name" }`. `terraform plan -generate-config-out=generated.tf` — также генерирует .tf-файл. Старый способ: команда `terraform import` (по-прежнему работает).

🔧 Lifecycle Hooks

Внутри блока `lifecycle`: create_before_destroy — сначала создаётся новый ресурс, затем удаляется старый (zero downtime). prevent_destroy — защита от удаления. ignore_changes — Terraform игнорирует изменения указанных атрибутов (например, ami). replace_triggered_by — пересоздание при изменении другого ресурса.
💡 Ключевые моменты
📋 Пример кода
# Dynamic blocks: security group rules
variable "ingress_rules" {
  default = [
    { port = 80,  cidr = "0.0.0.0/0" },
    { port = 443, cidr = "0.0.0.0/0" },
    { port = 22,  cidr = "10.0.0.0/8" }
  ]
}

resource "aws_security_group" "web" {
  dynamic "ingress" {
    for_each = var.ingress_rules
    content {
      from_port   = ingress.value.port
      to_port     = ingress.value.port
      protocol    = "tcp"
      cidr_blocks = [ingress.value.cidr]
    }
  }
}

# moved block: aws_instance.web -> module.compute.aws_instance.web
moved {
  from = aws_instance.web
  to   = module.compute.aws_instance.web
}

# import block (Terraform 1.5+)
import {
  to = aws_s3_bucket.existing
  id = "my-existing-bucket"
}

# lifecycle
resource "aws_instance" "web" {
  ami           = data.aws_ami.latest.id
  instance_type = "t3.micro"
  lifecycle {
    create_before_destroy = true
    prevent_destroy       = true
    ignore_changes        = [ami]
  }
}
🎯 Советы для экзамена
⚠️ Частые ошибки
🧠 Для запоминания: "DMIL" = Dynamic (blocks), Moved (refactor), Import (existing), Lifecycle (hooks) — 4 продвинутых паттерна Terraform

Проверьте себя по теме «Advanced Patterns & Import»

Бесплатные интерактивные тесты, пробный экзамен и полные уроки — на платформе CertMaster.

Начать бесплатно →