TFLAB15-String Functions: Manipulating Text in HCL

String Functions: Manipulating Text in HCL

🔧 Terraform Core ⭐ Beginner join() split() format() replace() upper() / lower() substr()

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"