ทำไมการก่อตัวของเมฆ aws ไม่ติดตั้งแพคเกจที่ฉันระบุ?


14

ฉันใหม่มากสำหรับบริการ AWS ฉันพยายามใช้การก่อตัวของเมฆ AWS และฉันสร้างเทมเพลต แม่แบบนั้นไม่มีข้อผิดพลาดและฉันสามารถสร้างเครื่องโดยใช้สิ่งนั้นได้

แต่ฉันได้เพิ่มการตั้งค่าบางอย่างในเทมเพลตเพื่อให้ติดตั้ง tomcat, git และสิ่งอื่น ๆ ในระหว่างการเริ่มต้น แต่นั่นไม่ได้เกิดขึ้นกับฉัน

นี่เป็นส่วนหนึ่งของรหัสที่ฉันใช้ในการติดตั้ง tomcat:

"Resources": {
    "Tomcat": {
        "Type": "AWS::EC2::Instance",
        "Metadata": {
            "AWS::CloudFormation::Init": {
                "config": {
                    "packages": {
                        "apt": {
                            "tomcat6": [],
                            "git": [],
                        }
                    }
                }
            }
        },

แต่เมื่อฉันเข้าสู่เครื่องค่าtomcatมิได้gitมีการติดตั้ง!

ขอบคุณล่วงหน้า.


ฉันคิดว่าจากแท็กของคุณว่านี่คือ Ubuntu AMI หรือไม่?
mattdm

คุณพยายามลบ "," หลังจาก "git": []? มันไม่ถูกต้องทางวากยสัมพันธ์
Edwin

คำตอบ:


23

ฉันเชื่อว่าปัญหาของคุณที่นี่คือความสับสนรอบที่ cloud-init ไม่เหมือนกับ cfn-init

  • cloud-initเป็นเครื่องมือที่เริ่มต้นโดยเป็นส่วนหนึ่งของ Ubuntu AWS AMIs ที่ช่วยให้การตีความส่วนประกอบข้อมูลผู้ใช้ EC2 ของ meta-data ของอินสแตนซ์ Amazon Linux ใช้เครื่องมือนี้เช่นกันและสร้างมันไว้ใน AMI ของพวกเขา

  • cfn-initเป็นส่วนหนึ่งของชุดเครื่องมือที่เรียกว่าสคริปต์ตัวช่วย CloudFormation ที่สร้างขึ้นโดย AWS สำหรับAmazon Linuxที่สามารถอ่านส่วนเพิ่มเติมที่ตั้งชื่อMetadataในเทมเพลต CloudFormation ของคุณ

ดังนั้น Ubuntu และ Amazon Linux AMIs มีเครื่องมือ cloud-init ติดตั้งไว้ล่วงหน้าเพื่อเข้าถึงข้อมูลผู้ใช้ แต่มีเพียง Amazon Linux เท่านั้นที่มีสคริปต์ผู้ช่วย CloudFormationติดตั้งไว้ล่วงหน้าเช่น cfn-init เพื่อเข้าถึง CloudFormation Metadata

อย่างไรก็ตาม AWS จะแจกจ่ายแพ็คเกจที่คุณสามารถใช้อ่าน Metadata ของ CloudFormation ให้ดูที่แม่แบบนี้สำหรับวิธีที่คุณสามารถใช้สคริปต์ข้อมูลผู้ใช้แบบคลาวด์เพื่อติดตั้ง python-setuptools ดาวน์โหลดสคริปต์ตัวช่วย CloudFormation ติดตั้งโดยใช้ easy_install จากนั้นเรียกใช้ cfn-init

หมายเหตุ: มีดิสทริบิวชันอื่น ๆ หรือ AMIs ที่อาจรองรับ cloud-init หรือ cfn-init แต่ฉันแค่ครอบคลุมกรณีทั่วไปที่นี่


12

คุณต้องโทรหา cfn-init ( http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html ) ภายในคุณสมบัติ UserData ของอินสแตนซ์:

{
    "Resources": {
        "Tomcat": {
            "Type": "AWS::EC2::Instance",
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "config": {
                        "packages": {
                            "apt": {
                                "tomcat6": [],
                                "git": []
                            }
                        }
                    }
                }
            },
            "Properties": {
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": ["", [
                            "#!/bin/bash\n",
                            "/opt/aws/bin/cfn-init -s ", {
                                "Ref": "AWS::StackName"
                            },
                            "    -r Tomcat",
                            "    --region ", {
                                "Ref": "AWS::Region"
                            }, "\n"
                        ]]
                    }
                }
            }
        }
    }
}

กระบวนการ UserData มีการเข้ารหัส Base64 และอนุญาตให้คุณระบุสคริปต์ที่ควรเรียกใช้เมื่อเปิดใช้งานอินสแตนซ์ ที่นี่คุณสามารถเรียก cfn-init ซึ่งจะอ่าน CloudFormation :: Init Metadata และตั้งค่าทุกอย่างที่ระบุไว้ที่นั่น

นอกจากนี้เมื่อสร้าง CF Stack คุณอาจต้องการเข้าสู่การตั้งค่าขั้นสูงในหน้าสอง (หลังจากให้พารามิเตอร์) และตรวจสอบให้แน่ใจว่า Rollback on error ตั้งเป็น "ไม่" ด้วยวิธีนี้หากสคริปต์ cfn-init ล้มเหลวไม่ว่าด้วยเหตุผลใดก็ตามคุณสามารถ ssh ไปยังอินสแตนซ์และตรวจสอบไฟล์ /var/log/cfn-init.log เพื่อดูข้อมูลเพิ่มเติม


ฉันคิดว่าอันนี้ควรเป็นคำตอบที่ยอมรับได้
Erik van Brakel

1

คำตอบข้างต้นถูกต้อง แต่คุณควรตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งสคริปต์ตัวช่วย CloudFormation สำเร็จแล้ว โปรดปฏิบัติตามhttp://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-helper-scripts-reference.htmlสำหรับรายละเอียดการติดตั้ง


-3
    "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
      "#!/bin/bash\n",
      "export DEBIAN_FRONTEND=noninteractive\n",
      "apt-get update && apt-get upgrade -y\n",
      "apt-get -y install python-setuptools\n",
      "easy_install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
      "/usr/local/bin/cfn-init --stack ", { "Ref":"AWS::StackName" }, " --resource <REPLACE_WITH_RESOURCENAME>", " --region ", { "Ref": "AWS::Region" }, "\n",

4
ฉันไม่เข้าใจ ...
Pierre.Vriens
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.