5

Tôi có một AWS Auto-Scaling Group, một cấu hình khởi động, và một chính sách Auto-Scaling Nhóm quy định tại Terraform như thế này:Groups Auto-Scaling Đừng Cập nhật vào Launch Configuration Change

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

Khi tôi thay đổi dữ liệu người dùng của tôi, một cấu hình khởi chạy mới được tạo và sau đó được gắn vào nhóm tự động mở rộng. Tôi sẽ giả định rằng điều này sẽ làm cho nhóm tự động mở rộng quy mô lên bởi var.asg_capacity trường hợp, chờ 300 giây, và sau đó xé xuống những cái cũ theo OldestInstance.

Khi tôi đã làm những điều tương tự trong CloudFormation, tôi đã sử dụng 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: 
    ... 

Có một analog cho điều này trong Terraform? Tôi thực sự muốn các nhóm tự động mở rộng của mình thay đổi khi tôi thay đổi cấu hình khởi chạy.

Trả lời

11

Tôi giả định rằng điều này sẽ khiến nhóm mở rộng tự động tăng tỷ lệ bởi các phiên bản var.asg_capacity, đợi 300 giây và sau đó rớt xuống các phiên bản cũ theo Cũ hơn.

Giả định này không may là không chính xác. Khi bạn thay đổi cấu hình khởi chạy, điều duy nhất xảy ra là cấu hình khởi chạy mới được tạo trong tài khoản AWS của bạn và được liên kết với Nhóm quy mô tự động (ASG). Điều đó có nghĩa là tất cả tương lai Các trường hợp trong đó ASG sẽ khởi chạy với cấu hình khởi chạy mới. Tuy nhiên, chỉ việc thay đổi cấu hình khởi chạy không kích hoạt việc khởi chạy bất kỳ phiên bản nào, vì vậy bạn sẽ không thấy các thay đổi của mình.

Buộc trường mới để khởi động, bạn phải làm một vài điều:

  1. Cấu hình name tham số của ASG phụ thuộc trực tiếp vào tên của cấu hình khởi động. Bằng cách đó, mỗi khi cấu hình khởi chạy thay đổi (khi nó cập nhật AMI hoặc dữ liệu người dùng), Terraform sẽ cố gắng thay thế ASG.
  2. Đặt tham số create_before_destroy của ASG thành true, vì vậy mỗi lần Terraform cố gắng thay thế, nó sẽ tạo thay thế trước khi phá hủy bản gốc.
  3. Đặt tham số min_elb_capacity của ASG thành min_size của cụm sao cho Terraform sẽ đợi ít nhất nhiều máy chủ từ ASG mới đăng ký trong ELB trước khi nó bắt đầu phá hủy ASG gốc.

Dưới đây là một ý tưởng sơ bộ những gì mã Terraform sẽ trông như thế:

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

Đối với một ví dụ làm việc đầy đủ, kiểm tra zero-downtime deployment example code từ cuốn sách Terraform: Up & Running.

+0

Cảm ơn câu trả lời của bạn. Thật đáng kinh ngạc là Terraform vẫn không cung cấp một cách tích hợp để làm điều này mà không kéo sợi và rách xuống một nhóm quy mô tự động trên mọi điều khoản. –

+1

@NaftuliKay Có, thật không may, đây vẫn là sự cố mở trong cộng đồng Terraform: https://github.com/hashicorp/terraform/issues/1552. Sử dụng phương pháp 'create_before_destroy' ở trên là, bây giờ, giải pháp tốt nhất của bạn với mã hoàn toàn Terraform.Nó gần với triển khai xanh/xanh, vì vậy nó không phải là một lựa chọn tồi, nhưng nó không hoạt động cho mọi người và, phê bình, nó KHÔNG hoạt động với ASG có kích thước động. –

Các vấn đề liên quan