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

时间:2016-09-06 09:36:27

标签: amazon-web-services autoscaling terraform

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

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

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

3 个答案:

答案 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。

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