Using Conditionals in Terraform

Today, we focus on leveraging conditionals in Terraform to control resource deployments dynamically. Conditionals help make your infrastructure configurations more adaptable and reusable, allowing you to fine-tune deployments based on specific criteria or input variables.

Understanding Conditionals in Terraform

Conditionals in Terraform allow you to deploy resources depending on particular requirements. The ternary operator (condition? true_value: false_value) allows you to dynamically specify values or decide whether a resource should be deployed.

variable "environment" {
  description = "Deployment environment"
  type        = string
  default     = "dev"
}

resource "aws_instance" "example" {
  instance_type = var.environment == "prod" ? "t2.large" : "t2.micro"
  ami           = "ami-12345678"
}

This evaluates whether the environment is set to "prod." If true, it assigns "t2.large" as the instance type; otherwise, it assigns "t2.micro."

Validations in Terraform

Validations allow you to set limitations on variables, ensuring that only legitimate or accepted values are presented when planning or applying. This eliminates runtime issues and ensures that your Terraform configuration follows best practices.

variable "instance_type" {
  description = "Instance type to use for the EC2 instance."
  type        = string

  validation {
    condition     = contains(["t2.micro", "t2.large"], var.instance_type)
    error_message = "Invalid instance type. Supported types are t2.micro and t3.large."
  }
}

You can also validate numeric variables, such as the number of instances to create:

variable "instance_count" {
  description = "Number of instances to launch."
  type        = number

  validation {
    condition     = var.instance_count > 0 && var.instance_count <= 3
    error_message = "Instance count must be between 1 and 3."
  }
}

Combining Conditionals with Validations

Conditional logic can be used with validations to generate extremely dynamic setups that retain input integrity.

variable "environment" {
  description = "Deployment environment"
  type        = string
  default     = "dev"

  validation {
    condition     = contains(["dev", "staging", "prod"], var.environment)
    error_message = "Environment must be either dev, staging, prod."
  }
}

variable "instance_type" {
  description = "Instance type to use for the EC2 instance."
  type        = string
  default     = var.environment == "prod" ? "t2.large" : "t2.micro"
}

Advanced Use Cases

Conditional Resource Deployment.
Conditionals can determine whether a resource is allocated at all. This is accomplished by utilizing the count or for_each parameter with a conditional statement.

variable "create_bucket" {
  description = "Whether to create an S3 bucket."
  type        = bool
  default     = false
}

resource "aws_s3_bucket" "s3_bucket" {
  count = var.create_bucket ? 1 : 0 # Bucket is created only if create_bucket is set to true.
  bucket = "s3-bucket"
}

Conditional Outputs

output "bucket_name" {
  value       = aws_s3_bucket.s3_bucket[0].id # output is provided only when the resource exists.
  condition   = var.create_bucket
  description = "Name of the created S3 bucket."
}

Key Takeaways

  • Conditionals: Use ternary expressions and conditional logic to dynamically set values and control deployments.

  • Validations: Implement validation blocks to enforce constraints on variables, ensuring robust and error-free configurations.

  • Combine conditionals and validations for more dynamic and flexible Terraform setups.

Mastering conditionals and validations allows you to develop smarter Terraform setups that adapt to a variety of conditions while retaining input integrity.