String Functions: Manipulating Text in HCL
Scenario
You are building a naming convention for resources. Bucket names must be lowercase with hyphens, tags need formatted strings, and some AWS resources have name length limits. You need to transform, concatenate, split, and truncate strings — all within HCL.
Your Objectives
- Use join() to combine a list into a single string.
- Use split() to break a string into a list.
- Use format() for printf-style string formatting.
- Use replace() to substitute characters in a string.
- Use upper(), lower(), trimspace(), and substr().
- Apply these functions in an S3 bucket name and tags.
Additional Context
Terraform has a rich set of built-in functions. They are called with function_name(arg1, arg2, ...) syntax — just like most programming languages. Functions are the only way to perform operations on values in HCL; there are no operators beyond basic arithmetic and the ternary.
main.tf
terraform {
required_version = ">= 1.5.0"
required_providers {
aws = { source = "hashicorp/aws", version = "~> 5.0" }
}
}
provider "aws" { region = "us-east-1" }
variable "project_name" { default = " My Cool App " }
variable "parts" { default = ["webapp", "prod", "us-east-1"] }
variable "raw_name" { default = "My_Cool_Bucket_2024" }
data "aws_caller_identity" "current" {}
locals {
# join() — combine list elements with a separator
joined = join("-", var.parts) # "webapp-prod-us-east-1"
# split() — break string into list
split_result = split("-", "webapp-prod-us-east-1") # ["webapp", "prod", "us-east-1"]
# format() — printf-style string formatting
formatted = format("arn:aws:s3:::%s/%s/*", "my-bucket", "data")
padded = format("bucket-%03d", 7) # "bucket-007"
# replace() — substitute characters
safe_name = replace(var.raw_name, "_", "-") # "My-Cool-Bucket-2024"
clean = replace(lower(var.raw_name), "_", "-") # "my-cool-bucket-2024"
# Case functions
upper_name = upper("terraform") # "TERRAFORM"
lower_name = lower("TERRAFORM") # "terraform"
title_name = title("hello world") # "Hello World"
# trimspace() — remove leading/trailing whitespace
trimmed = trimspace(var.project_name) # "My Cool App"
# substr() — extract substring: substr(string, offset, length)
short_name = substr(local.trimmed, 0, 6) # "My Coo"
# Practical: build a safe bucket name
bucket_name = lower(replace(trimspace(var.project_name), " ", "-"))
}
resource "aws_s3_bucket" "demo" {
bucket = "${local.bucket_name}-${data.aws_caller_identity.current.account_id}"
tags = {
FullName = local.trimmed
ShortName = local.short_name
Formatted = local.formatted
Joined = local.joined
ManagedBy = "terraform"
}
}outputs.tf
output "joined" { value = local.joined }
output "split_result" { value = local.split_result }
output "formatted" { value = local.formatted }
output "padded" { value = local.padded }
output "safe_name" { value = local.safe_name }
output "clean" { value = local.clean }
output "trimmed" { value = local.trimmed }
output "short_name" { value = local.short_name }
output "bucket_name" { value = aws_s3_bucket.demo.id }Workflow Commands
terraform init && terraform apply
terraform output -json
terraform destroy
✓ Expected Outputs
bucket_name = "my-cool-app-123456789012" clean = "my-cool-bucket-2024" formatted = "arn:aws:s3:::my-bucket/data/*" joined = "webapp-prod-us-east-1" padded = "bucket-007" safe_name = "My-Cool-Bucket-2024" short_name = "My Coo" split_result = ["webapp", "prod", "us-east-1"] trimmed = "My Cool App"

