Terraform aws_autoscaling_group 启动的 AWS EC2 实例的动态命名

Dynamic naming for AWS EC2 instances launched by Terraform aws_autoscaling_group

我已经使用 Terraform 成功创建了一个自动缩放组。我现在想找到一种方法来根据索引值动态命名配置的实例。

对于 aws_instance 类型,可以通过以下方式轻松完成:

resource "aws_instance" "bar" {
  count = 3

  tags {
    Name     = "${var.instance_name_gridNode}${count.index + 1}"
    App-code = "${var.app-code}"
    PC-code  = "${var.pc-code}"
  }
}

这将导致 3 个实例名为:

1) 节点 1

2) 节点 2

3) 节点 3

然而,由于 aws_autoscaling_group 是动态配置的(对于缩小和缩小的情况),如何控制配置实例的命名约定?

resource "aws_autoscaling_group" "gridrouter_asg" {
  name                      = "mygridrouter"
  launch_configuration      = "${aws_launch_configuration.gridGgr_lcfg.id}"
  min_size                  = 1
  max_size                  = 2
  health_check_grace_period = 150
  desired_capacity          = 1
  vpc_zone_identifier       = ["${var.subnet_id}"]
  health_check_type         = "EC2"

  tags = [
    {
      key                 = "Name"
      value               = "${var.instance_name_gridGgr_auto}"
      propagate_at_launch = true
    },
  ]
}

AWS 自动缩放组可以标记为许多资源,使用 propagate_at_launch 标记这些标记也将传递给它创建的实例。

不幸的是,这些完全是静态的,ASG 本身无法以不同方式标记实例。最重要的是,default scale in policy 不会首先删除最新的实例,因此即使您将实例标记为 Node1Node2Node3,然后当自动缩放组缩减时最有可能(取决于条件)删除 Node1,留下 Node2Node3。虽然可以将终止策略更改为 NewestInstance 以便删除 Node3,但这不太可能是策略中的最佳规模。

我想问为什么你觉得你需要以不同的方式使用 ASG 实例,并且可能会重新考虑当它们更短暂时如何管理你的实例,这在现代云中通常是这种情况,但在使用自动缩放时更是如此组。

如果您确实出于某些特定原因确实想要以不同方式标记实例,您可以让 ASG 在启动时不将 Name 标记传播到实例,然后在扩展事件上触发 Lambda 函数(或者通过生命周期挂钩或 Cloudwatch 事件)来确定要使用的标签值,然后用它标记实例。

一种方法是将用户数据脚本传递给实例或自动缩放组。 PFB link 对类似问题的回答。