Избегайте дублирования в списках переменных terraform (Google Cloud Run)

У меня есть список переменных среды, которые я хочу сделать доступными для экземпляров Google Cloud Run (1 служба, 4 задания).

Переменные среды широко распределяются между этими заданиями, и если мне нужно добавить/изменить/удалить какую-либо из них, мне нужно сделать это 5 раз, очевидно, это создает возможности для возникновения ошибок, и я много повторяюсь.

Я подумал о переменной, содержащей все эти значения, а затем распаковал их в раздел containers объявления terraform.

resource "google_cloud_run_v2_job" "example_cloud_run_job" {
  # project, location, name, dependency info in here
  template {
    # template info such as parallelism and task count here
    template {
      # more info in here
      containers {
        # image, networking info, resources in here, but also a lot of environment variables!
        env {
          name  = "foo"
          value = var.bar
        }
        env {
          name  = "baz"
          value = var.qux
        }
        env {
          name  = "quux"
          value = var.corge
        }
        env {
          name  = "grault"
          value = var.garply
        }
      }
    }
  }
}

Я надеюсь, что смогу что-нибудь сделать, чтобы распаковать эти переменные в объект containers, аналогично тому, как мы могли бы сделать это в JavaScript/Typescript с помощью оператора ... или с помощью оператора * в Python. Я не могу найти это в документации Terraform и уверен, что я не первый, кто столкнулся с этой проблемой!

Я читал документацию и немного поигрался с кодом, но не нашел надежного подхода к этому.

Аналогично в HCL2 TF есть оператор для преобразования в tuple (и это тоже ...), но неясно, как это связано с проблемой, которую вы пытаетесь здесь решить. Пожалуйста, продемонстрируйте это на примере ввода и желаемого результата.

Matthew Schuchard 08.04.2024 15:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что вы можете сделать, так это использовать метааргумент for_each в сочетании с Dynamic. Вам также потребуется создать переменную, которая будет использоваться для перебора:

variable "env_vars" {
  type        = map(string)
  description = "Map of environment variables."

  default = {
    foo    = "some value"
    baz    = "some value"
    quux   = "some value"
    grault = "some value"
  }
}

resource "google_cloud_run_v2_job" "example_cloud_run_job" {
  # project, location, name, dependency info in here
  template {
    # template info such as parallelism and task count here
    template {
      # more info in here
      containers {
        dynamic "env" {
          for_each = var.env_vars
          content {
            name  = env.key
            value = env.value
          }
        }
      }
    }
  }
}

Это определенно похоже на ответ на истинный вопрос выше. Текущее содержание вопроса подразумевает, что type в настоящее время может быть list(map(string)), и в этом случае его следует преобразовать в map(string), как показано в этом ответе для повышения эффективности.

Matthew Schuchard 08.04.2024 15:52

Для меня это просто настоящее удовольствие! Я также адаптировал его для случаев, когда мы получаем переменные среды из секретов — я приму и обновлю ответ.

Ash Oldershaw 08.04.2024 17:16

Другие вопросы по теме

Похожие вопросы

Ошибка при создании подсетей с помощью Terraform
Terraform позволяет воссоздавать ресурс, когда мы используем блок данных в исходных модулях
Terraform Cloud SNS SQS подписка на перекрестную учетную запись в другом регионе произошла ошибка операции SNS: ошибка ответа GetSubscriptionAttributes https
Terraform: как передать несколько значений в качестве вывода и сопоставить их с переменными другого модуля
Terraform aws_s3_bucket_lifecycle_configuration не может удалить содержимое папки S3
Проверка правильности команды Terraform Graph конвейера сборки Azure Yaml
Настройки группы безопасности Terraform RDS
Получает ошибку в коде Azure terraform: данный сервер не поддерживает функцию частной конечной точки. пожалуйста, создайте новый сервер с поддержкой частной конечной точки
Пиринг виртуальных сетей и конечные точки служб: как разрешить взаимодействие двух служб приложений Azure
Как создать фильтр terraform для источника данных с подстановочными знаками