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

问题描述 投票:8回答:3

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

如何在ASG中重新创建实例(即,逐个替换它们以进行滚动替换),然后基于更改的/新启动配置?

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

amazon-web-services autoscaling terraform
3个回答
15
投票

这里正常的做法是使用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个旧实例。如果您正在使用带有ASG的ELB,那么它会将2个新实例加入ELB,因此,暂时,您将拥有所有4个实例,然后销毁旧版本2。


2
投票

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

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


0
投票

这本身不是答案,但我也在努力解决这个问题。在一个背景下,它是一般的,另一个是Kubernetes。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.