Auto Scaling Group 和 EFS 上具有动态标签的模块

Posted

技术标签:

【中文标题】Auto Scaling Group 和 EFS 上具有动态标签的模块【英文标题】:Module with dynamic tags on Auto Scaling Group and EFS 【发布时间】:2018-08-10 10:20:28 【问题描述】:

我想在 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 =  

我想有一个解决方案是

动态 是否标记了额外的标签

编辑:恢复到不清楚但更简单的问题,并在 terraform dynamic tags on ASG and other resources like EFS 上打开了一个新问题

【问题讨论】:

这个例子是动态的,只需传递一个动态标签列表并将其与任何静态定义的标签连接起来。 感谢@ydaetskcoR 提供的信息。我可能没有以足够好的方式表达这个问题。请查看我想要达到的目标的修改。 那么这与您最初提出的仅针对 ASG 的问题完全不同。您应该考虑提出一个新问题,以正确解释您想要的结果以及您尝试过的方法。 我已经回复了问题,打开了一个新问题并接受了您的回答。 【参考方案1】:

example given in the docs 展示了您可以越来越动态地将标签添加到自动缩放组的不同方式。

您显然可以像这样使用完全静态的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

如果您要通过 tfvar 覆盖 extra_tags,例如:

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 上的标签,以及在您的模块或其他任何东西之外完全定义的可选动态标签。

【讨论】:

请不要输入变量与我的问题中设置的输入变量不匹配。

以上是关于Auto Scaling Group 和 EFS 上具有动态标签的模块的主要内容,如果未能解决你的问题,请参考以下文章

Auto Scaling Group 启动配置更改

Auto-Scaling 组不会在启动配置更改时更新

使用 boto 列出 Auto Scaling 组中的实例

我应该如何配置 AWS Auto-Scaling Group mixed_instances 策略以仅允许具有多个 EC2 instance_types 的 Spot 实例?

Capistrano 和 Auto-Scaling AWS

Amazon EC2、Auto-Scaling、AMI,有没有更简单的方法?