5

Mam AWS Automatyczne Skalowanie Group, konfiguracji startowej, oraz polisy Auto-Scaling grupy zdefiniowanej w Terraform tak:autoskalowanie Grupy Nie aktualizuj na uruchamianie Konfiguracja Zmień

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 
    } 
} 

Kiedy zmień moje dane użytkownika, zostanie utworzona nowa konfiguracja uruchamiania, a następnie dołączona do grupy automatycznego skalowania. Zakładam, że spowodowałoby to powiększenie grupy automatycznego skalowania o instancje var.asg_capacity, odczekanie 300 sekund, a następnie zniszczenie starych zgodnie z OldestInstance.

Kiedy mam zrobić podobne rzeczy w CloudFormation, Użyłem 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: 
    ... 

Czy istnieje analogowe za to w Terraform? Bardzo chciałbym, aby moje grupy automatycznego skalowania zmieniły się po zmianie konfiguracji uruchamiania.

Odpowiedz

11

Przypuszczam, że mogłoby to spowodować grupę automatycznego skalowania skalowanie w górę przez przypadkach var.asg_capacity odczekać 300 sekund, a następnie zburzyć stare zgodnie OldestInstance.

To przypuszczenie niestety jest nieprawidłowe. Po zmianie konfiguracji uruchamiania, jedyną rzeczą, która się dzieje jest nowa konfiguracja uruchamiania jest tworzona na koncie AWS i skojarzona z Auto Scaling Group (ASG). To oznacza, że ​​wszystkie przyszłe wystąpienia w tym ASG zostaną uruchomione z nową konfiguracją uruchamiania. Jednak zmiana konfiguracji uruchamiania nie powoduje uruchomienia żadnych instancji, więc nie zobaczysz swoich zmian.

Aby wymusić nowe instancje, aby uruchomić, trzeba zrobić kilka rzeczy:

  1. Skonfiguruj parametr ASG name zależy bezpośrednio na nazwę konfiguracji startu. W ten sposób, za każdym razem, gdy zmieni się konfiguracja uruchamiania (która nastąpi po aktualizacji AMI lub danych użytkownika), Terraform spróbuje zastąpić ASG.
  2. Ustaw parametr create_before_destroy w ASG na true, więc za każdym razem, gdy Terraform spróbuje go zastąpić, utworzy zamiennik przed zniszczeniem oryginału.
  3. Ustaw parametr min_elb_capacity węzła ASG na min_size klastra, aby Terraform czekał na co najmniej tyle serwerów z nowego ASG, aby zarejestrować się w ELB, zanim zacznie niszczyć oryginalny ASG.

Oto z grubsza co kod Terraform wyglądałby następująco:

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 
    } 
} 

Dla przykładu w pełni pracuje, sprawdź zero-downtime deployment example code z książki Terraform: Up & Running.

+0

Dziękuję za odpowiedź. Jest zdumiewające, że Terraform nadal nie zapewnia wbudowanego sposobu, aby to zrobić bez obracania się i zrywania grupy automatycznej skalowania na każdym poziomie. –

+1

@NaftuliKay Tak, niestety, jest to nadal otwarty problem w społeczności Terraform: https://github.com/hashicorp/terraform/issues/1552. Zastosowanie powyższego podejścia 'create_before_destroy' jest teraz najlepszym rozwiązaniem z czysto terraformowym kodem.Jest zbliżony do niebiesko-zielonego wdrożenia, więc nie jest to zła opcja, ale nie działa dla wszystkich i, co krytyczne, NIE działa z dynamicznymi rozmiarami ASG. –