自动缩放组不会在启动配置更改时更新
Auto-Scaling Groups Don't Update on Launch Configuration Change
我有一个 AWS Auto-Scaling 组、一个启动配置和一个在 Terraform 中定义的 Auto-Scaling 组策略,如下所示:
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 秒,然后按照 OldestInstance
.
拆除旧的。
当我在CloudFormation中做类似的事情时,我使用了the following configuration options:
ASG:
Type: AWS::AutoScaling::AutoScalingGroup
UpdatePolicy:
AutoScaleRollingUpdate:
# during a scale, 6 instances in service
MaxBatchSize: 3
MinInstancesInService: 3
PauseTime: PT5M
Properties:
...
Terraform 中是否有类似的东西?当我更改启动配置时,我真的希望我的自动缩放组发生变化。
I would assume that this would cause the auto-scaling group to scale up by var.asg_capacity instances, wait 300 seconds, and then tear down the old ones as per OldestInstance.
不幸的是,这个假设是不正确的。当您更改启动配置时,唯一发生的事情是在您的 AWS 账户中创建一个新的启动配置并与 Auto Scaling 组 (ASG) 相关联。这意味着该 ASG 中的所有 future 实例都将使用新的启动配置启动。但是,仅更改启动配置不会触发任何实例的启动,因此您不会看到您的更改。
要强制启动新实例,您必须做几件事:
- 将 ASG 的
name
参数配置为直接依赖于启动配置的名称。这样,每次启动配置更改(更新 AMI 或用户数据时都会发生更改)时,Terraform 将尝试替换 ASG。
- 将 ASG 的
create_before_destroy
参数设置为 true
,这样每次 Terraform 尝试替换它时,它都会在销毁原始文件之前创建替换文件。
- 将 ASG 的
min_elb_capacity
参数设置为集群的 min_size
,这样 Terraform 将至少等待来自新 ASG 的那么多服务器在 ELB 中注册,然后它开始销毁原来的 ASG。
以下是 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
}
}
有关完整的示例,请查看 zero-downtime deployment example code from the book Terraform: Up & Running。
从 AWS provisioner 3.22.0 版开始,您可以将 instance_refresh 配置块添加到 aws_autoscaling_group
资源。可能有效的最简单配置是:
instance_refresh {
strategy = "Rolling"
}
我有一个 AWS Auto-Scaling 组、一个启动配置和一个在 Terraform 中定义的 Auto-Scaling 组策略,如下所示:
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 秒,然后按照 OldestInstance
.
当我在CloudFormation中做类似的事情时,我使用了the following configuration options:
ASG:
Type: AWS::AutoScaling::AutoScalingGroup
UpdatePolicy:
AutoScaleRollingUpdate:
# during a scale, 6 instances in service
MaxBatchSize: 3
MinInstancesInService: 3
PauseTime: PT5M
Properties:
...
Terraform 中是否有类似的东西?当我更改启动配置时,我真的希望我的自动缩放组发生变化。
I would assume that this would cause the auto-scaling group to scale up by var.asg_capacity instances, wait 300 seconds, and then tear down the old ones as per OldestInstance.
不幸的是,这个假设是不正确的。当您更改启动配置时,唯一发生的事情是在您的 AWS 账户中创建一个新的启动配置并与 Auto Scaling 组 (ASG) 相关联。这意味着该 ASG 中的所有 future 实例都将使用新的启动配置启动。但是,仅更改启动配置不会触发任何实例的启动,因此您不会看到您的更改。
要强制启动新实例,您必须做几件事:
- 将 ASG 的
name
参数配置为直接依赖于启动配置的名称。这样,每次启动配置更改(更新 AMI 或用户数据时都会发生更改)时,Terraform 将尝试替换 ASG。 - 将 ASG 的
create_before_destroy
参数设置为true
,这样每次 Terraform 尝试替换它时,它都会在销毁原始文件之前创建替换文件。 - 将 ASG 的
min_elb_capacity
参数设置为集群的min_size
,这样 Terraform 将至少等待来自新 ASG 的那么多服务器在 ELB 中注册,然后它开始销毁原来的 ASG。
以下是 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
}
}
有关完整的示例,请查看 zero-downtime deployment example code from the book Terraform: Up & Running。
从 AWS provisioner 3.22.0 版开始,您可以将 instance_refresh 配置块添加到 aws_autoscaling_group
资源。可能有效的最简单配置是:
instance_refresh {
strategy = "Rolling"
}