Terraform 使用启动模板滚动更新ASG

Terraform 使用启动模板滚动更新ASG,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,当我更新与aws\u launch\u模板相关联的AMI时,Terraform会按预期创建新版本的启动模板,并更新aws\u autoscaling\u组,以指向新版本的启动模板 但是,没有执行“滚动更新”来切换现有实例和基于新AMI的新实例,我必须手动终止现有实例,然后ASG使用新AMI启动新实例 为了让Terraform执行滚动更新,我必须对配置进行哪些更改 现行守则如下: resource "aws_launch_template" "this" { name_prefix = "m

当我更新与
aws\u launch\u模板相关联的AMI时,Terraform会按预期创建新版本的启动模板,并更新
aws\u autoscaling\u组
,以指向新版本的启动模板

但是,没有执行“滚动更新”来切换现有实例和基于新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\u 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
  }
}
然后,您可以在一个变量上使用该随机宠物名id,该变量将强制重新创建自动缩放组

例如,使用
名称\u前缀

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
)。其他好处包括:

  • 设置在接收流量之前预热实例的时间(如果您有时间进行引导安装)
  • 您可以指定在ASG中并行替换多少实例的百分比,以加快速度
  • 下面是地形代码块。更多关于该功能的信息


    非常感谢,这种方法奏效了。我没有使用
    random\u pet
    资源,而是将启动配置版本插入
    name\u前缀
    中,就像这样:
    name\u prefix=“my asg-${aws\u launch\u模板。这是最新的启动版本”
     instance_refresh {
        strategy = "Rolling"
        preferences {
          min_healthy_percentage = 50
        }
        triggers = ["tag"]
      }