How do you do simple string concatenation in Terraform?

Terraformterraform0.11

Terraform Problem Overview


I must be being incredibly stupid but I can't figure out how to do simple string concatenation in Terraform.

I have the following data null_data_source:

data "null_data_source" "api_gw_url" {
    inputs = {
      main_api_gw = "app.api.${var.env_name == "prod" ? "" : var.env_name}mydomain.com"
    }
}

So when env_name="prod" I want the output app.api.mydomain.com and for anything else - let's say env_name="staging" I want app.api.staging.mydomain.com.

But the above will output app.api.stagingmydomain.com <-- notice the missing dot after staging.

I tried concating the "." if the env_name was anything but "prod" but Terraform errors:

data "null_data_source" "api_gw_url" {
    inputs = {
      main_api_gw = "app.api.${var.env_name == "prod" ? "" : var.env_name + "."}mydomain.com"
    }
}

The error is __builtin_StringToInt: strconv.ParseInt: parsing ""

The concat() function in TF appears to be for lists not strings.

So as the title says: How do you do simple string concatenation in Terraform?

I can't believe I'm asking how to concat 2 strings together XD

Update:

For anyone that has a similar issue I did this horrific workaround for the time being:

main_api_gw = "app.api.${var.env_name == "prod" ? "" : var.env_name}${var.env_name == "prod" ? "" : "."}mydomain.com"

Terraform Solutions


Solution 1 - Terraform

I know this was already answered, but I wanted to share my favorite:

format("%s/%s",var.string,"string2")

Real world example:

locals {
 documents_path = "${var.documents_path == "" ? format("%s/%s",path.module,"documents") : var.documents_path}" 
}

More info:
https://www.terraform.io/docs/configuration/functions/format.html

Solution 2 - Terraform

Try Below data resource :

data "null_data_source" "api_gw_url" {
    inputs = {
      main_api_gw = "app.api${var.env_name == "prod" ? "." : ".${var.env_name}."}mydomain.com"
    }
}

Solution 3 - Terraform

so to add a simple answer to a simple question:

  • enclose all strings you want to concatenate into one pair of ""
  • reference variables inside the quotes with ${var.name}

Example: var.foo should be concatenated with bar string and separated by a dash

Solution: "${var.foo}-bar"

Solution 4 - Terraform

For Terraform 0.12 and later, you can use join() function:

join(separator, list)

Example:

> join(", ", ["foo", "bar", "baz"])
foo, bar, baz
> join(", ", ["foo"])
foo

If you just want to concatenate without a separator like "foo"+"bar" = "foobar", then:

> join("", ["foo", "bar"])
foobar

Reference: https://www.terraform.io/docs/configuration/functions/join.html

Use the Interpolation Syntax for versions < 0.12

Solution 5 - Terraform

after lot of research, It finally worked for me. I was trying to follow https://www.hashicorp.com/blog/terraform-0-12-preview-first-class-expressions/, but it did not work. Seems string can't be handled inside the expressions.

data "aws_vpc" "vpc" {
  filter {
    name   = "tag:Name"
    values = ["${var.old_cluster_fqdn == "" ? "${var.cluster_fqdn}" : "${var.old_cluster_fqdn}"}-vpc"]
    
  }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionForce HeroView Question on Stackoverflow
Solution 1 - TerraformJuan Manuel Garcia del MoralView Answer on Stackoverflow
Solution 2 - Terraformsarvesh shettyView Answer on Stackoverflow
Solution 3 - TerraformMarkusView Answer on Stackoverflow
Solution 4 - TerraformhuskygradView Answer on Stackoverflow
Solution 5 - TerraformMukund SharmaView Answer on Stackoverflow