自动扩展组不会在启动配置更改时更新

Naf*_*Kay 12 amazon-web-services aws-cloudformation autoscaling terraform

我有一个AWS Auto-Scaling组,一个启动配置和一个Terraform中定义的自动扩展组策略,如下所示:

resource "aws_autoscaling_group" "default" {
  name = "..."

  health_check_type = "EC2"
  vpc_zone_identifier = ["${...}"]

  min_size = "${var.asg_capacity}"
  max_size = "${var.asg_capacity * 2}"
  desired_capacity = "${var.asg_capacity}"

  launch_configuration = "${aws_launch_configuration.default.id}"

  termination_policies = ["OldestInstance"]
}

resource "aws_autoscaling_policy" "default" {
  name = "..."
  autoscaling_group_name = "${aws_autoscaling_group.default.name}"

  scaling_adjustment = "${var.asg_capacity}"
  adjustment_type = "ChangeInCapacity"
  cooldown = 300
}

resource "aws_launch_configuration" "default" {
  name_prefix = "..._"

  image_id = "${var.coreos_ami_id}"
  instance_type = "${var.ec2_instance_type}"
  iam_instance_profile = "${aws_iam_instance_profile.default.arn}"
  key_name = "..."

  security_groups = ["${aws_security_group.default.id}"]

  user_data = "${data.template_file.cloud_init.rendered}"

  lifecycle {
    create_before_destroy = true
  }
}
Run Code Online (Sandbox Code Playgroud)

当我更改用户数据时,会创建一个新的启动配置,然后将其附加到自动缩放组.我认为这会导致自动缩放组按var.asg_capacity实例扩展,等待300秒,然后按原样拆除旧的OldestInstance.

当我在CloudFormation中做了类似的事情时,我使用了以下配置选项:

ASG:
  Type: AWS::AutoScaling::AutoScalingGroup
  UpdatePolicy:
    AutoScaleRollingUpdate:
      # during a scale, 6 instances in service
      MaxBatchSize: 3
      MinInstancesInService: 3
      PauseTime: PT5M
  Properties:
    ...
Run Code Online (Sandbox Code Playgroud)

在Terraform中有这样的模拟吗?我真的希望在更改启动配置时更改自动缩放组.

Yev*_*man 20

我认为这会导致自动缩放组按var.asg_capacity实例扩展,等待300秒,然后根据OldestInstance拆除旧的.

遗憾的是,这种假设是不正确的.更改启动配置时,唯一发生的事情是在您的AWS账户中创建新的启动配置,并与Auto Scaling组(ASG)相关联.这意味着该ASG中的所有未来实例都将使用新的启动配置启动.但是,仅更改启动配置不会触发任何实例的启动,因此您将看不到您的更改.

要强制启动新实例,您必须执行以下操作:

  1. 配置nameASG 的参数以直接依赖于启动配置的名称.这样,每次启动配置发生更改(更新AMI或用户数据时),Terraform都会尝试更换ASG.
  2. create_before_destroyASG 的参数设置为true,因此每次Terraform尝试替换它时,它将在销毁原始文件之前创建替换.
  3. min_elb_capacityASG 的参数设置为min_size群集的参数,以便Terraform将等待来自新ASG的至少那么多服务器在它开始销毁原始ASG之前在ELB中注册.

这里是Terraform代码的粗略概念:

resource "aws_launch_configuration" "example" {
  image_id        = "${var.ami}"
  instance_type   = "${var.instance_type}"

  user_data = "${data.template_file.user_data.rendered}"

  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_autoscaling_group" "example" {
  name                 = "${var.cluster_name}-${aws_launch_configuration.example.name}"
  launch_configuration = "${aws_launch_configuration.example.id}"
  availability_zones   = ["${data.aws_availability_zones.all.names}"]

  min_size         = "${var.min_size}"
  max_size         = "${var.max_size}"
  min_elb_capacity = "${var.min_size}"

  lifecycle {
    create_before_destroy = true
  }
}
Run Code Online (Sandbox Code Playgroud)

有关完整工作示例,请查看Terraform:Up&Running一书中的零停机部署示例代码.

  • @NaftuliKay 是的,不幸的是,这仍然是 Terraform 社区中的一个开放问题:https://github.com/hashicorp/terraform/issues/1552。目前,使用上面的“create_before_destroy”方法是使用纯 Terraform 代码的最佳解决方案。它接近蓝/绿部署,因此不是一个糟糕的选择,但它并不适合所有人,更重要的是,它不适用于动态调整大小的 ASG。 (2认同)