场景:我正在运行AWS自动缩放组(ASG),并且我在terraform应用期间更改了关联的启动配置。 ASG不受影响。
如何在ASG中重新创建实例(即,逐个替换它们以进行滚动替换),然后基于更改后的/新启动配置?
我尝试过的内容:使用terraform taint,可以标记要在下次申请时销毁和重新创建的资源。但是,我不想污染自动缩放组(这是一种资源,在这种情况下不是单个实例),而是单个实例。有没有办法玷污单个实例,或者我在想错误的方向?
答案 0 :(得分: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个实例,然后销毁旧版本。
答案 1 :(得分:2)
单独使用terraform无法解决这个问题。请参阅此AWS文档(http://docs.aws.amazon.com/autoscaling/latest/userguide/LaunchConfiguration.html):
更改Auto Scaling组的启动配置时,将使用新配置参数启动任何新实例,但现有实例不受影响。
答案 2 :(得分:0)
这本身不是答案,但是我也为此感到困惑。在一种情况下,它是通用的,在另一种情况下,它是Kubernetes。
我最终写了一个开源服务来观看和自动滚动更新。它应该可以解决这个问题,但是它很新,很高兴获得反馈/问题/ PR。