Introducción - AWS CloudFormation

Introducción

Con la plantilla adecuada, puede implementar a la vez todos los recursos de AWS que necesita para una aplicación. En esta sección, examinará una plantilla que declara los recursos para un blog de WordPress, crea un blog de WordPress como una pila, monitoriza el proceso de creación de la pila, examina los recursos de la pila y, a continuación, elimina la pila. Puede usar la AWS Management Console para completar estas tareas.

Paso 1: Seleccionar una plantilla

En primer lugar, necesitará una plantilla que especifica los recursos que desea en la pila. Para este paso, se usa una plantilla de ejemplo que ya está preparada. La plantilla de ejemplo crea un blog de WordPress básico que utiliza una sola instancia Amazon EC2 con una base de datos de MySQL local para el almacenamiento. La plantilla también crea un grupo de seguridad de Amazon EC2 para controlar los ajustes del firewall de la instancia Amazon EC2.

importante

AWS CloudFormation es gratuito, pero los recursos de AWS que CloudFormation crea están activos (y no se ejecutan en un entorno aislado). Se le facturarán las tarifas de uso estándar por estos recursos hasta que los termine en la última tarea de este tutorial. Los cargos totales serán mínimos. Para obtener información acerca de cómo puede minimizar cualquier cargo, vaya a http://aws.amazon.com/free/.

Para ver la plantilla
  • Puede ver la plantilla de ejemplo de WordPress en JSON o YAML. No es necesario descargarla porque utilizará la URL de la plantilla más adelante en esta guía. Para obtener más información sobre los formatos de plantilla, consulte Formatos de plantilla de AWS CloudFormation.

Una plantilla es un archivo de texto con formato JSON o YAML que contiene la información de configuración de los recursos de AWS que desea crear en la pila. En este tutorial, la plantilla de ejemplo incluye seis secciones de nivel superior: AWSTemplateFormatVersion, Description, Parameters, Mappings, Resources y Outputs; sin embargo, solo se necesita la sección Resources.

La sección Recursos contiene las definiciones de los recursos de AWS que desea crear con la plantilla. Cada recurso se muestra por separado y especifica las propiedades necesarias para la creación de ese recurso en particular. La siguiente declaración de recursos es la configuración de la instancia de EC2, que en este ejemplo tiene el nombre lógico WebServer:

ejemplo JSON
"Resources" : { ... "WebServer": { "Type" : "AWS::EC2::Instance", "Properties": { "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "InstanceType" : { "Ref" : "InstanceType" }, "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], "KeyName" : { "Ref" : "KeyName" }, "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -xe\n", "yum update -y aws-cfn-bootstrap\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServer ", " --configsets wordpress_install ", " --region ", { "Ref" : "AWS::Region" }, "\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServer ", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]}} }, ... }, ... "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80 locked down to the load balancer + SSH access", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "CidrIp" : "0.0.0.0/0"}, {"IpProtocol" : "tcp", "FromPort" : 22, "ToPort" : 22, "CidrIp" : { "Ref" : "SSHLocation"}} ] } }, ... },
ejemplo YAML
Resources: ... WebServer: Type: AWS::EC2::Instance Properties: ImageId: !FindInMap [AWSRegionArch2AMI, !Ref 'AWS::Region', !FindInMap [AWSInstanceType2Arch, !Ref InstanceType, Arch]] InstanceType: Ref: InstanceType KeyName: Ref: KeyName SecurityGroups: - Ref: WebServerSecurityGroup UserData: Fn::Base64: !Sub | #!/bin/bash -xe yum update -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource WebServer --configsets wordpress_install --region ${AWS::Region} /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackId} --resource WebServer --region ${AWS::Region} ... ... WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: "Enable HTTP access via port 80 locked down to the load balancer + SSH access" SecurityGroupIngress: - CidrIp: 0.0.0.0/0 FromPort: 80 IpProtocol: tcp ToPort: 80 - CidrIp: !Ref SSHLocation FromPort: 22 IpProtocol: tcp ToPort: 22 ...

Si ha creado antes instancias de EC2, puede reconocer propiedades como, por ejemplo ImageId, InstanceType y KeyName, que determinan la configuración de la instancia. Las declaraciones de recursos son una forma eficaz de especificar todos estos ajustes de configuración a la vez. Cuando incluye declaraciones de recursos en una plantilla, puede crear y configurar todos los recursos declarados utilizando la plantilla para crear una pila. Cree una nueva pila que utiliza la misma plantilla para lanzar la misma configuración de recursos.

