Amazon web services 自动缩放组不';t关于启动配置更改的更新

Amazon web services 自动缩放组不';t关于启动配置更改的更新,amazon-web-services,amazon-cloudformation,autoscaling,terraform,Amazon Web Services,Amazon Cloudformation,Autoscaling,Terraform,我在Terraform中定义了一个AWS自动缩放组、一个启动配置和一个自动缩放组策略,如下所示: resource "aws_autoscaling_group" "default" { name = "..." health_check_type = "EC2" vpc_zone_identifier = ["${...}"] min_size = "${var.asg_capacity}" max_size = "${var.asg_capacity * 2}"

我在Terraform中定义了一个AWS自动缩放组、一个启动配置和一个自动缩放组策略,如下所示:

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
  }
}
当我更改用户数据时,将创建一个新的启动配置,然后将其连接到自动缩放组。我假设这将导致自动缩放组按
var.asg_capacity
实例进行缩放,等待300秒,然后根据
oldesinstance
拆下旧的

当我在CloudFormation中做了类似的事情时,我使用了:

有没有类似的地形?我真的希望我的自动缩放组在我更改启动配置时发生更改

我假设这将导致自动缩放组按var.asg_容量实例进行缩放,等待300秒,然后根据OldEstance拆下旧的

不幸的是,这一假设是不正确的。更改启动配置时,唯一发生的事情是在AWS帐户中创建一个新的启动配置,并与自动缩放组(ASG)关联。这意味着ASG中的所有未来实例都将使用新的启动配置启动。但是,仅仅更改启动配置不会触发任何实例的启动,因此您不会看到您的更改

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

  • 将ASG的
    name
    参数配置为直接取决于启动配置的名称。这样,每次启动配置更改时(当您更新AMI或用户数据时),Terraform都会尝试替换ASG
  • 将ASG的
    create\u before\u destroy
    参数设置为
    true
    ,以便Terraform每次尝试替换它时,都会在销毁原始数据之前创建替换
  • 将ASG的
    min_elb_capacity
    参数设置为集群的
    min_size
    ,以便Terraform将等待新ASG中至少有那么多服务器在elb中注册,然后再开始销毁原始ASG
  • 下面是地形代码的大致情况:

    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
      }
    }
    

    有关完整的工作示例,请查看本书中的。

    从AWS provisioner的3.22.0版开始,您可以将配置块添加到
    AWS\u autoscaling\u组
    资源中。可能工作的最简单配置是:

    instance_refresh {
      strategy = "Rolling"
    }
    

    谢谢你的回答。令人震惊的是,Terraform仍然没有提供一种内置的方法来实现这一点,而不在每个供应上旋转和拆卸自动缩放组。@NaftuliKay是的,不幸的是,这在Terraform社区中仍然是一个开放的问题:。现在,使用上面的
    create\u-before\u-destroy
    方法是纯地形代码的最佳解决方案。它接近于蓝色/绿色部署,因此这不是一个坏的选择,但它不适用于所有人,关键是,它不适用于动态大小的ASG。另一种可能的方法是将ASG放入一个包装在总体地形配置中的CloudFormation模板中,并允许它处理对每个主机的滚动更新,因为Terraform无法以本机方式进行更新@Yevgeniy Brikman在年提出了这种方法。作为最低要求,用启动配置的名称更新自动缩放组的名称是否足以触发整个重新部署流程?@PatrikIselind:当然,但是在创建新的ASG之前,原始ASG会被删除,所以在这期间会有停机时间。
    instance_refresh {
      strategy = "Rolling"
    }