הקלדה חזקה של משתנה.
→פרימיטיבים: `string`, `number`, `bool`. אוספים: `list(<type>)`, `set(<type>)`, `map(<type>)`. מבניים: `object({...})`, `tuple([...])`. השתמש ב-`any` רק כאשר פולימורפי באמת.
מקור↗
הגבלת `environment` ל-dev/staging/prod.
→`variable "environment" { validation { condition = contains(["dev","staging","prod"], var.environment); error_message = "..." } }`. מותרים מספר בלוקי `validation`; כולם חייבים לעבור.
מקור↗
הוצאת סיסמת מסד נתונים מבלי שהיא תופיע ב-`terraform output`.
→`output "db_password" { value = ...; sensitive = true }`. ה-CLI מציג `(sensitive value)`. עדיין קריא באמצעות `terraform output db_password` או `-json` (בכוונה — עבור סקריפטים).
מקור↗
חשב ערך פעם אחת ורב השתמש בו על פני משאבים רבים.
→`locals { common_tags = merge(var.tags, { Project = var.project }) }`. הפניה כ-`local.common_tags`. לא ניתן לעקוף מבחוץ למודול.
מקור↗
חפש AMI קיים מבלי לנהל אותו.
→`data "aws_ami" "ubuntu" { most_recent = true; filter { ... } }`. קריאה בלבד. תכונות הפניה כ-`data.aws_ami.ubuntu.id`.
מקור↗
צור N משאבים דומים — בחר `count` או `for_each`.
→`for_each` (עם map או set) כאשר לפריטים יש זהות יציבה (שמות אזורים, מפתחות סביבה). `count` עבור "אני צריך N עותקים, הסדר לא משנה, הזהות היא רק אינדקס". הוספה/הסרה באמצע `count` גורמת להרס/יצירה מחדש; `for_each` שומרת על זהות.
מקור↗
צור משאב אחד לכל פריט ברשימת מחרוזות.
→`for_each = toset(["a", "b", "c"])`. `each.key` ו-`each.value` שניהם נותנים את המחרוזת. עבור מפות: `for_each = var.users` — `each.key` = מפתח מפה, `each.value` = ערך מפה.
מקור↗
יצירת מספר משתנה של בלוקים מקוננים (לדוגמה, כללי ingress).
→`dynamic "ingress" { for_each = var.rules; content { from_port = ingress.value.from; ... } }`. הארגומנט `iterator` יכול לשנות את שם האיטרטור במידת הצורך.
מקור↗
קבל רשימה של תכונות על פני כל המופעים של משאב `count`.
→`aws_instance.web[*].id` מחזיר רשימת מזהים. עובד עם `count` ו-`for_each` (אבל `for_each` מייצר מפה לא מסודרת, אז `values(aws_instance.web)[*].id`).
מקור↗
הגדר ערך בהתבסס על תנאי.
→תנאי משולש: `var.is_prod ? 5 : 1`. שני הענפים חייבים לייצר את אותו סוג.
מקור↗
שלב שתי מפות; ערכי המפה השנייה מנצחים בהתנגשות מפתחות.
→`merge(local.defaults, local.overrides)`. המפה הימנית ביותר מנצחת. שימושי לקומפוזיציית תגים.
מקור↗
קרא ערך מפה עם ברירת מחדל אם המפתח חסר.
→`lookup(var.config, "region", "us-east-1")`. מחזיר את ברירת המחדל כאשר המפתח אינו קיים. עבור מבנים אופציונליים עמוקים, העדף את ה-`try()` האופציונלי.
מקור↗
מזג רשימות מקוננות לרשימה שטוחה.
→`flatten([["a","b"], ["c"], [["d","e"]]])` → `["a","b","c","d","e"]`. משטח רשימות באופן רקורסיבי; שומר על הסדר.
מקור↗
הטמעת מפת Terraform למסמך מדיניות IAM.
→`jsonencode({Version = "2012-10-17", Statement = [...]})`. מייצר מחרוזת JSON. הפוך: `jsondecode()`.
מקור↗
רנדר סקריפט user-data מבוסס תבנית עם ערכים ממשתנים.
→`templatefile("init.sh.tpl", { region = var.region, env = var.env })`. התבנית משתמשת בתחביר `${region}`. חלופה חדשה יותר לרינדור סטטי: `file()` + `format()`.
מקור↗
חתוך CIDRs של subnet מתוך טווח VPC.
→`cidrsubnet("10.0.0.0/16", 8, 0)` → `10.0.0.0/24`. ארגומנט ראשון = הורה, שני = סיביות להרחבה, שלישי = מספר subnet.
מקור↗
קרא ערך שאולי לא קיים; חזור לברירת מחדל.
→`try(yamldecode(file("config.yaml")), { defaults = true })`. מעריך משמאל לימין; מחזיר את הביטוי הראשון שאינו גורם לשגיאה.
מקור↗
בצע איטרציה על קבצים התואמים ל-glob.
→`fileset(path.module, "configs/*.json")` מחזיר סט של נתיבים. שלב עם `for_each` כדי לנהל משאב אחד לכל קובץ.
מקור↗
אותו ספק בשני אזורים (לדוגמה, AWS us-east-1 + us-west-2).
→שני בלוקי `provider "aws" { alias = "..." }`. משאבים בוחרים באמצעות `provider = aws.us_west`. מודולים מקבלים aliases באמצעות `configuration_aliases`.
מקור↗
הפעל פקודת shell על VM שנוצר לאחרונה.
→`remote-exec` provisioner בתוך משאב. כלי מוצא אחרון — העדף cloud-init, user data, או configuration management. Provisioners אינם מתועדים ב-state ואינם רצים שוב בעת סחף.
מקור↗
הפעל פקודה שאינה תואמת למשאב ענן (לדוגמה, קריאת CLI).
→`resource "null_resource" "trigger" { triggers = { sha = sha1(file(".")) }; provisioner "local-exec" { command = "..." } }`. רץ מחדש כאשר `triggers` משתנים.
מקור↗
אמת באופן רציף אינווריאנט בזמן ריצה (לדוגמה, נקודת קצה בריאותית מחזירה 200) מבלי לחסום apply.
→`check "endpoint" { data "http" "h" { url = "..." }; assert { condition = data.http.h.status_code == 200; error_message = "..." } }`. רץ ב-plan/apply; כישלון הוא אזהרה, לא שגיאה חמורה.
למה: `check` מאפשר מקורות נתונים בעלי scope שניתן להשתמש בהם רק בתוך הבדיקה. `precondition`/`postcondition` הם שגיאות חמורות ב-plan/apply.
מקור↗
כשל את ה-plan אם AMI ישן מדי.
→`lifecycle { precondition { condition = data.aws_ami.x.creation_date > "2024-01-01"; error_message = "..." } }`. כשל חמור, מוערך לפני/אחרי לפי הצורך.
מקור↗
משתנה עם ערך מיקום בצורה קבועה.
→`type = tuple([string, number, bool])` דורש בדיוק שלושה אלמנטים בסדר זה. שונה מרשימה (הומוגנית, אורך משתנה).
מקור↗
הקלדה חזקה של קלט מובנה (לדוגמה, `database = { instance_class = string, allocated_storage = number }`).
→`type = object({ instance_class = string, allocated_storage = number, multi_az = optional(bool, false) })`. `optional(<type>, <default>)` הופך תכונות לאופציונליות.
מקור↗
כיצד נטענים קבצי `*.tfvars`?
→`terraform.tfvars` ו-`*.auto.tfvars` נטענים אוטומטית (סדר לקסיקלי עבור `auto`). שמות אחרים דורשים `-var-file=path.tfvars`.
מקור↗
כתוב בדיקות אוטומטיות עבור מודול Terraform.
→קבצי `.tftest.hcl` עם `run "name" { command = plan|apply, assert { condition = ..., error_message = ... } }`. `command = plan` הוא ללא תופעות לוואי; `command = apply` אכן יוצר משאבים.
מקור↗
העבר משתנים להרצות בדיקה.
→בלוק `variables { ... }` ברמת הקובץ חל על כל ההרצות. בלוק `variables { ... }` לכל הרצה עוקף עבור הרצה זו בלבד.
מקור↗