เป็นไปได้ไหมที่จะบังคับให้สร้าง EC2 :: Instance หรือ RDS :: DBInstance ใหม่อีกครั้งในรูปแบบคลาวด์ amazon?


16

เป็นไปได้ไหมที่จะบังคับให้สร้างอินสแตนซ์ EC2 หรือ RDS ขึ้นอีกครั้งโดยใช้กลุ่มของโครงสร้างคลาวด์

สแต็คของฉันติดอยู่ในจุดที่ทำลายและการสร้างทรัพยากรจะแก้ไขได้แทนที่จะต้องลบสแต็กทั้งหมดเพื่อทำงานต่อไป

แก้ไข:

ปัญหานี้ตีฉันสองครั้ง ก่อนอื่นฉันสร้าง AWS :: RDS :: อินสแตนซ์ด้วยค่าเริ่มต้นแล้วลองปรับลดรุ่นเป็น "EngineVersion": "5.5" การเปลี่ยนแปลงสิ่งนี้จะเกิดขึ้นกับการขัดจังหวะบางส่วน แต่อินสแตนซ์ mysql ไม่สามารถลดระดับจาก 5.6 เป็น 5.5 ได้ดังนั้นสแต็กจึงถูกปล่อยให้อยู่ในสถานะ UPDATE_FAILED และฉันไม่สามารถสร้าง RDS ใหม่ได้โดยไม่ต้องมีเคล็ดลับที่น่ารังเกียจ

อีกเหตุการณ์หนึ่งคือฉันมี "AWS :: EC2 :: Instance" หลายรายการซึ่งดาวน์โหลดและเรียกใช้สคริปต์จาก "UserData" โดยชัดแจ้งหาก Y เปลี่ยนสคริปต์ที่ดาวน์โหลดมาฉันจะต้องดำเนินการต่อและไม่ต้องทำเช่นนั้นอีก อีกครั้งฉันใช้เคล็ดลับที่น่ารังเกียจเดียวกันเพื่อให้เครื่องสร้างขึ้นมาใหม่

เคล็ดลับที่น่ารังเกียจ:

แทนที่จะใช้กลุ่มการวนอัตโนมัติของเครื่องหนึ่งฉันแก้ปัญหาทั้งสองอย่างที่เปลี่ยนเขตความพร้อมใช้งานในคุณสมบัติ ... แต่ทำให้ฉันมีรสนิยมแย่


ต้องการข้อมูลเพิ่มเติมเพื่อตอบ อินสแตนซ์ของคุณค้างเมื่อเริ่มต้นหรือไม่ บริการไม่ตอบสนองหรือไม่? หากคุณต้องการสร้างอินสแตนซ์ EC2 ขึ้นใหม่ด้วยตนเองคุณสามารถสร้างกลุ่มการปรับขนาดอัตโนมัติด้วยหนึ่งอินสแตนซ์ เมื่อคุณยกเลิกอินสแตนซ์อื่นจะถูกสร้างขึ้น
Edwin

แก้ไขเพื่อความกระจ่าง ฉันยังถามที่นี่: forums.aws.amazon.com/thread.jspa?threadID=135295&tstart=0
นับถือ

สิ่งนี้ไม่ได้ตอบคำถามของคุณโดยตรง แต่สำหรับการเรียกใช้สคริปต์ UserData อีกครั้งเมื่อมีการเปลี่ยนแปลงคุณสามารถดูได้ที่cfn-hup: docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/ …
Reed Kraft-Murphy

คำตอบ:


10

สำหรับอินสแตนซ์ที่ได้รับการสนับสนุนจากร้านค้าอินสแตนซ์เคล็ดลับอย่างหนึ่งคือการเพิ่มความคิดเห็นไปยังสคริปต์ข้อมูลผู้ใช้ที่มีหมายเลขเวอร์ชันวันที่หรือคล้ายกันจากนั้นเปลี่ยนทุกครั้งที่คุณต้องการสร้างอินสแตนซ์ใหม่:

