【问题标题】:Rolling update of ASG using launch template使用启动模板滚动更新 ASG
【发布时间】:2021-04-21 20:52:48
【问题描述】:

当我更新与 aws_launch_template 关联的 AMI 时,Terraform 会按预期创建一个新版本的启动模板,并更新 aws_autoscaling_group 以指向新版本的启动模板。

但是,没有执行“滚动更新”以基于新 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
  }
}

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    我最近处理了完全相同的场景。

    我们使用 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
      }
    }
    

    【讨论】:

    • 这种方法有效,非常感谢。我没有使用random_pet 资源,而是将启动配置版本插入name_prefix,如下所示:name_prefix = "my-asg-${aws_launch_template.this.latest_version}-"
    【解决方案2】:

    ASG 实例刷新也是一个选项,可根据启动模板中的最新版本将所有旧实例替换为较新的实例(确保在 ASG 设置中设置 LaunchTemplateVersion = $Latest)。其他好处是:

    1. 在接收流量之前设置实例预热时间(如果您有时间进行引导安装)
    2. 您可以指定要在 ASG 中并行替换的实例的百分比以加快速度。

    以下是 terraform 代码块。更多关于功能here

     instance_refresh {
        strategy = "Rolling"
        preferences {
          min_healthy_percentage = 50
        }
        triggers = ["tag"]
      }
    

    【讨论】:

      猜你喜欢
      • 2020-09-10
      • 2019-02-05
      • 2021-08-07
      • 2011-08-20
      • 2021-07-16
      • 2016-08-20
      • 2020-06-11
      • 1970-01-01
      • 2020-04-19
      相关资源
      最近更新 更多