🏗️ Advanced Patterns & Import
Dynamic blocks, moved block, import, lifecycle hooks, refactoring
🔄 Dynamic Blocks
Takrorlanuvchi nested block larni dinamik yaratish. `dynamic "ingress"` va `content` block. `for_each` bilan combine qilinadi. Masalan: security group rules listdan. Complex resource (ALB listener rules, IAM policy statements) uchun juda foydali.
📦 moved Block (Terraform 1.1+)
Resursni rename yoki module ga ko'chirganda state muammosini hal qiladi. `terraform state mv` o'rniga declarative. `moved { from = aws_instance.old to = aws_instance.new }`. Plan da ko'rsatiladi, no destroy+recreate. Module restructuring da zarur.
📥 import Block (Terraform 1.5+)
Mavjud resursni Terraform boshqaruviga olish — declarative. `import { to = aws_s3_bucket.main id = "my-bucket-name" }`. `terraform plan -generate-config-out=generated.tf` — .tf ham generatsiya qiladi. Eski: `terraform import` buyruq (hali ishlaydi).
🔧 Lifecycle Hooks
`lifecycle` block ichida: create_before_destroy — yangi resurs avval, keyin eski o'chiriladi (zero downtime). prevent_destroy — destroy dan himoya. ignore_changes — qaysi atributlar o'zgarsada Terraform e'tibor bermasin (masalan, ami). replace_triggered_by — boshqa resurs o'zgarganda recreate.
💡 Asosiy nuqtalar
- dynamic block: takrorlanuvchi nested block larni for_each bilan
- moved block: rename/refactor, no destroy
- import block (1.5+): declarative import
- create_before_destroy: zero downtime replace
- ignore_changes: drift qabul qilish
- prevent_destroy: production resursni himoya
📋 Kod misoli
# 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]
}
}
🎯 Imtihon maslahatlari
- dynamic block — faqat resource ning nested block lari uchun (top-level resource emas)
- moved block vs terraform state mv: moved = declarative (kodni review qilish mumkin), state mv = imperative
- import block (1.5+) + generate-config-out → .tf fayl avtomatik yaratiladi
- ignore_changes = ["ami"] — instance ami o'zgarsa Terraform e'tibor bermaydi (ASG launch template pattern)
- replace_triggered_by — dependency chain da rebuild trigger
⚠️ Ko'p adashadigan
- dynamic block ni for_each meta-argument bilan aralashtirib yuborish — dynamic=nested block iterator, for_each=resource iterator
- moved block destroy+recreate qiladi deb o'ylash — moved faqat state mapping o'zgartiradi
- import block .tf faylni ham yaratadi deb o'ylash — faqat -generate-config-out bilan
🧠 Eslab qolish: "DMIL" = Dynamic (blocks), Moved (refactor), Import (existing), Lifecycle (hooks) — Terraform 4 advanced pattern
Advanced Patterns & Import bo'yicha o'zingizni sinab ko'ring
Bepul interaktiv quiz, mock imtihon va to'liq darslar — CertMaster platformasida.
Bepul boshlash →