Параллельные экземпляры через переменные терраформирования?

Я сбит с толку тем, что должны делать переменные терраформирования. Прямо сейчас они кажутся ужасно бесполезными для решения моей конкретной задачи, возможно, я действительно лаю не на то дерево. Допустим, у меня есть такая конфигурация:

variable "majorVersion" {
  type        = "string"
}

module "media-assets" {
  majorVersion   = "${var.majorVersion}"
  region         = "us-east-1"
  bucket         = "uploads-${var.majorVersion}"
  source         = "./modules/media-assets"
  user           = "appics-production"
}

Предположим, что сейчас просто модуль ресурсов определяет корзины S3. Все будет хорошо, если я запущу terraform так:

terraform apply -var="majorVersion=v1"

Однако, если я снова запустил его с

terraform apply -var="majorVersion=v2"

Я хочу, чтобы terraform оставил ресурсы v1 в покое! Вместо этого terraform хочет снести v1 !! Как я могу выполнить параметризованный набор конфигураций без необходимости заново писать весь shebang для каждой версии? Это кажется утомительным и несущественным!


person Jürgen Simon    schedule 28.06.2019    source источник
comment
С точки зрения высокого уровня, вы здесь обновляете свою инфраструктуру с одной версии до следующей итеративной версии. Большая часть программного обеспечения написана для замены старых версий новыми версиями во время обновления. Чего вы хотите здесь достичь с точки зрения архитектуры?   -  person Matt Schuchard    schedule 28.06.2019
comment
Привет, Мэтт. По сути, нам нужно иметь возможность запускать несколько версий API, чтобы предоставить клиентам удобный переходный период для обновления. Однако я бы хотел избежать принципиальных дискуссий по вопросу версионирования REST API :)   -  person Jürgen Simon    schedule 30.06.2019


Ответы (1)


Рабочие области

Рабочее пространство - ваш друг. Вы используете рабочие пространства для переключения между «настройками», не касаясь ваших скриптов. Эти «настройки» могут быть версиями, средами и т. Д.

Для достижения вашей конкретной потребности вы можете указать это в своем файле variable.tf.

variable "majorVersion" {
  type = "map"

  default = {
    v1 = "v1"
    v2 = "v2"
  }
}


module "media-assets" {
  majorVersion   = "${var.majorVersion[terraform.workspace]}"
}

Прежде чем запускать команду применения, выберите правильную рабочую область

terraform workspace select v1

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

person Yeming Huang    schedule 16.08.2019
comment
Это отличный совет, к сожалению, я не могу использовать его так просто, потому что мне уже нужно разделить проект на рабочие области на основе других критериев. Возможно, это можно будет переписать по размеру. Я приму этот ответ. Спасибо! - person Jürgen Simon; 16.09.2019