Terraform: How to convert a number to a string and vice versa

Updated: February 4, 2024 By: Guest Contributor Post a comment

Introduction

Working with Terraform, you often find yourself in situations where data types need to be converted from one form to another. Terraform, being a robust infrastructure as code (IaC) tool, offers flexible type conversion mechanisms. This tutorial focuses on converting data between numbers and strings, a common requirement for many Terraform projects. We’ll start from the basics and gradually move to more advanced scenarios, providing code examples and expected outputs.

Basics of Type Conversion in Terraform

Before diving into conversions, it’s crucial to understand that Terraform is a statically typed language. Each variable and value in Terraform has a specific type. However, Terraform also automatically converts between types when it’s obvious, which is known as implicit conversion. In situations where automatic conversion does not work, explicit conversion functions come into play.

Here are the basic functions for type conversions between numbers and strings:

  • tostring(): Converts its argument to a string type.
  • tonumber(): Converts its argument to a number type.

Converting Numbers to Strings

Let’s start with simple conversions using the tostring() function.

variable "example_number" {
  type = number
  default = 42
}

output "converted_string" {
  value = tostring(var.example_number)
}

Output:

converted_string = "42"

This example shows how to convert a number to a string. Using tostring(), the number 42 is effortlessly turned into a “42” string.

Converting Strings to Numbers

Conversely, converting strings to numbers is just as straightforward.

variable "example_string" {
  type = string
  default = "24"
}

output "converted_number" {
  value = tonumber(var.example_string)
}

Output:

converted_number = 24

In this example, we have successfully converted a “24” string into the number 24 using tonumber().

Working with Expressions

Often, you’ll need to perform conversions within more complex expressions. Here’s how to handle that.

resource "aws_instance" "example" {
  ami           = "ami-12345678"
  instance_type = "t2.micro"

  tags = {
    "Name" = "ExampleInstance-${tostring(tonumber(var.instance_number) + 1)}"
  }
}

This code snippet demonstrates the conversion of a variable to a number, incrementing it, and then converting it back to a string to form part of a resource tag. Note how conversions are seamlessly combined with arithmetic operations.

Advanced Scenarios: Dealing with Null and Boolean Values

At more advanced levels, you might need to convert non-string or non-number types, like null or boolean, to strings or numbers. Terraform provides broad flexibility.

Here’s how to convert a boolean to a string:

variable "example_boolean" {
  type = bool
  default = true
}

output "boolean_to_string" {
  value = tostring(var.example_boolean)
}

And converting a null value to a string might look like this:

output "null_to_string" {
  value = tostring(null)
}

Both examples illustrate the power and versatility of the tostring() function in handling various data types beyond just numbers.

Combining with Terraform Functions

Terraform offers a plethora of built-in functions that can be combined with type conversions for powerful configurations. For instance, manipulating strings or numbers before conversion can significantly enhance your infrastructure code’s flexibility and readability.

An example could involve formatting numbers as strings in a specific way before appending them to another string:

output "formatted_output" {
  value = format("Number: %s", tostring(var.example_number))
}

This uses the format() function alongside tostring() to create a formatted string output.

Interpolating and Type Conversions

At the heart of Terraform’s expressiveness lies the ability to interpolate expressions within strings. When doing so, type conversions can be implicitly handled by Terraform, but knowing how to explicitly control these conversions ensures your code behaves as expected.

Combining interpolation with explicit type conversion:

output "interpolation_example" {
  value = "Value is: ${tostring(var.interpolated_number)}"
}

This technique explicitly converts a variable to a string within an interpolated string, offering precise control over the output.

Conclusion

Understanding and efficiently utilizing type conversion functions in Terraform enhances your infrastructure as code precision and reliability. While Terraform does an admirable job at automatically converting types in many scenarios, mastering explicit conversions like tostring() and tonumber() equips you with the capability to handle more complex and nuanced cases, keeping your configurations clean, understandable, and error-free.