¿Por qué la formación de nubes aws no instala los paquetes que especifico?

14

Soy muy nuevo en los servicios de AWS. Estoy tratando de usar la formación en la nube de AWS y creé una plantilla. La plantilla está libre de errores y puedo crear máquinas con eso.

Pero he agregado algo de configuración en la plantilla para que instale tomcat, git y otras cosas durante el inicio. Pero eso no me pasa a mí.

Aquí hay una parte del código que utilicé para instalar tomcat:

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

¡Pero cuando inicio sesión en la máquina tomcatni githe sido instalado!

Gracias por adelantado.

hombre murciélago
fuente
¿Asumo por sus etiquetas que este es un Ubuntu AMI?
mattdm
¿Has intentado eliminar el "," después de "git": []? No es sintácticamente correcto.
Edwin

Respuestas:

23

Creo que su problema aquí es la confusión en torno a que cloud-init no es lo mismo que cfn-init.

  • cloud-init es la herramienta que comenzó como parte de las AMI de Ubuntu AWS que permiten la interpretación del componente de datos de usuario EC2 de los metadatos de la instancia. Amazon Linux también adoptó esta herramienta y la incorporó a su AMI.

  • cfn-init es parte de un conjunto de herramientas diferente llamado CloudFormation Helper Scripts creado por AWS para Amazon Linux que puede leer una sección adicional nombrada Metadataen su plantilla CloudFormation.

Entonces, las AMI de Ubuntu y Amazon Linux tienen las herramientas de inicio en la nube preinstaladas para acceder a los datos del usuario, pero solo Amazon Linux tiene los scripts de ayuda de CloudFormation preinstalados, por ejemplo, cfn-init para acceder a los metadatos de CloudFormation.

Sin embargo, AWS distribuye paquetes que puede usar para leer los metadatos de CloudFormation. Específicamente, mire esta plantilla para saber cómo puede usar un script de datos de usuario de cloud-init para instalar python-setuptools, descargar los scripts de ayuda de CloudFormation, instalarlos usando easy_install y luego invocar cfn-init.

Nota: Hay otras distribuciones o AMI que pueden admitir cloud-init o cfn-init, pero solo estoy cubriendo los casos generales aquí.

dialt0ne
fuente
12

Debe llamar a cfn-init ( http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html ) dentro de la propiedad UserData de la instancia:

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

La propiedad UserData está codificada en Base64 y le permite especificar un script que debe ejecutarse en el lanzamiento de la instancia. Aquí puede llamar a cfn-init, que leerá CloudFormation :: Init Metadata y configurará todo lo especificado allí.

Además, al crear la pila CF, es posible que desee acceder a la configuración avanzada en la segunda página (después de proporcionar los parámetros) y asegurarse de que la opción Revertir error esté establecida en "No". De esa forma, si el script cfn-init falla por cualquier razón, puede ingresar a la instancia y consultar el archivo /var/log/cfn-init.log para obtener más información.

Andrei Fierbinteanu
fuente
Creo que esta debería ser la respuesta aceptada.
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
fuente
44
No lo entiendo ...
Pierre.Vriens