Por que a formação da nuvem aws não instala os pacotes que eu especifico?

14

Sou muito novo nos serviços da AWS. Estou tentando usar a formação de nuvens da AWS e criei um modelo. O modelo está livre de erros e eu sou capaz de criar máquinas usando isso.

Mas adicionei algumas configurações no modelo para instalar o tomcat, git e outras coisas durante a inicialização. Mas isso não acontece para mim.

Aqui está uma parte do código que eu usei para instalar o tomcat:

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

Mas quando eu entro na máquina, tomcatnem gitfoi instalado!

Desde já, obrigado.

homem Morcego
fonte
Eu assumo pelas suas tags que essa é uma AMI do Ubuntu?
mattdm
Você tentou remover o "," depois do "git": []? Não é sintaticamente correto.
Edwin

Respostas:

23

Acredito que seu problema aqui é a confusão em torno de que o cloud-init não é o mesmo que o cfn-init.

  • cloud-init é a ferramenta iniciada como parte das AMIs AWS do Ubuntu que permitem a interpretação do componente de dados do usuário EC2 dos metadados da instância. O Amazon Linux também adotou essa ferramenta e a incorporou à sua AMI.

  • cfn-init faz parte de um conjunto de ferramentas diferente chamado Scripts CloudFormation Helper, criado pela AWS para Amazon Linux, que pode ler uma seção adicional nomeada Metadatano seu modelo CloudFormation.

Portanto, as AMIs do Ubuntu e Amazon Linux possuem as ferramentas cloud-init pré-instaladas para acessar os dados do usuário, mas apenas o Amazon Linux possui os scripts auxiliares do CloudFormation pré-instalados, por exemplo, cfn-init para acessar os metadados do CloudFormation.

No entanto, a AWS distribui pacotes que você pode usar para ler os metadados do CloudFormation. Especificamente, observe este modelo para saber como você pode usar um script de dados do usuário cloud-init para instalar python-setuptools, fazer o download dos scripts do CloudFormation Helper, instalá-los usando easy_install e, em seguida, chamar cfn-init.

Nota: Existem outras distribuições ou AMIs que podem suportar cloud-init ou cfn-init, mas apenas estou abordando os casos gerais aqui.

dialt0ne
fonte
12

Você precisa chamar cfn-init ( http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html ) dentro da propriedade UserData da instância:

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

A propriedade UserData é codificada em Base64 e permite especificar um script que deve ser executado no início da instância. Aqui você pode chamar cfn-init, que lerá os metadados CloudFormation :: Init e configurará tudo o que for especificado lá.

Além disso, ao criar a pilha CF, convém entrar em configurações avançadas na segunda página (depois de fornecer os parâmetros) e verifique se Rollback on error está definido como "No". Dessa forma, se o script cfn-init falhar por qualquer motivo, você poderá ssh na instância e verifique o arquivo /var/log/cfn-init.log para obter mais informações.

Andrei Fierbinteanu
fonte
Eu acho que essa deve ser a resposta aceita.
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
fonte
4
Eu não entendo ...
Pierre.Vriens