【问题标题】:How to recreate EC2 instances of an autoscaling group with terraform?如何使用 terraform 重新创建自动缩放组的 EC2 实例?
【发布时间】:2017-01-13 17:03:34
【问题描述】:

场景: 我正在运行 AWS 自动缩放组 (ASG),并且在 terraform 应用期间更改了关联的启动配置。 ASG 不受影响。

我现在如何根据更改/新的启动配置重新创建该 ASG 中的实例(即,逐个替换它们以进行滚动替换)?

我尝试过的: 使用 terraform taint 可以将资源标记为在下一次应用期间销毁和重新创建。但是,我不想污染自动缩放组(这是一种资源,在这种情况下不是单个实例),而是其中的单个实例。有没有办法污染单个实例或者我的想法是错误的?

【问题讨论】:

  • 您为什么希望 ASG 不受影响?这种情况下的正常用例是滚动替换 ASG 及其内部的实例。
  • @ydaetskcoR 是的,我最终想要实现的是一个接一个地替换它们(也就是重新堆叠它们或进行滚动替换)。我谈论的是单个实例令人困惑,因此我更新了问题。

标签: amazon-web-services autoscaling terraform


【解决方案1】:

这里的正常做法是使用Terraform's lifecycle management强制它在销毁旧资源之前创建新资源。

在这种情况下,您可以像这样设置启动配置和自动缩放组:

resource "aws_launch_configuration" "as_conf" {
    name_prefix = "terraform-lc-example-"
    image_id = "${var.ami_id}"
    instance_type = "t1.micro"

    lifecycle {
      create_before_destroy = true
    }
}

resource "aws_autoscaling_group" "bar" {
    name = "terraform-asg-example-${aws_launch_configuration.as_conf.name}"
    launch_configuration = "${aws_launch_configuration.as_conf.name}"

    lifecycle {
      create_before_destroy = true
    }
}

然后,如果您更改 ami_id 变量以使用另一个 AMI,Terraform 将意识到它必须更改启动配置,因此在销毁旧配置之前创建一个新配置。然后将新 LC 生成的新名称插入到 ASG 名称中,强制重建新的 ASG。

在您使用create_before_destroy 时,Terraform 将创建新的 LC 和 ASG,并等待新 ASG 达到所需容量(可以配置运行状况检查),然后再销毁旧 ASG,然后再销毁旧 LC。

这将一次性翻转 ASG 中的所有实例。因此,如果您在 ASG 中的最小容量为 2,那么这将再创建 2 个实例,并且一旦这两个实例都通过了健康检查,那么 2 个较旧的实例将被销毁。如果您将 ELB 与 ASG 一起使用,那么它会将 2 个新实例加入 ELB,因此,在销毁旧的 2 个之前,您将暂时让所有 4 个实例都处于服务状态。

【讨论】:

  • 我之前将最小、最大和所需容量都设置为 1。根据您的回答,我现在将其更改为 1、2 和 1。但是,我无法观察到您解释的创建另一个实例并销毁旧实例的行为。相反,没有任何反应,尽管 terraform 创建了新的 LC 并修改了旧的 ASG。我也等过了宽限期,create_before_destroy 已经设置好了。
  • 注意,它替换了整个 ASG,而不是其中的实例。因此,您将暂时拥有 2 个 ASG,每个 ASG 中的实例数量最少。一旦第二个 ASG 通过健康检查,Terraform 将开始销毁旧 ASG。
  • 这很有趣,terraform 只修改了旧的 ASG(暂时没有额外创建)。确定我不需要为 ASG 设置其他参数即可实现您所观察到的行为?
  • 您是否也使用了 ASG 中的第二个生命周期配置块?从记忆中它可以像我描述的那样工作,但我需要把一些东西放在一起检查你是否认为这实际上没有发生。
  • 你是对的。微小但重要的区别是,就我而言,ASG 的“名称”不是动态的(即,基于 LC 的名称)。然而,terraform 从未抱怨过。只有当我污染了 ASG 并强制 terraform 创建一个新的时,它才显示错误“此名称的 AutoScalingGroup 已存在”,这给了我提示。
【解决方案2】:

您无法单独使用 terraform 解决此问题。请参阅此 AWS 文档 (http://docs.aws.amazon.com/autoscaling/latest/userguide/LaunchConfiguration.html):

当您更改 Auto Scaling 组的启动配置时,任何新实例都会使用新配置参数启动,但现有实例不受影响

【讨论】:

    【解决方案3】:

    这本身不是一个答案,但我也为此苦苦挣扎。在一种情况下它是通用的,在另一种情况下是 Kubernetes。

    我最终编写了一个开源服务来观看和自动滚动更新。它应该可以解决这个问题,但它是新的,非常乐意获得反馈/问题/PR。

    https://github.com/deitch/aws-asg-roller

    【讨论】:

      猜你喜欢
      • 2021-06-16
      • 2019-09-12
      • 2022-11-10
      • 2017-08-15
      • 2020-10-27
      • 2021-10-26
      • 1970-01-01
      • 2019-08-16
      相关资源
      最近更新 更多