{
    "Resources" : {
        "MyEC2Instance" : {
            "Type" : "AWS::EC2::Instance",
            "Properties" : {
                // ... other properties ...
                "UserData": { 
                    "Fn::Base64" : {
                        "Fn::Join" : [ ":", [
                        "#!/bin/bash\n",
                        "# Version: 1.0\n",
                        // ... rest of user data ...
                    ]]}
            }
        }
    }
}

การเปลี่ยนแปลงใด ๆ ที่UserDataจะทำให้อินสแตนซ์นั้นถูกแทนที่ (เช่นสร้างใหม่) พฤติกรรมของสคริปต์ข้อมูลผู้ใช้ควรเหมือนกันเนื่องจากการแก้ไขเพียงอย่างเดียวคือความคิดเห็น โปรดทราบว่าวิธีนี้ใช้ไม่ได้กับอินสแตนซ์ที่สำรอง EBS

สำหรับ RDS คุณสามารถใช้DB snapshotของอินสแตนซ์ RDS ปัจจุบันจากนั้นแก้ไขแม่แบบของคุณเพื่อใช้ snapshot นั้นด้วยDBSnapshotIdentifier:

{
    "Resources" : {
        "MyDB" : {
        "Type" : "AWS::RDS::DBInstance",
        "Properties" : {
            // ... other properties ...
            "DBSnapshotIdentifier": "<db snapshot ID>"
        }
    }    
}

เมื่อใดก็ตามที่DBSnapshotIdentifierมีการเปลี่ยนแปลงอินสแตนซ์ฐานข้อมูลจะถูกแทนที่ การใช้สแน็ปช็อตจะช่วยให้คุณป้องกันไม่ให้ข้อมูลเกิดขึ้นเมื่อสแนปชอตถูกสร้าง (หากคุณต้องการลบข้อมูลคุณสามารถสร้างสแน็ปช็อตที่ว่างเปล่าและส่งผ่านเป็นอินพุตหรือลบและสร้างสแต็ค CloudFormation ทั้งหมดใหม่ได้)

วิธีการทั่วไปเพิ่มเติมคือการเปลี่ยนชื่อตรรกะของทรัพยากร จากการ แก้ไข Stack Templateในเอกสาร CloudFormation:

สำหรับทรัพยากรส่วนใหญ่การเปลี่ยนชื่อโลจิคัลของทรัพยากรจะเทียบเท่ากับการลบทรัพยากรนั้นและแทนที่ด้วยชื่อใหม่ ทรัพยากรอื่น ๆ ที่ขึ้นอยู่กับทรัพยากรที่ถูกเปลี่ยนชื่อนั้นจำเป็นต้องได้รับการปรับปรุงและอาจทำให้พวกเขาถูกแทนที่ด้วย ทรัพยากรอื่น ๆ ต้องการให้คุณอัปเดตคุณสมบัติ (ไม่ใช่เฉพาะชื่อโลจิคัล) เพื่อทริกเกอร์การอัปเดต


ดูเหมือนว่าทางออกเดียวที่จะทำ "เคล็ดลับสกปรก" ฉันถึงวิธีการแก้ปัญหาที่คล้ายกัน (บังคับให้มีการเปลี่ยนแปลงโซนความพร้อมใช้งาน) บางครั้งหลังจากถาม :)
27417

4
เพียงแค่ต้องการชี้ให้เห็นว่าอินสแตนซ์จะถูกแทนที่และทำให้ UserData ดำเนินการเมื่ออินสแตนซ์ EC2 เป็นที่เก็บอินสแตนซ์ - กลับ หากได้รับการสนับสนุน EBS การเปลี่ยนแปลงของ UserData จะทำการรีสตาร์ทอินสแตนซ์เท่านั้นและ UserData จะไม่ถูกดำเนินการอีกครั้ง คุณสามารถใช้ cfn-hup เพื่อให้ UserData ทำงานอีกครั้งแม้ในกรณีนี้ แต่อินสแตนซ์ยังคงเหมือนเดิม
Kaitsu

@Kaitsu: ขอบคุณนั่นเป็นคำอธิบายที่มีค่ามาก ฉันปรับปรุงคำตอบของฉันตาม
markusk

@Kaitsu แต่ถ้าคุณเรียกใช้สคริปต์ใหม่ด้วยตนเอง (อยู่ที่ / var / lib / cloud / instance / สคริปต์ / part-001) คุณต้องแน่ใจว่าสคริปต์นั้นป้องกันการรันคำสั่งเดียวกันหลายครั้ง :(
c24w

1

หากคุณใส่ลงใน AutoScalingGroup คุณสามารถแก้ไข AutoScalingGroup min / max / default เป็น 0 จากนั้นทันทีที่มันเริ่มทำลายอินสแตนซ์เก่าคุณสามารถใส่ min / max / default เป็น 1/1/1 และ presto: อินสแตนซ์ใหม่


0

หาก EC2 ของคุณอยู่ใน AutoScalingGroup คุณสามารถตั้งค่าAutoScalingGroupNameคุณสมบัติด้วยหมายเลขรุ่นได้

ทุกครั้งที่คุณเปลี่ยนหมายเลขเวอร์ชัน CFN จะ: 1. สร้างกลุ่มการปรับขนาดอัตโนมัติใหม่และหมุนอินสแตนซ์ที่ต้องการ 2. ฆ่าอินสแตนซ์ในกลุ่มการปรับขนาดอัตโนมัติแบบเก่าและลบทิ้ง

นี่คือส่วนหนึ่งของรหัสจากสแต็กของฉันที่ฉันใช้เทคนิคนี้เพื่อบังคับให้เครื่อง EC2 จำนวนมากสร้างใหม่และดึงซอฟต์แวร์ใหม่จาก S3 โดยอัตโนมัติ

AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
        AutoScalingGroupName: !Sub "${StackName}-${ServiceName}-${ServiceVersion}"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.