如何使用 terraform 重新创建自动缩放组的 EC2 实例?

How to recreate EC2 instances of an autoscaling group with terraform?

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

我现在如何重新创建那个 ASG 中的实例(即一个一个地替换它们以进行滚动替换),然后它基于 changed/new 启动配置?

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

这里正常的做法是使用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,因此,暂时,您将拥有所有 4 个实例,然后再销毁旧的 2 个实例。

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

When you change the launch configuration for your Auto Scaling group, any new instances are launched using the new configuration parameters, but existing instances are not affected.

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

我最终编写了一个开源服务来观看和自动滚动更新。它应该可以解决这个问题,但它是新的,很高兴得到 feedback/issues/PRs。

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