Модуль с динамическими тегами Auto Scaling Group и EFS

Я хочу получить динамические теги для ресурса aws_autoscaling_group, но в отличии от примера в документации я пока не знаю сколько их будет.

Итак, установлены следующие строки:

variable "tags" {
  type = "map"

  default = {
    tag1 = "value1"
    tag2 = "value2"
  }
}

resource "aws_autoscaling_group" "asg" {
  name                 = "test-asg"
  launch_configuration = "test-lc"
  min_size             = 1
  max_size             = 1
  min_elb_capacity     = 1
  vpc_zone_identifier  = ["subnet-1234"]
  tags                 = <code_here>
}

Я придумал решение, которое будет поддерживать до x динамических тегов. К сожалению, он использует фиктивные теги для заполнения не предоставленных тегов до x.

data "template_file" "test" {
  count    = "9"
  template = "key:@:$${key}:@:value:@:$${value}:@:propagate_at_launch:@:true"

  vars {
    key   = "${element(concat(keys(var.tags), list("unusedtag1", "unusedtag2","unusedtag3","unusedtag4","unusedtag5","unusedtag6","unusedtag7","unusedtag8","unusedtag9")), count.index)}"
    value = "${element(concat(values(var.tags), list("", "","","","","","","","")), count.index)}"
  }
}

locals{
  tag0 = "${split(":@:", data.template_file.test.0.rendered)}"
  tag1 = "${split(":@:", data.template_file.test.1.rendered)}"
  tag2 = "${split(":@:", data.template_file.test.2.rendered)}"
  tag3 = "${split(":@:", data.template_file.test.3.rendered)}"
  tag4 = "${split(":@:", data.template_file.test.4.rendered)}"
  tag5 = "${split(":@:", data.template_file.test.5.rendered)}"
  tag6 = "${split(":@:", data.template_file.test.6.rendered)}"
  tag7 = "${split(":@:", data.template_file.test.7.rendered)}"
  tag8 = "${split(":@:", data.template_file.test.8.rendered)}"

  tags = "${list(
          map(local.tag0[0],local.tag0[1],local.tag0[2],local.tag0[3],local.tag0[4],local.tag0[5]),
          map(local.tag1[0],local.tag1[1],local.tag1[2],local.tag1[3],local.tag1[4],local.tag1[5]),
          map(local.tag2[0],local.tag2[1],local.tag2[2],local.tag2[3],local.tag2[4],local.tag2[5]),
          map(local.tag3[0],local.tag3[1],local.tag3[2],local.tag3[3],local.tag3[4],local.tag3[5]),
          map(local.tag4[0],local.tag4[1],local.tag4[2],local.tag4[3],local.tag4[4],local.tag4[5]),
          map(local.tag5[0],local.tag5[1],local.tag5[2],local.tag5[3],local.tag5[4],local.tag5[5]),
          map(local.tag6[0],local.tag6[1],local.tag6[2],local.tag6[3],local.tag6[4],local.tag6[5]),
          map(local.tag7[0],local.tag7[1],local.tag7[2],local.tag7[3],local.tag7[4],local.tag7[5]),
          map(local.tag8[0],local.tag8[1],local.tag8[2],local.tag8[3],local.tag8[4],local.tag8[5]),
          )}"
}

С этим кодом в ASG я могу использовать tags = ["${local.tags}"]. В примере ввода ресурсы помечены

tag1 = value1
tag2 = value2
unusedtag1 = 
unusedtag2 = 
unusedtag3 = 
unusedtag4 = 
unusedtag5 =
unusedtag6 = 
unusedtag7 =  

Я хотел бы иметь решение, которое

  • динамичный
  • помечает ли дополнительные теги

Изменить: вернуться к неясному, но более простому вопросу и открыть новый вопрос на терраформировать динамические теги на ASG и других ресурсах, таких как EFS


person Jonathan    schedule 02.03.2018    source источник
comment
Пример динамический, просто передайте список динамических тегов и соедините его с любыми статически определенными тегами.   -  person ydaetskcoR    schedule 02.03.2018
comment
спасибо за информацию, @ydaetskcoR. Возможно, я не совсем корректно сформулировал вопрос. Пожалуйста, смотрите редактирование цели, которую я хотел бы достичь.   -  person Jonathan    schedule 02.03.2018
comment
Тогда это совершенно другой вопрос, чем тот, который вы изначально задали, который касался только ASG. Вам следует подумать о том, чтобы задать новый вопрос, который правильно объясняет желаемый результат и то, что вы пробовали.   -  person ydaetskcoR    schedule 02.03.2018
comment
Я вернул вопрос, открыл новый и принял ваш ответ.   -  person Jonathan    schedule 06.07.2018


Ответы (1)


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

Очевидно, вы можете просто использовать полностью статические строфы tag следующим образом:

resource "aws_autoscaling_group" "bar" {
  ...

  tag {
    key                 = "lorem"
    value               = "ipsum"
    propagate_at_launch = false
  }
}

Или вы можете использовать более динамичную строфу tags, которая позволяет вам создать список тегов, используя concat:

variable extra_tags {
  default = [
    {
      key = "Foo"
      value = "Bar"
      propagate_at_launch = true
    },
    {
      key = "Baz"
      value = "Bam"
      propagate_at_launch = true
    },
  ]
}

resource "aws_autoscaling_group" "bar" {
  ...

  tags = [
    {
      key                 = "explicit1"
      value               = "value1"
      propagate_at_launch = true
    },
    {
      key                 = "explicit2"
      value               = "value2"
      propagate_at_launch = true
    },
  ]

  tags = ["${concat(
    list(
      map("key", "interpolation1", "value", "value3", "propagate_at_launch", true),
      map("key", "interpolation2", "value", "value4", "propagate_at_launch", true)
    ),
    var.extra_tags)
  }"]
}

Этот второй вывод, если бы значения по умолчанию не были переопределены, помечал бы ASG тегом:

explicit1 = value1
explicit2 = value2
interpolation1 = value3
interpolation2 = value4
Foo = Bar
Baz = Bam

Если бы вы переопределили extra_tags через tfvars, например:

extra_tags = [
  {
    key = "CustomTag1"
    value = "CustomValue1"
    propagate_at_launch = true
  },
  {
    key = "CustomTag2"
    value = "CustomValue3"
    propagate_at_launch = true
  },
  {
    key = "CustomTag3"
    value = "CustomValue3"
    propagate_at_launch = true
  },
  {
    key = "CustomTag4"
    value = "CustomValue4"
    propagate_at_launch = true
  },
]

Тогда ваш ASG будет помечен:

explicit1 = value1
explicit2 = value2
interpolation1 = value3
interpolation2 = value4
CustomTag1 = CustomValue1
CustomTag2 = CustomValue2
CustomTag3 = CustomValue3
CustomTag4 = CustomValue4

Это позволяет вам дополнительно иметь некоторые теги, которые всегда присутствуют в ASG, плюс необязательные динамические теги, которые полностью определены вне вашего модуля или чего-либо еще.

person ydaetskcoR    schedule 02.03.2018
comment
пожалуйста, обратите внимание, что входная переменная не соответствует заданной входной переменной из моего вопроса. - person Jonathan; 02.03.2018