5

मैं एक एडब्ल्यूएस ऑटो स्केलिंग समूह, एक लॉन्च विन्यास, और एक ऑटो स्केलिंग समूह नीति इस तरह 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 सेकंड प्रतीक्षा करें, और फिर पुराने लोगों के अनुसार पुराने लोगों को फाड़ें।

यह धारणा दुर्भाग्य से गलत है। जब आप लॉन्च कॉन्फ़िगरेशन बदलते हैं, तो केवल एक चीज होती है जो आपके एडब्ल्यूएस खाते में एक नई लॉन्च कॉन्फ़िगरेशन बनाई जाती है और ऑटो स्केलिंग समूह (एएसजी) से जुड़ी होती है। इसका मतलब है कि सभी भविष्य उस एएसजी में उदाहरण नए लॉन्च कॉन्फ़िगरेशन के साथ लॉन्च होंगे। हालांकि, केवल लॉन्च कॉन्फ़िगरेशन को बदलने से किसी भी उदाहरण के लॉन्च को ट्रिगर नहीं किया जाता है, इसलिए आपको अपने परिवर्तन दिखाई नहीं देंगे।

लांच करने के लिए नई उदाहरणों के लिए मजबूर करने के लिए आपको कुछ बातें क्या करना है: ASG के name पैरामीटर लांच विन्यास के नाम पर सीधे निर्भर करने के लिए

  1. कॉन्फ़िगर। इस तरह, प्रत्येक बार जब लॉन्च कॉन्फ़िगरेशन बदलता है (जब आप एएमआई या उपयोगकर्ता डेटा अपडेट करते हैं तो यह होगा), टेराफॉर्म एएसजी को प्रतिस्थापित करने का प्रयास करेगा।
  2. एएसजी के create_before_destroy पैरामीटर को true पर सेट करें, इसलिए हर बार टेराफॉर्म इसे बदलने की कोशिश करता है, यह मूल को नष्ट करने से पहले प्रतिस्थापन बनाएगा।
  3. क्लस्टर के min_size पर एएसजी के min_elb_capacity पैरामीटर को सेट करें ताकि टेराफॉर्म मूल एएसजी को नष्ट करने से पहले ईएलबी में पंजीकरण करने के लिए कम से कम कई सर्वरों के लिए इंतजार कर सके।

    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 की जाँच:

यहाँ terraform कोड कैसा दिखेगा का मोटा अनुमान है।

+0

आपके उत्तर के लिए धन्यवाद। यह आश्चर्यजनक है कि टेराफॉर्म अभी भी हर प्रावधान पर एक ऑटो-स्केलिंग समूह को कताई और फाड़ने के बिना ऐसा करने का एक अंतर्निहित तरीका प्रदान नहीं करता है। –

+1

@NaftuliKay हां, दुर्भाग्यवश, यह अभी भी टेराफॉर्म समुदाय में एक खुली समस्या है: https://github.com/hashicorp/terraform/issues/1552। ऊपर 'create_before_destroy' दृष्टिकोण का उपयोग करना, अभी के लिए, पूरी तरह से टेराफॉर्म कोड के साथ आपका सबसे अच्छा समाधान है।यह नीली/हरे रंग की तैनाती के करीब है, इसलिए यह एक बुरा विकल्प नहीं है, लेकिन यह सभी के लिए काम नहीं करता है और, गंभीर रूप से, यह गतिशील रूप से आकार वाले एएसजी के साथ काम नहीं करता है। –

संबंधित मुद्दे