Terraform

How to Use the If / Else Statement in Terraform – Examples

Terraform IF Statement

In this short article, we will take a look at the Terraform if statement (hint, it doesn’t exist) and look at a few examples. Let’s dive in!

Conditional Expressions in Terraform

What is the conditional structure of Terraform?

condition ? true_val : false_val

Read more about conditional expressions in Terraform.

Example 1 - Check if a variable is null in Terraform

To check if a variable is null, run:

variable "null_value" {
 type    = string
 default = null
}

locals {
 is_null = var.null_value == null ? true : false
}

output "is_null" {
 value = local.is_null
}

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
is_null = true

Example 2 - Run a Terraform block if the condition is true

The example below will create the null resource if the condition is true, and because two is greater than one, this will be true.

resource "null_resource" "this" {
 count = 2 > 1 ? 1 : 0
}

Example 3 - Check if a variable is set to a defined value

For example, the statement below checks if the variable var.server is set to “UbuntuServer”. If it is true, then count = 0 and will be deployed zero times. If it is set to anything else, then count = 1, and the resource will be deployed 1 time.

Note that Terraform does support traditional logical, equality, and comparison operators such as == (equal to) or != (not equal to) && (and), etc. These operators can be added together to make more complex conditionals.

count = var.server == "UbuntuServer" ? 0 : 1

Example 4 - Define defaults to replace invalid values

Another common use of conditional expressions is to define defaults to replace invalid values. The example below checks if the variable var.server is an empty string. If it is, then the value is “MicrosoftWindowsServer”. If not, then it is the actual value of var.server .

var.server != "" ? var.server : "MicrosoftWindowsServer"

Example 5 - Different result types

When creating a conditional expression, the two result types can be of any type. In the example below, we have an integer of 100 if the condition is true, and a string “UbuntuServer” if the condition is false.

var.server ? 100 : "UbuntuServer"

However, this can cause confusion as Terraform will attempt to find a type that they can both convert to and make those conversions automatically if so. In the above case, both can be converted to a String.

To avoid this, writing the condition with a specific conversion function is recommended (see below using the toString function):

var.server ? tostring(100) : "UbuntuServer"

Example 6 - If statements inside dynamic blocks

In this example, our security list has egress security rules only if each.value.enable_egress is set to true, otherwise, the dynamic block won’t be generated.

resource "oci_core_security_list" "this" {
 for_each       = var.sl_params
 compartment_id = oci_core_virtual_network.this[each.value.vcn_name].compartment_id
 vcn_id         = oci_core_virtual_network.this[each.value.vcn_name].id
 display_name   = each.value.display_name

 dynamic "egress_security_rules" {
   iterator = egress_rules
   for_each = each.value.enable_egress ? each.value.egress_rules : []
   content {
     stateless   = egress_rules.value.stateless
     protocol    = egress_rules.value.protocol
     destination = egress_rules.value.destination
   }
 }
}

Terraform Coalesce Function

locals{
  dev    = var.environment == "DEV" ? "uksouth" : ""
  uit 	 = var.environment == "UIT" ? "ukwest" : ""
  prod 	 = var.environment != "PROD" && var.environment != "UIT" ? "useast2" : ""
  region = coalesce(local.dev, local.uit, local.prod)
}

Key Points

We encourage you also to explore how Spacelift makes it easy to work with Terraform. If you need any help managing your Terraform infrastructure, building more complex workflows based on Terraform, and managing AWS credentials per run, instead of using a static pair on your local machine, Spacelift is a fantastic tool for this. If you want to learn more, create a free account today or book a demo with one of our engineers.

Note: New versions of Terraform will be placed under the BUSL license, but everything created before version 1.5.x stays open-source. OpenTofu is an open-source version of Terraform that will expand on Terraform’s existing concepts and offerings. It is a viable alternative to HashiCorp’s Terraform, being forked from Terraform version 1.5.6. OpenTofu retained all the features and functionalities that had made Terraform popular among developers while also introducing improvements and enhancements. OpenTofu works with your existing Terraform state file, so you won’t have any issues when you are migrating to it.

Manage Terraform Better with Spacelift

Build more complex workflows based on Terraform using policy as code, programmatic configuration, context sharing, drift detection, resource visualization and many more.

Start free trial
Terraform CLI Commands Cheatsheet

Initialize/ plan/ apply your IaC, manage modules, state, and more.

Share your data and download the cheatsheet