OpenTofu provides a rich set of built-in functions, operators, and conditional expressions that enhance your infrastructure-as-code (IaC) workflows. This guide will show you how to leverage the interactive console and explore numeric, string, list, and map functions with practical examples.
Launching the OpenTofu Console
To experiment with functions and interpolations in a live environment, start the interactive console:
The OpenTofu console evaluates HCL expressions in real time. You can inspect variables, resources, and file contents without applying changes.
Exploring Functions in the Console
Given this configuration snippet:
resource "aws_iam_policy" "adminUser" {
name = "AdminUsers"
policy = file ( "admin-policy.json" )
}
resource "local_file" "pet_count" {
filename = var . filename
count = length (var . filename )
}
resource "local_file" "pet_each" {
filename = var . filename
for_each = toset (var . region )
}
variable "region" {
type = list ( string )
default = [ "us-east-1" , "us-east-1" , "ca-central-1" ]
description = "A list of AWS Regions"
}
Try these commands in the console:
> file("/root/opentofu-projects/main.tf")
<<EOT
resource "aws_instance" "development" {
ami = "ami-0edab43b6fa892279"
instance_type = "t2.micro"
}
EOT
> length(var.region)
3
> toset(var.region)
toset([
"ca-central-1",
"us-east-1",
])
file(path) reads the file’s content.
length(list) returns the number of elements (here, 3).
toset(list) converts a list to a set, removing duplicates.
Numeric Functions
Numeric functions allow you to compare values and perform rounding:
variable "num" {
type = set ( number )
default = [ 250 , 10 , 11 , 5 ]
description = "A set of numbers"
}
> max(-1, 2, -10, 200, -250)
200
> min(-1, 2, -10, 200, -250)
-250
> max(var.num...)
250
> ceil(10.1)
11
> floor(10.9)
10
Function Description Example max(…) Returns the largest number max(1,5,3) → 5min(…) Returns the smallest number min(1,5,3) → 1ceil(n) Rounds up to the nearest integer ceil(10.1) → 11floor(n) Rounds down to the nearest integer floor(10.9) → 10
Use the expansion operator ... to unpack a collection into individual arguments.
String Functions
Manipulate and transform text with string functions:
variable "ami" {
type = string
default = "ami-xyz,AMI-ABC,ami-efg"
description = "A comma-separated list of AMI IDs"
}
> split(",", var.ami)
["ami-xyz", "AMI-ABC", "ami-efg"]
> lower(var.ami)
ami-xyz,ami-abc,ami-efg
> upper(var.ami)
AMI-XYZ,AMI-ABC,AMI-EFG
> title(var.ami)
Ami-Xyz,Ami-Abc,Ami-Efg
> substr(var.ami, 0, 7)
ami-xyz
> join(";", split(",", var.ami))
ami-xyz;AMI-ABC;ami-efg
Function Description split(sep, string) Splits a string into a list of substrings join(sep, list) Joins a list into a single string lower(string) Converts all characters to lowercase upper(string) Converts all characters to uppercase title(string) Capitalizes the first letter of each word substr(string, o, l) Extracts a substring starting at offset o, length l
Collection Functions
List Operations
variable "ami_list" {
type = list ( string )
default = [ "ami-xyz" , "AMI-ABC" , "ami-efg" ]
description = "A list of AMI IDs"
}
> length(var.ami_list)
3
> index(var.ami_list, "AMI-ABC")
1
> element(var.ami_list, 2)
ami-efg
> contains(var.ami_list, "AMI-ABC")
true
Function Description length(list) Returns the number of items index(list, value) Finds the position of value element(list, index) Retrieves the element at index contains(list, value) Checks if value exists (case-sensitive)
Map Operations
variable "ami_map" {
type = map ( string )
default = {
"us-east-1" = "ami-xyz"
"ca-central-1" = "ami-efg"
"ap-south-1" = "ami-ABC"
}
description = "Map of AMI IDs per region"
}
> keys(var.ami_map)
["ap-south-1", "ca-central-1", "us-east-1"]
> values(var.ami_map)
["ami-ABC", "ami-efg", "ami-xyz"]
> lookup(var.ami_map, "ca-central-1")
ami-efg
> lookup(var.ami_map, "us-west-2", "ami-pqr")
ami-pqr
Function Description keys(map) Returns a list of all keys values(map) Returns a list of all values lookup(map, key, default) Retrieves map[key] or default if the key is absent
Calling lookup without a default value will error if the key does not exist.
Summary
By mastering these built-in functions, operators, and expressions, you can write more concise, powerful, and maintainable OpenTofu configurations. Experiment in the console, integrate them into your modules, and streamline your IaC development.
References