场景:我正在运行AWS自动缩放组(ASG),并且我在terraform应用期间更改了关联的启动配置。 ASG不受影响。
如何在ASG中重新创建实例(即,逐个替换它们以进行滚动替换),然后基于更改的/新启动配置?
我尝试过:使用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个旧实例。如果您正在使用带有ASG的ELB,那么它会将2个新实例加入ELB,因此,暂时,您将拥有所有4个实例,然后销毁旧版本2。
单独使用terraform无法解决这个问题。请参阅此AWS文档(http://docs.aws.amazon.com/autoscaling/latest/userguide/LaunchConfiguration.html):
更改Auto Scaling组的启动配置时,将使用新配置参数启动任何新实例,但不会影响现有实例。
这本身不是答案,但我也在努力解决这个问题。在一个背景下,它是一般的,另一个是Kubernetes。
我最终编写了一个开源服务来监视和自动滚动更新。它应该解决这个问题,但它是新的,非常乐意获得反馈/问题/ PR。