Dlaczego formacja chmur aws nie instaluje pakietów, które określam?

14

Jestem bardzo nowy w usługach AWS. Próbuję użyć formacji chmury AWS i utworzyłem szablon. Szablon jest wolny od błędów i mogę z niego tworzyć maszyny.

Ale dodałem trochę konfiguracji w szablonie, tak że instaluje tomcat, git i inne rzeczy podczas uruchamiania. Ale to się nie zdarza.

Oto część kodu, którego użyłem do instalacji tomcat:

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

Ale kiedy loguję się do komputera, ani tomcatnie jestem gitzainstalowany!

Z góry dziękuję.

ordynans
źródło
Zakładam z twoich tagów, że jest to Ubuntu AMI?
mattdm
Czy próbowałeś usunąć „,” po „git”: []? To nie jest poprawne składniowo.
Edwin,

Odpowiedzi:

23

Uważam, że twoim problemem jest zamieszanie wokół tego, że inicjacja w chmurze nie jest tym samym, co cfn-init.

  • cloud-init to narzędzie, które zostało uruchomione jako część AMI Ubuntu AWS, które umożliwiają interpretację elementu danych użytkownika EC2 metadanych instancji. Amazon Linux również przyjął to narzędzie i wbudował je w AMI.

  • cfn-init jest częścią innego zestawu narzędzi o nazwie CloudFormation Helper Scripts utworzonego przez AWS dla Amazon Linux, który może odczytać dodatkową sekcję nazwaną Metadataw szablonie CloudFormation.

Tak więc zarówno AMI Ubuntu, jak i Amazon Linux mają fabrycznie zainstalowane narzędzia inicjujące chmurę, aby uzyskać dostęp do danych użytkownika, ale tylko Amazon Linux ma preinstalowane skrypty pomocnicze CloudFormation, np. Cfn-init, aby uzyskać dostęp do metadanych CloudFormation.

Jednak AWS dystrybuuje pakiety , których można użyć do odczytu metadanych CloudFormation. W szczególności spójrz na ten szablon, aby dowiedzieć się, jak użyć skryptu danych użytkownika inicjującego chmurę, aby zainstalować python-setuptools, pobrać skrypty pomocnicze CloudFormation, zainstalować je za pomocą easy_install, a następnie wywołać cfn-init.

Uwaga: istnieją inne dystrybucje lub interfejsy AMI, które mogą obsługiwać chmurę init lub cfn-init, ale tutaj omawiam tylko ogólne przypadki.

dialt0ne
źródło
12

Musisz wywołać cfn-init ( http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html ) we właściwości UserData instancji:

{
    "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"
                        ]]
                    }
                }
            }
        }
    }
}

Właściwość UserData jest zakodowana w standardzie Base64 i umożliwia określenie skryptu, który należy uruchomić podczas uruchamiania instancji. Tutaj możesz wywołać cfn-init, który odczyta CloudFormation :: Init Metadata i skonfiguruje wszystko tam określone.

Również podczas tworzenia stosu CF możesz chcieć przejść do ustawień zaawansowanych na drugiej stronie (po podaniu parametrów) i upewnić się, że Cofnięcie błędu jest ustawione na „Nie”. W ten sposób, jeśli skrypt cfn-init zawiedzie z jakiegokolwiek powodu, możesz ssh w instancji i sprawdzić plik /var/log/cfn-init.log, aby uzyskać więcej informacji.

Andrei Fierbinteanu
źródło
Myślę, że ta odpowiedź powinna być zaakceptowana.
Erik van Brakel
-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",
Nic
źródło
4
Nie rozumiem ...
Pierre.Vriens