

# Funcionamiento de CloudFormation
<a name="cloudformation-overview"></a>

Este tema describe el funcionamiento de CloudFormation y le presenta los conceptos clave que necesitará conocer a medida que lo utilice.

**Topics**
+ [Conceptos clave](#cfn-whatis-concepts)
+ [Funcionamiento de CloudFormation](#cfn-whatis-howdoesitwork)
+ [Formas de empezar con CloudFormation](#ways-to-get-started)

## Conceptos clave
<a name="cfn-whatis-concepts"></a>

Cuando utiliza CloudFormation, trabaja con *plantillas* y *pilas*. Puede crear plantillas para describir los recursos de AWS y sus propiedades. Cuando se crea una pila, CloudFormation aprovisiona los recursos que se describen en su plantilla.

**Topics**
+ [Plantillas](#cfn-concepts-templates)
+ [Pilas](#cfn-concepts-stacks)
+ [Conjuntos de cambios](#cfn-concepts-change-sets)

### Plantillas
<a name="cfn-concepts-templates"></a>

Una plantilla de CloudFormation es un archivo de texto con formato JSON o YAML. Puede guardar estos archivos con cualquier extensión, como `.yaml`, `.json`, `.template` o `.txt`. CloudFormation usa estas plantillas como proyectos para crear sus recursos de AWS. Por ejemplo, en una plantilla, puede describir una instancia Amazon EC2, como el tipo de instancia, el ID de AMI, mapeos de dispositivos de bloques y el nombre de su par de claves de Amazon EC2. Cuando se crea una pila, debe especificarse una plantilla que CloudFormation utiliza para crear lo que se describe en la plantilla.

Por ejemplo, si creó una pila con la siguiente plantilla, CloudFormation aprovisiona una instancia con un ID de AMI `ami-0ff8a91507f77f867`, un tipo de instancia `t2.micro`, el nombre del par de claves `testkey` y un volumen de Amazon EBS.

#### YAML
<a name="t2-micro-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: A sample template
Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0ff8a91507f77f867
      InstanceType: t2.micro
      KeyName: testkey
      BlockDeviceMappings:
        - DeviceName: /dev/sdm
          Ebs:
            VolumeType: io1
            Iops: 200
            DeleteOnTermination: false
            VolumeSize: 20
```

#### JSON
<a name="t2-micro-example.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "A sample template",
    "Resources": {
        "MyEC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "ami-0ff8a91507f77f867",
                "InstanceType": "t2.micro",
                "KeyName": "testkey",
                "BlockDeviceMappings": [
                    {
                        "DeviceName": "/dev/sdm",
                        "Ebs": {
                            "VolumeType": "io1",
                            "Iops": 200,
                            "DeleteOnTermination": false,
                            "VolumeSize": 20
                        }
                    }
                ]
            }
        }
    }
}
```

También puede especificar varios recursos en una única plantilla y configurar dichos recursos para que funcionen conjuntamente. Por ejemplo, puede modificar la plantilla anterior para que incluya una dirección IP elástica (EIP) y asociarla a la instancia de Amazon EC2, tal y como se muestra en el ejemplo siguiente:

#### YAML
<a name="multiple-resources-single-template.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: A sample template
Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0ff8a91507f77f867
      InstanceType: t2.micro
      KeyName: testkey
      BlockDeviceMappings:
        - DeviceName: /dev/sdm
          Ebs:
            VolumeType: io1
            Iops: 200
            DeleteOnTermination: false
            VolumeSize: 20
  MyEIP:
    Type: AWS::EC2::EIP
    Properties:
      InstanceId: !Ref MyEC2Instance
```

#### JSON
<a name="multiple-resources-single-template.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "A sample template",
    "Resources": {
        "MyEC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "ami-0ff8a91507f77f867",
                "InstanceType": "t2.micro",
                "KeyName": "testkey",
                "BlockDeviceMappings": [
                    {
                        "DeviceName": "/dev/sdm",
                        "Ebs": {
                            "VolumeType": "io1",
                            "Iops": 200,
                            "DeleteOnTermination": false,
                            "VolumeSize": 20
                        }
                    }
                ]
            }
        },
        "MyEIP": {
            "Type": "AWS::EC2::EIP",
            "Properties": {
                "InstanceId": {
                    "Ref": "MyEC2Instance"
                }
            }
        }
    }
}
```

Las plantillas anteriores se centraron en una única instancia Amazon EC2; sin embargo, las plantillas de CloudFormation tienen capacidades adicionales que puede utilizar para crear conjuntos complejos de recursos y reutilizar esas plantillas en múltiples contextos. Por ejemplo, puede agregar parámetros de entrada cuyos valores se especifican al crear una pila de CloudFormation. En otras palabras, puede especificar un valor como el tipo de instancia al crear una pila en lugar de al crear la plantilla, lo que hace a la plantilla más fácil de reutilizar en diferentes situaciones.

### Pilas
<a name="cfn-concepts-stacks"></a>

Al utilizar CloudFormation, los recursos relacionados se administran como una sola unidad, denominada pila. Puede crear, actualizar y eliminar una colección de recursos mediante la creación, actualización y eliminación de pilas. Todos los recursos de una pila se definen mediante la plantilla de CloudFormation de la pila. Supongamos que ha creado una plantilla que incluye un grupo de Auto Scaling, un balanceador de carga Elastic Load Balancing y una instancia de base de datos Amazon Relational Database Service (Amazon RDS). Para crear esos recursos, debe crear una pila enviando la plantilla que ha creado y CloudFormation aprovisiona todos esos recursos para usted.

### Conjuntos de cambios
<a name="cfn-concepts-change-sets"></a>

Si necesita realizar cambios en los recursos que están ejecutándose en una pila, actualice la pila. Antes de realizar cambios en los recursos, puede generar un conjunto de cambios, que es un resumen de los cambios propuestos. Los conjuntos de cambios le permiten ver cómo afectan los cambios a sus recursos en ejecución, en especial para los recursos críticos, antes de implementarlos.

Por ejemplo, si cambia el nombre de una instancia de base de datos Amazon RDS, CloudFormation creará una nueva base de datos y eliminará la antigua. Se perderán los datos de la antigua base de datos a menos que ya haya hecho una copia de seguridad. Si genera un cambio conjunto, verá que el cambio provocará la sustitución de la base de datos y usted podrá planificar en consecuencia antes de actualizar la pila. 

## Funcionamiento de CloudFormation
<a name="cfn-whatis-howdoesitwork"></a>

Cuando usa CloudFormation para crear una pila, CloudFormation hace llamadas de servicio subyacentes a AWS para aprovisionar y configurar los recursos descritos en la plantilla. Necesita permiso para crear estos recursos. Por ejemplo, para crear instancias de EC2 mediante CloudFormation, necesita permisos para crear instancias. Estos permisos se administran con [AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/) (IAM).

Su plantilla declara todas las llamadas que CloudFormation hace. Por ejemplo, suponga que tiene una plantilla que describe una instancia de EC2 con un tipo de instancia `t2.micro`. Cuando utiliza la plantilla para crear una pila, CloudFormation llama a la API de creación de instancias Amazon EC2 y especifica el tipo de instancia como `t2.micro`. En el siguiente diagrama se resume el flujo de trabajo de CloudFormation para la creación de pilas.

![\[Una plantilla creada o existente que se guarda localmente, o en un bucket, que se utiliza para crear una pila.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/create-stack-diagram.png)


**Para crear una pila**

1. Use un editor de texto para crear una plantilla de CloudFormation en formato JSON o YAML. La CloudFormation plantilla describe los recursos que desea y sus ajustes. Se utiliza [Infrastructure Composer](infrastructure-composer-for-cloudformation.md) para visualizar y validar la plantilla. Esto le ayuda a asegurarse de que la plantilla está estructurada correctamente y no contiene errores de sintaxis. Para obtener más información, consulte [Trabajo con plantillas de CloudFormation](template-guide.md).

1. Guarde la plantilla de manera local o en un bucket de Amazon S3.

1. Cree una pila de CloudFormation especificando la ubicación del archivo de la plantilla; por ejemplo, una ruta en el equipo local o una URL de Amazon S3. Si la plantilla contiene parámetros, puede especificar los valores de entrada al crear la pila. Los parámetros le permiten pasar valores a la plantilla para poder personalizar sus recursos cada vez que crea una pila.
**nota**  
Si especifica un archivo de plantilla almacenado localmente, CloudFormation lo carga a un bucket de S3 en su cuenta de AWS. CloudFormation crea un bucket para cada región en la que carga un archivo de plantilla. Cualquiera con permisos de Amazon Simple Storage Service (Amazon S3) en su cuenta de AWS puede acceder a los buckets. Si ya hubiera un bucket creado por CloudFormation, la plantilla se añade a dicho bucket.  
Puede utilizar su propio bucket y administrar sus permisos cargando manualmente las plantillas a Amazon S3. Entonces, siempre que cree o actualice una pila, especifique la URL de Amazon S3 de un archivo de plantilla.

Una vez que se han creado todos los recursos, CloudFormation informa que se ha creado su pila. A continuación, puede comenzar a utilizar los recursos de la pila. Si se produce un error durante la creación de la pila, CloudFormation revierte los cambios eliminando los recursos que creó.

### Actualización de una pila con un conjunto de cambios
<a name="updating-stack-with-change-sets"></a>

Cuando tenga que actualizar los recursos de su pila, puede modificar la plantilla de los recursos. No es necesario crear una nueva pila y eliminar la antigua. Para actualizar una pila, cree un conjunto de cambios enviando una versión modificada de la plantilla de pila original, diferentes valores de parámetros de entrada o ambos. CloudFormation compara la plantilla modificada con la original y genera un conjunto de cambios. El conjunto de cambios enumera las modificaciones propuestas. Tras revisar los cambios, puede iniciar el conjunto de cambios para actualizar la pila o puede crear un nuevo conjunto de cambios. En el siguiente diagrama se resume el flujo de trabajo para la actualización de una pila.

![\[Una plantilla que usa un conjunto de cambios para ver el valor modificado antes de ejecutar el conjunto de cambios para actualizar la pila.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/update-stack-diagram.png)


**Actualización de una pila con un conjunto de cambios**

1. Puede modificar una plantilla de pila de CloudFormation por medio de [Infrastructure Composer](infrastructure-composer-for-cloudformation.md) o un editor de texto. Para obtener más información, consulte [Actualizar la plantilla de pila](using-cfn-updating-stacks-get-template.md).

   Al actualizar la plantilla, tenga en cuenta que las actualizaciones pueden provocar interrupciones. Dependiendo del recurso y de las propiedades que esté actualizando, una actualización podría interrumpir o incluso sustituir un recurso existente. Para obtener más información, consulte [Comprensión de los comportamientos de actualización de los recursos de la pila](using-cfn-updating-stacks-update-behaviors.md).

1. Guarde la plantilla de CloudFormation localmente o en un bucket de S3.

1. Cree un conjunto de cambios especificando la pila que desea actualizar y la ubicación de la plantilla modificada, como por ejemplo una ruta en su equipo local o una dirección URL de Amazon S3. Para obtener más información sobre la creación de conjuntos de cambios, consulte [Actualización de pilas de CloudFormation con conjuntos de cambios](using-cfn-updating-stacks-changesets.md).
**nota**  
Si especifica una plantilla almacenada en su equipo local, CloudFormation cargará automáticamente su plantilla a un bucket de S3 en su Cuenta de AWS.

1. Vea el conjunto de cambios para comprobar que CloudFormation realizará los cambios que espera. Por ejemplo, compruebe si CloudFormation reemplazará cualquier recurso crítico de la pila. Puede crear tantos conjuntos de cambios como necesite hasta que haya incluido los cambios que desea.
**importante**  
Los conjuntos de cambios no indican si la actualización de la pila se realizará correctamente. Por ejemplo, un conjunto de cambios no comprueba si se va a sobrepasar una [cuota](cloudformation-limits.md) de cuenta, si actualizará un recurso que no admite actualizaciones o si no tiene suficientes [permisos](control-access-with-iam.md) para modificar un recurso. Todo esto puede causar errores en la actualización de una pila.

1. Inicia el conjunto de cambios que desea aplicar a la pila. CloudFormation actualiza la pila mediante la actualización exclusiva de los recursos que ha modificado y señala que la pila se actualizó correctamente. Si se produce un error en la actualización de la pila, CloudFormation revierte los cambios para restaurar la pila al último estado de funcionamiento conocido.

## Formas de empezar con CloudFormation
<a name="ways-to-get-started"></a>

Para crear una pila de CloudFormation Hello world con la consola, consulte [Creación de su primera pila](gettingstarted.walkthrough.md).

Para un aprendizaje guiado, pruebe el taller [Introducción a CloudFormation](https://catalog.us-east-1.prod.workshops.aws/workshops/df7f72cf-4f10-4664-acb6-b30dc8d4bcf0/en-US), que ofrece experiencia práctica en el desarrollo de plantillas.