5

我有一個AWS自動縮放集團,一個啓動配置,並在Terraform這樣定義的自動縮放組策略:自動縮放組不要啓動配置變化更新

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這個模擬?當我更改啓動配置時,我非常希望自動縮放組更改。

回答

11

我會假設這會導致自動縮放組由var.asg_capacity實例放大,等待300秒,然後按照最舊實例拆除舊的。

不幸的是,這種假設是不正確的。更改啓動配置時,唯一發生的情況是在您的AWS賬戶中創建新的啓動配置並將其與Auto Scaling Group(ASG)相關聯。這意味着所有未來該ASG中的實例將使用新的啓動配置啓動。但是,僅更改啓動配置不會觸發任何實例的啓動,因此您不會看到您的更改。

要強制新實例啓動,你要做的幾件事情:

  1. 配置ASG的name參數上推出配置的名稱直接依賴。這樣,每當啓動配置發生變化(更新AMI或用戶數據時會發生這種情況),Terraform將嘗試替換ASG。
  2. 將ASG的create_before_destroy參數設置爲true,因此每次Terraform嘗試替換它時,都會在銷燬原始文件之前創建替換。
  3. 將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 
    } 
} 

對於一個完全工作的例子,從書中Terraform: Up & Running檢查出zero-downtime deployment example code

+0

謝謝你的回答。令人驚訝的是Terraform仍然沒有提供一種內置的方式來完成這個任務,而不需要在每個規定上輪換並拆除一個自動擴展組。 –

+1

@NaftuliKay不幸的是,這仍然是Terraform社區中的一個未解決的問題:https://github.com/hashicorp/terraform/issues/1552。目前,使用上面的'create_before_destroy'方法是純粹的Terraform代碼的最佳解決方案。它接近藍色/綠色的部署,所以這不是一個壞的選擇,但它不適用於所有人,而且關鍵的是它不適用於動態大小的ASG。 –