使用启动模板滚动更新 ASG
Rolling update of ASG using launch template
当我更新与 aws_launch_template
关联的 AMI 时,Terraform 按预期创建了新版本的启动模板,并更新了 aws_autoscaling_group
以指向新版本的启动模板。
但是,没有执行 "rolling update" 以基于新 AMI 的新实例切换现有实例,我必须手动终止现有实例,然后 ASG 使用新 AMI 启动新实例.
我必须对我的配置进行哪些更改才能使 Terraform 执行滚动更新?
现有代码如下:
resource "aws_launch_template" "this" {
name_prefix = "my-launch-template-"
image_id = var.ami_id
instance_type = "t3.small"
key_name = "testing"
vpc_security_group_ids = [ aws_security_group.this.id ]
lifecycle {
create_before_destroy = true
}
}
resource "aws_autoscaling_group" "this" {
name_prefix = "my-asg-"
vpc_zone_identifier = var.subnet_ids
target_group_arns = var.target_group_arns
health_check_type = "ELB"
health_check_grace_period = 300
default_cooldown = 10
min_size = 4
max_size = 4
desired_capacity = 4
launch_template {
id = aws_launch_template.this.id
version = aws_launch_template.this.latest_version
}
lifecycle {
create_before_destroy = true
}
}
我最近处理了完全相同的场景。
我们使用 random_pet
资源生成一个人类可读的随机名称,该名称与 AMI 更改相关联。
resource "random_pet" "ami_random_name" {
keepers = {
# Generate a new pet name every time we change the AMI
ami_id = var.ami_id
}
}
然后您可以在一个变量上使用那个 random_pet 名称 id,这将强制重新创建您的自动缩放组。
例如 name_prefix
:
resource "aws_autoscaling_group" "this" {
name_prefix = "my-asg-${random_pet.ami_random_name.id}"
vpc_zone_identifier = var.subnet_ids
target_group_arns = var.target_group_arns
health_check_type = "ELB"
health_check_grace_period = 300
default_cooldown = 10
min_size = 4
max_size = 4
desired_capacity = 4
launch_template {
id = aws_launch_template.this.id
version = aws_launch_template.this.latest_version
}
lifecycle {
create_before_destroy = true
}
}
ASG 实例刷新也是一个选项,它根据启动模板中的最新版本用更新的实例替换所有旧实例(确保在 ASG 设置中设置 LaunchTemplateVersion = $Latest
)。其他好处是:
- 设置接收流量前预热实例的时间(如果您有时间进行 bootstrap 安装)
- 您可以指定要在 ASG 中并行替换多少实例的百分比以加快速度。
下面是地形代码块。有关功能的更多信息 here
instance_refresh {
strategy = "Rolling"
preferences {
min_healthy_percentage = 50
}
triggers = ["tag"]
}
当我更新与 aws_launch_template
关联的 AMI 时,Terraform 按预期创建了新版本的启动模板,并更新了 aws_autoscaling_group
以指向新版本的启动模板。
但是,没有执行 "rolling update" 以基于新 AMI 的新实例切换现有实例,我必须手动终止现有实例,然后 ASG 使用新 AMI 启动新实例.
我必须对我的配置进行哪些更改才能使 Terraform 执行滚动更新?
现有代码如下:
resource "aws_launch_template" "this" {
name_prefix = "my-launch-template-"
image_id = var.ami_id
instance_type = "t3.small"
key_name = "testing"
vpc_security_group_ids = [ aws_security_group.this.id ]
lifecycle {
create_before_destroy = true
}
}
resource "aws_autoscaling_group" "this" {
name_prefix = "my-asg-"
vpc_zone_identifier = var.subnet_ids
target_group_arns = var.target_group_arns
health_check_type = "ELB"
health_check_grace_period = 300
default_cooldown = 10
min_size = 4
max_size = 4
desired_capacity = 4
launch_template {
id = aws_launch_template.this.id
version = aws_launch_template.this.latest_version
}
lifecycle {
create_before_destroy = true
}
}
我最近处理了完全相同的场景。
我们使用 random_pet
资源生成一个人类可读的随机名称,该名称与 AMI 更改相关联。
resource "random_pet" "ami_random_name" {
keepers = {
# Generate a new pet name every time we change the AMI
ami_id = var.ami_id
}
}
然后您可以在一个变量上使用那个 random_pet 名称 id,这将强制重新创建您的自动缩放组。
例如 name_prefix
:
resource "aws_autoscaling_group" "this" {
name_prefix = "my-asg-${random_pet.ami_random_name.id}"
vpc_zone_identifier = var.subnet_ids
target_group_arns = var.target_group_arns
health_check_type = "ELB"
health_check_grace_period = 300
default_cooldown = 10
min_size = 4
max_size = 4
desired_capacity = 4
launch_template {
id = aws_launch_template.this.id
version = aws_launch_template.this.latest_version
}
lifecycle {
create_before_destroy = true
}
}
ASG 实例刷新也是一个选项,它根据启动模板中的最新版本用更新的实例替换所有旧实例(确保在 ASG 设置中设置 LaunchTemplateVersion = $Latest
)。其他好处是:
- 设置接收流量前预热实例的时间(如果您有时间进行 bootstrap 安装)
- 您可以指定要在 ASG 中并行替换多少实例的百分比以加快速度。
下面是地形代码块。有关功能的更多信息 here
instance_refresh {
strategy = "Rolling"
preferences {
min_healthy_percentage = 50
}
triggers = ["tag"]
}