2

这就是我想要做的。我有 2 个使用 Terraform 创建的自动缩放组。一种是在三个不同的可用区中启动 3 个 EC2 实例,并使用公共 IP 地址。另一个 Auto Scaling 组正在三个不同的可用区中启动 3 个 EC2 实例,使用私有 IP 地址我试图为每个实例设置一个唯一的“名称”标签。在 Terraform 中,我看到自动缩放资源有一个标签块,但在应用时,相同的标签应用于所有 3 个实例。此外,我尝试将我的代码设置为一个自动扩展组可以启动我的所有实例(公共和私有),但是在我的 vpc_zone_identifier 语句中使用“for”表达式循环时遇到问题。这个问题迫使我为私有实例创建第二个 Auto Scaling 组。

resource "aws_autoscaling_group" "public" {
  name                 = "${var.main_as}-Public"
  launch_configuration = aws_launch_configuration.main.id
  vpc_zone_identifier = [
    for subnet in aws_subnet.public : subnet.id
  ]
  min_size = 3
  max_size = 3
}

resource "aws_autoscaling_group" "private" {
  name                 = "${var.main_as}-Private"
  launch_configuration = aws_launch_configuration.main.id
  vpc_zone_identifier = [
    for subnet in aws_subnet.private : subnet.id
  ]
  min_size = 3
  max_size = 3
}
4

1 回答 1

3

使用自动缩放组,您不应该尝试为所有实例生成唯一名称,实际上这会导致pets 与牛的方法论。通过命名资源,它们变得宝贵,并可能导致设计中出现单点故障。

在实践中,这对于某些领域(例如数据库)可能很难,但是您应该尝试将架构构建为不可变的,尤其是在可以替换实例的自动缩放组中(即使您的最小和最大大小相同,任何底层主机故障将启动一个实例来替换)。

通过使您的基础架构不可变,您的架构将对未知事件更具弹性,并将强制执行服务器构建的最佳实践。

如果您需要实例的标识符,而不是使用标签,我建议您使用实例 ID,因为这对于您的主机来说始终是唯一的。

否则,如果您仍想为主机使用具有唯一名称标签的 Autoscaling 组,则需要在主机启动期间为其创建一个事件。这将需要触发一个 Lambda,该 Lambda 将以编程方式更新 EC2 实例并为其分配一个唯一名称。

于 2020-08-10T16:53:14.617 回答