Conditionals
Syntax:
condition ? true_value : false_valueEnvironment-based instance type
variable "environment" {
default = "dev"
}
resource "aws_instance" "web" {
ami = "ami-0199ac7c9fbf9ed83"
instance_type = var.environment == "prod" ? "t3.medium" : "t3.micro"
}environment | Instance type |
|---|---|
dev | t3.micro |
prod | t3.medium |
Enable monitoring only in prod
resource "aws_instance" "web" {
ami = "ami-0199ac7c9fbf9ed83"
instance_type = "t3.micro"
monitoring = var.environment == "prod" ? true : false
}Useful functions
| Function | Purpose | Example result |
|---|---|---|
upper("terraform") | Uppercase | TERRAFORM |
lower("TERRAFORM") | Lowercase | terraform |
length(["dev","qa","prod"]) | Length | 3 |
contains(["dev","qa","prod"], "prod") | Membership | true |
file("userdata.sh") | Read file contents | script body |
lookup(map, "prod") | Map lookup | mapped value |
format("%s-bucket", "dev") | Format string | dev-bucket |
lookup example
variable "instance_types" {
default = {
dev = "t3.micro"
prod = "t3.medium"
}
}
output "instance_type" {
value = lookup(var.instance_types, "prod")
}file example
user_data = file("userdata.sh")Loops with count
Create N identical resources:
resource "aws_instance" "web" {
count = 3
ami = "ami-0199ac7c9fbf9ed83"
instance_type = "t3.micro"
tags = {
Name = "server-${count.index}"
}
}Creates web[0], web[1], web[2] named server-0 … server-2.
output "instance_ids" {
value = aws_instance.web[*].id
}Loops with for_each
Better when each resource has a unique key:
resource "aws_s3_bucket" "bucket" {
for_each = toset(["dev", "qa", "prod"])
bucket = "${each.key}-bucket-demo"
}resource "aws_instance" "server" {
for_each = toset(["frontend", "backend", "database"])
ami = "ami-0199ac7c9fbf9ed83"
instance_type = "t3.micro"
tags = {
Name = each.key
}
}count vs for_each
count | for_each | |
|---|---|---|
| Driven by | Number | Map / set of keys |
| Index | count.index | each.key / each.value |
| Best for | Identical copies | Named / unique resources |
| Removing item 1 of 3 | Can shuffle indexes | Stable keys |
Prefer for_each when resources have meaningful names. Removing the middle item of a count list can force unrelated recreations.