La declaración de recursos comienza con una cadena que especifica el nombre lógico para el recurso. Como verá, es posible utilizar el nombre lógico para hacer referencia a los recursos de la plantilla.

Puede utilizar la sección Parameters (Parámetros) para declarar valores que se pueden transferir a la plantilla cuando crea la pila. Un parámetro también constituye una forma eficaz de especificar información confidencial, como los nombres y contraseñas de los usuarios, que no desea almacenar en la propia plantilla. También es una forma de especificar información que podría ser única de la configuración o de la aplicación específica que está implementando, por ejemplo, un nombre de dominio o tipo de instancia. Al crear la pila de WordPress más adelante en esta sección, verá que el conjunto de parámetros declarados en la plantilla aparece en la página Specify Details (Especificar detalles) del asistente Create Stack (Crear pila), donde puede especificar los parámetros antes de crear la pila.

Los siguientes parámetros se utilizan en la plantilla para especificar valores que se utilizan en las propiedades de la instancia de EC2:

ejemplo JSON
"Parameters" : { ... "KeyName": { "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instances", "Type": "AWS::EC2::KeyPair::KeyName", "ConstraintDescription" : "must be the name of an existing EC2 KeyPair." }, "InstanceType" : { "Description" : "WebServer EC2 instance type", "Type" : "String", "Default" : "t2.small", "AllowedValues": [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge" ], "ConstraintDescription" : "must be a valid EC2 instance type." }, ...
ejemplo YAML
Parameters: ... KeyName: ConstraintDescription: must be the name of an existing EC2 KeyPair. Description: Name of an existing EC2 KeyPair to enable SSH access to the instances Type: AWS::EC2::KeyPair::KeyName InstanceType: AllowedValues: - t1.micro - t2.nano - t2.micro - t2.small - t2.medium - t2.large - m1.small - m1.medium - m1.large - m1.xlarge - m2.xlarge - m2.2xlarge - m2.4xlarge - m3.medium - m3.large - m3.xlarge - m3.2xlarge - m4.large - m4.xlarge - m4.2xlarge - m4.4xlarge - m4.10xlarge - c1.medium - c1.xlarge - c3.large - c3.xlarge - c3.2xlarge - c3.4xlarge - c3.8xlarge - c4.large - c4.xlarge - c4.2xlarge - c4.4xlarge - c4.8xlarge - g2.2xlarge - g2.8xlarge - r3.large - r3.xlarge - r3.2xlarge - r3.4xlarge - r3.8xlarge - i2.xlarge - i2.2xlarge - i2.4xlarge - i2.8xlarge - d2.xlarge - d2.2xlarge - d2.4xlarge - d2.8xlarge - hi1.4xlarge - hs1.8xlarge - cr1.8xlarge - cc2.8xlarge - cg1.4xlarge ConstraintDescription: must be a valid EC2 instance type. Default: t2.small Description: WebServer EC2 instance type Type: String ...

En la declaración de recursos WebServer, es posible ver la propiedad KeyName especificada en el parámetro KeyName:

ejemplo JSON
"WebServer" : { "Type": "AWS::EC2::Instance", "Properties": { "KeyName" : { "Ref" : "KeyName" }, ... } },
ejemplo YAML
WebServer: Type: AWS::EC2::Instance Properties: KeyName: Ref: KeyName ...

Las llaves contienen una llamada a la función Ref con KeyName como su entrada. La función Ref devuelve el valor del objeto al que se refiere. En este caso, la función Ref establece la propiedad KeyName al valor especificado para KeyName cuando se creó la pila.

La función Ref también puede establecer la propiedad de un recurso en el valor de otro recurso. Por ejemplo, la declaración de recursos WebServer contiene la siguiente declaración de propiedad:

ejemplo JSON
"WebServer" : { "Type": "AWS::EC2::Instance", "Properties": { ... "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], ... } },
ejemplo YAML
WebServer: Type: AWS::EC2::Instance Properties: SecurityGroups: - Ref: WebServerSecurityGroup ...

La propiedad SecurityGroups toma una lista de los grupos de seguridad de EC2. La función Ref tiene una entrada de WebServerSecurityGroup, que es el nombre lógico de un grupo de seguridad en la plantilla y añade el nombre de WebServerSecurityGroup a la propiedad SecurityGroups.

En la plantilla, también podrá encontrar una sección denominada Mappings (Mapeos). Puede utilizar asignaciones para declarar valores condicionales que se evalúan de manera similar a una declaración de tabla de búsqueda. La plantilla utiliza mapeos para seleccionar la imagen de máquina de Amazon (AMI) correcta para la Región y el tipo de arquitectura para el tipo de instancia. Outputs (Salidas) define los valores personalizados devueltos por el comando aws cloudformation describe-stacks y en la pestaña Outputs (Salidas) de la consola de CloudFormation, una vez que se ha creado la pila. Puede utilizar valores de salida para devolver información de los recursos de la pila, como la URL de un sitio web que se creó en la plantilla. Se abarcan mapeos, salidas y otros aspectos sobre las plantillas de forma más detallada en Más información sobre los aspectos básicos de las plantillas.

Esto es suficiente, por ahora, con respecto a la plantillas. Comencemos creando una pila.

Paso 2: Comprobar que se han preparado los elementos necesarios para la pila

Antes de crear una pila a partir de una plantilla, debe asegurarse de que todos los recursos dependientes que necesita la plantilla están disponibles. Una plantilla puede utilizar o referirse a recursos de AWS existentes y a recursos declarados en la plantilla misma. CloudFormation se encarga de la comprobación de referencias a los recursos de la plantilla y también comprueba referencias a los recursos existentes para asegurarse de que se encuentran en la región en la que está creando la pila. Si la plantilla se refiere a un recurso dependiente que no existe, la creación de la pila falla.

La plantilla de WordPress de ejemplo contiene un parámetro de entrada, KeyName, que especifica el par de claves utilizado para la instancia Amazon EC2 declarada en la plantilla. La plantilla depende del usuario que crea una pila a partir de la plantilla para suministrar un par de claves de Amazon EC2 válido para el parámetro KeyName. Si proporciona un nombre de par de claves válido, la pila se crea correctamente. Si no proporciona un nombre de par de claves válido, se restaura la pila.

Asegúrese de que tiene un par de claves de Amazon EC2 válido y registre el nombre del par de claves antes de crear la pila.

Para ver los pares de claves, abra la consola de Amazon EC2 y, a continuación, haga clic en Key Pairs (Pares de claves) en el panel de navegación.

nota

Si no tiene un par de claves de Amazon EC2, debe crear el par de claves en la misma región donde está creando la pila. Para obtener más información sobre la creación de un par de claves, consulte la sección sobre cómo obtener un par de claves SSH en la Guía del usuario de Amazon EC2 para instancias de Linux.

Ahora que tiene un par de claves válido, vamos a utilizar la plantilla de WordPress para crear una pila.

Paso 3: Crear la pila

Creará la pila en función del archivo WordPress-1.0.0 del que hemos hablado anteriormente. La plantilla contiene varios recursos de AWS, como una instancia de EC2.

Creación de la pila de WordPress
  1. Inicie sesión en la AWS Management Console y abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation.

  2. Elija Crear pila.

  3. En la sección Especificar plantilla, seleccione Especificar una URL de plantilla de Amazon S3 para escribir o pegar la URL de la plantilla de WordPress de ejemplo y, a continuación, elija Siguiente:

    https://s3.us-west-2.amazonaws.com/cloudformation-templates-us-west-2/WordPress_Single_Instance.template

    nota

    Las plantillas de AWS CloudFormation que se almacenan en un bucket de S3 deben ser accesibles para el usuario que crea la pila y deben estar ubicadas en la misma región que la pila que se está creando. Por lo tanto, si el bucket S3 está ubicado en la región us-east-2, la pila también debe crearse en us-east-2

  4. En la sección Especificar detalles de pila, introduzca un nombre de pila en el campo Nombre de pila. Para este ejemplo, use MyWPTestStack. El nombre de la pila no debe contener espacios.

  5. En la sección Parámetros debe proporcionar valores para todos los parámetros que no tengan valores predeterminados, incluidos DBUser, DBPassword, DBRootPassword y KeyName. En el campo KeyName, escriba el nombre de un par Amazon EC2 válido en la misma región en la que está creando la pila.

  6. Elija Siguiente.

  7. En esta situación, no añada ninguna etiqueta. Elija Siguiente. Las etiquetas, que son pares clave-valor, pueden ayudarle a identificar las pilas. Para obtener más información, consulte la sección sobre cómo añadir etiquetas a su pila de CloudFormation.

  8. Revisión de la información de la pila. Cuando esté satisfecho con la configuración, haga clic en Submit (Enviar).

La pila podría tardar varios minutos en crearse, pero lo más probable es que no desee sentarse a esperar. Si es como nosotros, probablemente quiera saber cómo va la creación de la pila.

Paso 4: Monitorizar el progreso de creación de la pila

Después de completar el asistente para Create Stack (Crear pilas), CloudFormation comienza a crear los recursos que se especifican en la plantilla. La nueva pila, MyWPTestStack, aparece en la lista en la parte superior de la consola de CloudFormation. Su estado debe ser CREATE_IN_PROGRESS. Puede ver el estado detallado de una pila visualizando sus eventos.

Visualización de los eventos de la pila
  1. En la consola de CloudFormation, seleccione la pila MyWPTestStack en la lista.

  2. En el panel de detalles de la pila, elija la pestaña Events (Eventos).

    La consola actualiza automáticamente la lista de eventos con los últimos eventos cada 60 segundos.

La pestaña Events (Eventos) muestra todos los pasos importantes de la creación de la pila ordenados por la hora de cada evento, con los últimos eventos en la parte superior.

El primer evento (en la parte inferior de la lista de eventos) es el comienzo del proceso de creación de la pila:

2013-04-24 18:54 UTC-7 CREATE_IN_PROGRESS AWS::CloudFormation::Stack MyWPTestStack User initiated

A continuación se encuentran los eventos que señalan el comienzo y la finalización de la creación de cada recurso. Por ejemplo, la creación de la instancia de EC2 produce las siguientes entradas:

2013-04-24 18:59 UTC-7 CREATE_COMPLETE AWS::EC2::Instance...

2013-04-24 18:54 UTC-7 CREATE_IN_PROGRESS AWS::EC2::Instance...

El evento CREATE_IN_PROGRESS se registra cuando CloudFormation informa que ha comenzado a crear el recurso. El evento CREATE_COMPLETE se registra cuando se crea correctamente el recurso.

Una vez que CloudFormation haya creado correctamente la pila, verá el siguiente evento en la parte superior de la pestaña Events (Eventos):

2013-04-24 19:17 UTC-7 CREATE_COMPLETE AWS::CloudFormation::Stack MyWPTestStack

Si CloudFormation no puede crear un recurso, informa de un evento de CREATE_FAILED y, de forma predeterminada, restaura la pila y elimina todos los recursos que se han creado. La columna Status Reason (Motivo del estado) muestra el problema que ha provocado el error.

Paso 5: Utilizar los recursos de la pila

Cuando la pila MyWPTestStack tiene un estado de CREATE_COMPLETE, CloudFormation ha finalizado la creación de la pila y puede comenzar a utilizar sus recursos.

La pila de WordPress de ejemplo crea un sitio web de WordPress. Puede continuar con la configuración de WordPress mediante la ejecución del script de instalación de WordPress.

Para completar la instalación de WordPress
  1. En la pestaña Outputs (Salidas), en la fila WebsiteURL, elija el enlace de la columna Value (Valor).

    El valor de salida de WebsiteURL es la URL del script de instalación del sitio web de WordPress que creó con la pila.

  2. En la página web para la instalación de WordPress, siga las instrucciones en pantalla para completar la instalación de WordPress. Para obtener más información acerca de la instalación de WordPress, consulte https://wordpress.org/support/article/how-to-install-wordpress/.

    Después de completar la instalación e iniciar sesión, se le dirige al panel donde puede establecer opciones adicionales para su blog de WordPress. A continuación, puede comenzar a escribir publicaciones para el blog que ha creado correctamente mediante una plantilla de CloudFormation.

Paso 6: Limpiar

Ha completado las tareas de introducción de CloudFormation. Para asegurarse de que no se le cobra por ningún servicio no deseado, puede realizar una limpieza eliminando la pila y sus recursos.

Eliminación de la pila y sus recursos
  1. En la consola de CloudFormation, seleccione la pila MyWPTestStack.

  2. Elija Delete Stack.

  3. En el mensaje de confirmación que aparece, elija Yes, Delete (Si, Eliminar).

El estado de MyWPTestStack cambia a DELETE_IN_PROGRESS. La eliminación de la pila se puede monitorizar en la pestaña Event (Evento) igual que su creación. Cuando CloudFormation completa la eliminación de la pila, quita la pila de la lista.

¡Enhorabuena! Ha seleccionado una plantilla, ha creado una pila, ha visto y utilizado sus recursos, y ha eliminado la pila y los recursos correctamente. Además, ha podido configurar un blog de WordPress mediante una plantilla de CloudFormation. Puede encontrar otras plantillas en la Biblioteca de plantillas de muestra de AWS CloudFormation.

Ha llegado el momento de obtener más información acerca de las plantillas para poder modificar fácilmente plantillas existentes o crear las propias: Más información sobre los aspectos básicos de las plantillas.