Как вы делаете простую конкатенацию строк в Terraform?

Должно быть, я невероятно глуп, но не могу понять, как сделать простую конкатенацию строк в Terraform.

У меня есть следующие данные 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"
    }
}

Так когда env_name="prod" Я хочу выход app.api.mydomain.com и для всего остального - скажем env_name="staging" я хочу app.api.staging.mydomain.com,

Но вышесказанное выведет app.api.stagingmydomain.com <- заметить пропущенную точку после staging,

Я попытался констатировать "." если env_name было не "prod", а ошибками Terraform:

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

Ошибка __builtin_StringToInt: strconv.ParseInt: parsing ""

concat() Функция в TF, кажется, для списков, а не строк.

Так как заголовок говорит: Как вы делаете простую конкатенацию строк в Terraform?

Я не могу поверить, я спрашиваю, как соединить 2 строки вместе XD

Обновить:

Для тех, у кого есть подобная проблема, я сделал этот ужасный обходной путь в настоящее время:

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

6 ответов

Решение

Попробуйте ниже ресурс данных:

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

Я знаю, что на это уже был дан ответ, но я хотел поделиться своим любимым:

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

Пример из реального мира:

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

Подробнее:
https://www.terraform.io/docs/configuration/functions/format.html

Итак, чтобы добавить простой ответ на простой вопрос:

  • заключите все строки, которые вы хотите объединить, в одну пару ""
  • ссылочные переменные внутри кавычек с ${var.name}

Пример: var.foo следует объединить с bar строка и разделены тире

Решение: "${var.foo}-bar"

Для Terraform 0.12 и новее вы можете использовать join() функция:

join(separator, list)

Пример:

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

Если вы просто хотите объединить без разделителя, например "foo"+"bar" = "foobar", тогда:

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

Ссылка: https://www.terraform.io/docs/configuration/functions/join.html

Используйте синтаксис интерполяции для версий < 0.12

Вот простой пример:

      output "s3_static_website_endpoint" {
  value = "http://${aws_s3_bucket.bucket_tf.website_endpoint}"
}

См. документы Terraform Interpolation: https://developer.hashicorp.com/terraform/language/expressions/strings#string-templates .

После долгих исследований это наконец сработало для меня. Я пытался следовать https://www.hashicorp.com/blog/terraform-0-12-preview-first-class-expressions/, но это не сработало. Кажется, что строка не может быть обработана внутри выражений.

data "aws_vpc" "vpc" {
  filter {
    name   = "tag:Name"
    values = ["${var.old_cluster_fqdn == "" ? "${var.cluster_fqdn}" : "${var.old_cluster_fqdn}"}-vpc"]
    
  }
}
Другие вопросы по тегам