

# Creación de su primera pila
<a name="gettingstarted.walkthrough"></a>

En este tema se explica cómo crear su primera pila de CloudFormation con la Consola de administración de AWS. Si sigue este tutorial, obtendrá información sobre cómo aprovisionar recursos básicos de AWS, supervisar los eventos de la pila y generar resultados.

Para este ejemplo, la plantilla de CloudFormation está escrita en YAML. YAML es un formato legible por humanos que se usa ampliamente para definir la infraestructura como código. Al obtener más información sobre CloudFormation, es posible que también encuentre otras plantillas en formato JSON, pero para este tutorial, se elige YAML por su legibilidad.

**nota**  
CloudFormation es gratuito, pero se le cobrarán los recursos de Amazon EC2 y Amazon S3 que cree. Sin embargo, si es la primera vez que utiliza AWS, puede aprovechar el [nivel gratuito](https://aws.amazon.com/free/) para minimizar o eliminar los costos durante este proceso de aprendizaje.

**Topics**
+ [Requisitos previos](#getting-started-prerequisites)
+ [Creación de una pila de CloudFormation con la consola](#getting-started-create-stack)
+ [Supervisión de la creación de una pila](#getting-started-monitor-stack-creation)
+ [Prueba del servidor web](#getting-started-test-web-server)
+ [Solución de problemas](#getting-started-troubleshooting)
+ [Limpieza](#getting-started-clean-up)
+ [Siguientes pasos](#getting-started-next-steps)

## Requisitos previos
<a name="getting-started-prerequisites"></a>
+ Debe tener acceso a una Cuenta de AWS con un usuario o rol de IAM que tenga permisos para usar Amazon EC2, Amazon S3 y CloudFormation, o acceso de usuario administrativo.
+ Debe tener una nube privada virtual (VPC) que tenga acceso a Internet. Para la plantilla de este tutorial se necesita una VPC predeterminada, que se incluye automáticamente con las Cuentas de AWS más recientes. Si no tiene una VPC predeterminada, o si se eliminó, consulte la sección de solución de problemas de este tema para ver soluciones alternativas.

## Creación de una pila de CloudFormation con la consola
<a name="getting-started-create-stack"></a>

**Creación de una pila de CloudFormation Hello world con la consola**

1. Abra la [consola de CloudFormation](https://console.aws.amazon.com/cloudformation/).

1. Elija **Crear pila**.

1. En la página **Crear pila**, seleccione **Crear a partir de Infrastructure Composer** y, a continuación, **Cree en Infrastructure Composer**. De esta forma, accederá a Infrastructure Composer en el modo de consola de CloudFormation, donde puede cargar y validar la plantilla de ejemplo.

1. Para cargar y validar la plantilla de ejemplo, haga lo siguiente:

   1. Elija **Plantilla**. A continuación, copie y pegue la siguiente plantilla de CloudFormation en el editor de plantillas:

      ```
      AWSTemplateFormatVersion: 2010-09-09
      Description: CloudFormation Template for WebServer with Security Group and EC2 Instance
      
      Parameters:
        LatestAmiId:
          Description: The latest Amazon Linux 2 AMI from the Parameter Store
          Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
          Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
      
        InstanceType:
          Description: WebServer EC2 instance type
          Type: String
          Default: t2.micro
          AllowedValues:
            - t3.micro
            - t2.micro
          ConstraintDescription: must be a valid EC2 instance type.
          
        MyIP:
          Description: Your IP address in CIDR format (e.g. 203.0.113.1/32).
          Type: String
          MinLength: '9'
          MaxLength: '18'
          Default: 0.0.0.0/0
          AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
          ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
      
      Resources:
        WebServerSecurityGroup:
          Type: AWS::EC2::SecurityGroup
          Properties:
            GroupDescription: Allow HTTP access via my IP address
            SecurityGroupIngress:
              - IpProtocol: tcp
                FromPort: 80
                ToPort: 80
                CidrIp: !Ref MyIP
      
        WebServer:
          Type: AWS::EC2::Instance
          Properties:
            ImageId: !Ref LatestAmiId
            InstanceType: !Ref InstanceType
            SecurityGroupIds:
              - !Ref WebServerSecurityGroup
            UserData: !Base64 |
              #!/bin/bash
              yum update -y
              yum install -y httpd
              systemctl start httpd
              systemctl enable httpd
              echo "<html><body><h1>Hello World!</h1></body></html>" > /var/www/html/index.html
      
      Outputs:
        WebsiteURL:
          Value: !Join
            - ''
            - - http://
              - !GetAtt WebServer.PublicDnsName
          Description: Website URL
      ```

      Antes de avanzar al siguiente paso, dediquemos un momento a echar un vistazo a la plantilla y comprender algunos conceptos clave de CloudFormation.
      + En la sección **`Parameters`** se declaran valores que se pueden transferir a la plantilla cuando crea la pila. Los recursos especificados más adelante en la plantilla hacen referencia a estos valores y utilizan los datos. Los parámetros son un método efectivo para especificar información que no desea almacenar en la propia plantilla. También sirven para especificar información que podría ser única de la configuración o de la aplicación específica que está implementando.
      + La plantilla define los siguientes parámetros:
        + **`LatestAmiId`**: recupera el ID de la AMI de Amazon Linux 2 más reciente del Almacén de parámetros de AWS Systems Manager.
        + **`InstanceType`**: permite seleccionar el tipo de instancia de EC2 (valor predeterminado: `t2.micro`, valores permitidos: `t3.micro`, `t2.micro`). 
        + **`MyIP`**: especifica el rango de direcciones IP para el acceso HTTP (el valor predeterminado es 0.0.0.0/0, que permite acceder desde cualquier IP).
      + La sección **`Resources`** contiene las definiciones de los recursos de AWS que desea crear con la plantilla. 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 si utiliza la plantilla para crear una pila. También puede crear nuevas pilas a partir de la misma plantilla para lanzar configuraciones de recursos idénticas.
      + Esta plantilla crea los siguientes recursos:
        + **`WebServerSecurityGroup`**: grupo de seguridad de EC2 que permite el tráfico HTTP de entrada en el puerto 80 desde el rango de IP especificado.
        + **`WebServer`**: instancia de EC2 con la siguiente configuración:
          + Usa la AMI de Amazon Linux 2 más reciente.
          + Aplica el tipo de instancia seleccionado.
          + Agrega `WebServerSecurityGroup` a la propiedad `SecurityGroupIds`.
          + Incluye un script de datos de usuario para instalar Apache HTTP Server.
      + Se especifica un nombre lógico al principio de cada declaración de recursos y parámetros. Por ejemplo, `WebServerSecurityGroup` es el nombre lógico asignado al recurso del grupo de seguridad de EC2. A continuación, la función `Ref` se utiliza para hacer referencia a los recursos y parámetros mediante sus nombres lógicos en otras partes de la plantilla. Cuando un recurso hace referencia a otro, se crea una dependencia entre ellos.
      + En la sección **`Outputs`** se definen los valores personalizados que se devuelven después de crear la pila. Puede usar los valores de salida para devolver información de los recursos de la pila, como identificadores de recursos o URL.
      + La plantilla define una salida:
        + **`WebsiteURL`**: URL del servidor web implementado, que se crea con el nombre de DNS público de la instancia de EC2. La función `Join` ayuda a combinar el parámetro fijo `http://` con el parámetro variable `PublicDnsName` en una sola cadena, lo que facilita la obtención de la URL completa del servidor web.

   1. Seleccione **Validate** para asegurarse de que el código YAML sea válido antes de cargar la plantilla.

   1. A continuación, seleccione **Create template** para crear la plantilla y agregarla a un bucket de S3.

   1. Tome nota del nombre del bucket de S3 que aparecen en el cuadro de diálogo que se abre para poder eliminarlo posteriormente. A continuación, seleccione **Confirm and continue to CloudFormation**. De esta forma, accede a la consola de CloudFormation, donde ahora se especifica la ruta de S3 a su plantilla.

1. En la página **Crear pila**, seleccione **Siguiente**.

1. En la página **Especificar los detalles de la pila**, escriba un nombre en el campo **Nombre de la pila**. El nombre de la pila no debe contener espacios. Para este ejemplo, use **MyTestStack**.

1. En **Parámetros**, especifique los valores de los parámetros de la siguiente manera:
   + **LatestAmiId**: se define de forma predeterminada en la AMI de Amazon Linux 2 más reciente.
   + **InstanceType**: elija **t2.micro** o **t3.micro** para el tipo de instancia de EC2.
**nota**  
Si es la primera vez que utiliza AWS, puede usar el nivel gratuito para lanzar y usar una instancia `t2.micro` de forma gratuita durante 12 meses (en regiones donde `t2.micro` no esté disponible, puede usar una instancia `t3.micro` del nivel gratuito).
   + **MyIP**: especifique su dirección IP pública real con un sufijo `/32`. El sufijo `/32` se usa en la notación CIDR para especificar que se permite una sola dirección IP. Básicamente, esto significa permitir el tráfico solo hacia y desde esta dirección IP específica.

1. Seleccione **Siguiente** dos veces para ir a la página **Revisar y crear**. Para este tutorial, puede dejar los valores predeterminados en la página **Configurar opciones de pila** tal y como están.

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

## Supervisión de la creación de una pila
<a name="getting-started-monitor-stack-creation"></a>

Al seleccionar **Enviar**, CloudFormation comienza a crear los recursos que se especifican en la plantilla. La nueva pila, **MyTestStack**, aparece en la lista en la parte superior de la consola de **CloudFormation**. El estado debería 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 **MyTestStack** en la lista.

1. 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:

`2024-12-23 18:54 UTC-7 MyTestStack CREATE_IN_PROGRESS 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:

`2024-12-23 18:59 UTC-7 WebServer CREATE_COMPLETE`

`2024-12-23 18:54 UTC-7 WebServer CREATE_IN_PROGRESS Resource creation initiated`

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)**:

`2024-12-23 19:17 UTC-7 MyTestStack CREATE_COMPLETE`

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.

Una vez creada la pila, puede ir a la pestaña **Recursos** para ver la instancia de EC2 y el grupo de seguridad que creó.

## Prueba del servidor web
<a name="getting-started-test-web-server"></a>

Una vez que la pila se haya creado correctamente, vaya a la pestaña **Salidas** de la consola de CloudFormation. Busque el campo **WebsiteURL**. Contendrá la URL pública de su instancia de EC2.

Abra un navegador y vaya a la URL que aparece en **WebsiteURL**. Debería ver un mensaje sencillo ("Hello World\$1") en el navegador.

De esta forma, se confirma que su instancia de EC2 ejecuta Apache HTTP Server y presenta una página web básica.

## Solución de problemas
<a name="getting-started-troubleshooting"></a>

Si se produce una reversión durante la creación de la pila, es posible que se deba a la falta de una VPC. Así es como se resuelve este problema.

### No hay una VPC predeterminada disponible
<a name="getting-started-troubleshooting-no-default-vpc"></a>

Para la plantilla de este tutorial se necesita una VPC predeterminada. Si la creación de la pila falla debido a errores de disponibilidad de VPC o subred, es posible que no tenga una VPC predeterminada en su cuenta. Dispone de las opciones siguientes:
+ **Crear una nueva VPC predeterminada**: puede crear una nueva VPC predeterminada mediante la consola de Amazon VPC. Para obtener instrucciones, consulte [Crear una VPC predeterminada](https://docs.aws.amazon.com/vpc/latest/userguide/work-with-default-vpc.html#create-default-vpc) en la *Guía del usuario de Amazon VPC*.
+ **Modificar la plantilla para especificar una subred**: si tiene una VPC no predeterminada, puede modificar la plantilla para especificar explícitamente los ID de la VPC y la subred. Agregue el siguiente parámetro a la plantilla:

  ```
    SubnetId:
      Description: The subnet ID to launch the instance into
      Type: AWS::EC2::Subnet::Id
  ```

  A continuación, actualice el recurso `WebServer` para incluir el ID de la subred:

  ```
    WebServer:
      Type: AWS::EC2::Instance
      Properties:
        ImageId: !Ref LatestAmiId
        InstanceType: !Ref InstanceType
        SecurityGroupIds:
          - !Ref WebServerSecurityGroup
        SubnetId: !Ref SubnetId
        UserData: !Base64 |
          #!/bin/bash
          yum update -y
          yum install -y httpd
          systemctl start httpd
          systemctl enable httpd
          echo "<html><body><h1>Hello World!</h1></body></html>" > /var/www/html/index.html
  ```

  Al crear la pila, tendrá que especificar una subred que tenga acceso a Internet para que el servidor web sea accesible.

## Limpieza
<a name="getting-started-clean-up"></a>

Para asegurarse de que no se le cobra por ningún servicio no deseado, puede realizar una limpieza eliminando la pila y sus recursos. También puede eliminar el bucket de S3 que almacena la plantilla de la pila.

**Eliminación de la pila y sus recursos**

1. Abra la [consola de CloudFormation](https://console.aws.amazon.com/cloudformation/).

1. En la página **Pilas**, seleccione la opción situada junto al nombre de la pila que ha creado (**MyTestStack**) y, a continuación, seleccione **Eliminar**.

1. Cuando se le pida confirmación, seleccione **Eliminar**.

1. Supervise el progreso del proceso de eliminación de la pila en la pestaña **Evento**. El estado de **MyTestStack** cambia a `DELETE_IN_PROGRESS`. Cuando CloudFormation completa la eliminación de la pila, quita la pila de la lista.

Si ha terminado de trabajar con la plantilla de ejemplo y ya no necesita el bucket de Amazon S3, elimínelo. Para eliminar un bucket, primero debe vaciarlo. Al vaciar un bucket, se eliminan todos los objetos que incluye.

**Vaciado y eliminación del bucket de Amazon S3**

1. Abra la [consola de Amazon S3](https://console.aws.amazon.com/s3/).

1. En el panel de navegación del lado izquierdo de la consola, elija **Buckets (Buckets)**.

1. En la lista **Buckets**, seleccione la opción situada junto al nombre del bucket que ha creado para este tutorial y, a continuación, seleccione **Vaciar**.

1. En la página **Vaciar bucket**, confirme que desea vaciar el bucket escribiendo **permanently delete** en el campo de texto y, a continuación, elija **Vaciar**.

1. Supervise el progreso del proceso de vaciado del bucket en la página **Vaciado del bucket: estado**. 

1. Para volver a la lista de buckets, seleccione **Salir**.

1. Seleccione la opción situada junto al nombre del bucket y, a continuación, seleccione **Eliminar**.

1. Cuando se le pida la confirmación, escriba el nombre del bucket y, a continuación, seleccione **Eliminar bucket**.

1. Supervise el progreso del proceso de eliminación del bucket en la lista **Buckets**. Cuando Amazon S3 completa la eliminación del bucket, lo elimina de la lista.

## Siguientes pasos
<a name="getting-started-next-steps"></a>

¡Enhorabuena\$1 Ha creado correctamente una pila, ha supervisado su creación y ha utilizado su salida.

Para seguir aprendiendo:
+ Obtenga más información sobre las plantillas para que pueda crear la suya propia. Para obtener más información, consulte [Trabajo con plantillas de CloudFormation](template-guide.md).
+ Pruebe el taller [Getting Started with CloudFormation](https://catalog.us-east-1.prod.workshops.aws/workshops/df7f72cf-4f10-4664-acb6-b30dc8d4bcf0/en-US) para adquirir práctica con la creación de plantillas.
+ Para ver una versión abreviada de [Getting Started with CloudFormation](https://catalog.us-east-1.prod.workshops.aws/workshops/df7f72cf-4f10-4664-acb6-b30dc8d4bcf0/en-US), consulte [Implementación de aplicaciones en Amazon EC2](deploying.applications.md). En este tema se describe el mismo escenario de uso de un script auxiliar de CloudFormation, `cfn-init`, para arrancar una instancia de Amazon EC2.