AWS CloudFormation es un servicio que facilita la creación y administración de recursos de infraestructura en AWS mediante plantillas de configuración. Permite definir y aprovisionar rápidamente entornos completos en la nube usando archivos de texto.
Visión General

Beneficios

Automatización: Despliega y gestiona infraestructura de manera automática y repetible.

Gestión de Ciclo de Vida: Simplifica la actualización y replicación de entornos.

Integración: Compatible con múltiples servicios de AWS, lo que permite una gestión centralizada.
Casos de Uso

Infraestructura como Código (IaC): Define infraestructura en código y despliega de manera consistente en múltiples entornos.
Replicación de Entornos: Facilita la creación de entornos idénticos para desarrollo, pruebas y producción.


Conformidad y Auditoría: Permite rastrear cambios en la infraestructura para auditorías y aseguramiento de conformidad.
Empresas que lo Utilizan

Coca-Cola: Usa CloudFormation para gestionar y escalar su infraestructura global de forma eficiente.

Expedia: Implementa entornos completos en minutos, permitiendo una entrega rápida de nuevas funcionalidades.
Conceptos Clave de AWS CloudFormation
- Plantillas: Archivos en formato JSON o YAML que contienen las instrucciones para crear la infraestructura en AWS.
- Stacks: El entorno completo descrito por una plantilla, que se puede crear, actualizar y eliminar como una unidad.
- StackSets: Extienden las funcionalidades de los stacks, permitiendo la creación, actualización o eliminación de stacks en múltiples cuentas y regiones con una sola operación.
- Change Sets: Resumen de los cambios propuestos en un stack, permitiendo visualizar cómo impactarán antes de implementarlos.
Plantillas
Una plantilla en AWS CloudFormation es un archivo en formato YAML o JSON que describe el estado final de la infraestructura que deseas aprovisionar o modificar. Después de crear la plantilla, se carga directamente en CloudFormation o se almacena en Amazon S3. CloudFormation lee la plantilla y realiza las llamadas a la API necesarias para crear los recursos, que se conocen como un «Stack». Dentro de la plantilla, se utilizan ID lógicos para referenciar los recursos, mientras que los ID físicos identifican los recursos fuera de la plantilla una vez creados.
Elementos de la Plantilla (Template elements)
Obligatorio:
- Lista de recursos y valores de configuración asociados.
No Obligatorio:
- Parámetros de la plantilla (limitados a 60).
- Valores de salida (limitados a 60).
- Lista de tablas de datos.
Componentes de la Plantilla
Resources: La sección de recursos (obligatoria) declara los recursos de AWS que deseas incluir en el stack, como una instancia EC2 o un bucket de S3.
- Obligatorio.
- Representa los componentes de AWS que se crearán.
- Los recursos se declaran y pueden hacer referencia entre sí.
Resources:
MyEC2Instance:
Type: "AWS::EC2::Instance"
Properties:
ImageId: "ami-0ff8a91507f77f867"
Parámetros
Utiliza la sección opcional de Parámetros para personalizar tus plantillas. Los parámetros te permiten ingresar valores personalizados en tu plantilla cada vez que creas o actualizas un stack.
- Proporciona entradas para tu plantilla de CloudFormation.
- Útil para la reutilización de plantillas.
El siguiente ejemplo declara un parámetro llamado InstanceTypeParameter. Este parámetro te permite especificar el tipo de instancia de Amazon EC2 que el stack utilizará cuando crees o actualices el stack.
Nota: El InstanceTypeParameter tiene un valor predeterminado de t2.micro. Este es el valor que AWS CloudFormation utiliza para aprovisionar el stack, a menos que se proporcione otro valor.
Parameters:
InstanceTypeParameter:
Type: String
Default: t2.micro
AllowedValues:
- t2.micro
- m1.small
- m1.large
Description: Ingrese t2.micro, m1.small, o m1.large. El valor predeterminado es t2.micro.
Pseudo Parámetros
Los pseudo parámetros son parámetros que están predefinidos por AWS CloudFormation. No necesitas declararlos en tu plantilla. Úsalos de la misma manera que usarías un parámetro, como argumento para la función Ref.
AWS::AccountId – Devuelve el ID de la cuenta de AWS en la cual se está creando el stack.
AWS::NotificationARNs – Devuelve la lista de Nombres de Recurso de Amazon (ARNs) de notificación para el stack actual.
AWS::Region – Devuelve una cadena que representa la región de AWS en la que se está creando el recurso correspondiente.
AWS::StackId – Devuelve el ID del stack tal como se especificó con el comando aws cloudformation create-stack.
Mappings
La sección opcional de Mappings (Mapeos) asocia una clave con un conjunto correspondiente de valores nombrados.
- Variables fijas.
- Útil para diferenciar entre regiones, entornos, AMIs, etc.
- Es necesario conocer los valores de antemano.
- Para valores específicos del usuario, utiliza parámetros en su lugar.
El siguiente ejemplo muestra claves de regiones que están mapeadas a dos conjuntos de valores: uno llamado HVM64 y el otro HVMG2.
RegionMap:
us-east-1:
HVM64: ami-0ff8a91507f77f867
HVMG2: ami-0a584ac55a7631c0c
us-west-1:
HVM64: ami-0bdb828fd58c52235
HVMG2: ami-066ee5fd4a9ef77f1
Consejo: Con los mapeos puedes, por ejemplo, establecer valores basados en una región. Puedes crear un mapeo que utilice el nombre de la región como una clave y contenga los valores que deseas especificar para cada región específica.
Condiciones
La sección opcional de Condiciones contiene declaraciones que definen las circunstancias bajo las cuales se crean o configuran las entidades.
- Controla la creación de recursos en función de una condición.
- Se aplica a recursos y salidas.
En el siguiente código YAML de ejemplo, los recursos se crean solo si el parámetro EnvType es igual a prod:
Conditions:
CreateProdResources: !Equals [ !Ref EnvType, prod ]
Funciones Intrínsecas
AWS CloudFormation proporciona varias funciones integradas que te ayudan a gestionar tus stacks. Utiliza funciones intrínsecas en tus plantillas para asignar valores a propiedades que no están disponibles hasta el tiempo de ejecución.
Consejo: Como mínimo, conoce las funciones intrínsecas listadas a continuación.
Para más detalles consulta la lista completa en: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html
Fn::Ref (o !Ref en YAML)
La función intrínseca Ref devuelve el valor del parámetro o recurso especificado.
- Cuando especificas el nombre lógico de un parámetro, devuelve el valor del parámetro.
- Cuando especificas el nombre lógico de un recurso, devuelve un valor que normalmente puedes usar para referirte a ese recurso, como un ID físico.
El siguiente bloque de declaración de recursos para una dirección IP elástica necesita el ID de la instancia de EC2 y utiliza la función Ref para especificar el ID de la instancia del recurso MyEC2Instance:
MyEIP:
Type: "AWS::EC2::EIP"
Properties:
InstanceId: !Ref MyEC2Instance
Fn::GetAtt
La función intrínseca Fn::GetAtt devuelve el valor de un atributo de un recurso en la plantilla.
- Sintaxis completa (YAML): Fn::GetAtt: [ logicalNameOfResource, attributeName ]
- Forma corta (en YAML): !GetAtt logicalNameOfResource.attributeName
El siguiente ejemplo de plantilla devuelve los atributos SourceSecurityGroup.OwnerAlias y SourceSecurityGroup.GroupName del balanceador de carga con el nombre lógico myELB:
AWSTemplateFormatVersion: 2010-09-09
Resources:
myELB:
Type: "AWS::ElasticLoadBalancing::LoadBalancer"
Properties:
AvailabilityZones:
- "us-west-1a"
Listeners:
- LoadBalancerPort: "80"
InstancePort: "80"
Protocol: HTTP
myELBSecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: "ELB security group"
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: "80"
ToPort: "80"
SourceSecurityGroupOwnerId: !GetAtt myELB.SourceSecurityGroup.OwnerAlias
SourceSecurityGroupName: !GetAtt myELB.SourceSecurityGroup.GroupName
Fn::FindInMap
La función intrínseca Fn::FindInMap devuelve el valor correspondiente a claves en un mapa de dos niveles que se declara en la sección Mappings.
- Sintaxis completa (YAML): Fn::FindInMap [ MapName, TopLevelKey, SecondLevelKey ]
- Forma corta (en YAML): !FindInMap [ MapName, TopLevelKey, SecondLevelKey ]
El siguiente ejemplo muestra cómo usar Fn::FindInMap para una plantilla con una sección Mappings que contiene un único mapa, RegionMap, que asocia AMIs con regiones de AWS:
Mappings:
RegionMap:
us-east-1:
HVM64: "ami-0ff8a91507f77f867"
HVMG2: "ami-0a584ac55a7631c0c"
us-west-1:
HVM64: "ami-0bdb828fd58c52235"
HVMG2: "ami-066ee5fd4a9ef77f1"
Resources:
myEC2Instance:
Type: "AWS::EC2::Instance"
Properties:
ImageId: !FindInMap
- RegionMap
- !Ref "AWS::Region"
- HVM64
InstanceType: m1.small
Fn::ImportValue
La función intrínseca Fn::ImportValue devuelve el valor de una salida exportada por otro stack.
- Normalmente, utilizas esta función para crear referencias entre stacks.
Fn::ImportValue:
!Sub "${NetworkStackName}-SecurityGroupID"
Fn::Join
- intaxis completa (YAML): Fn::Join [ delimiter, [ comma-delimited list of values ] ]
- Forma corta (YAML): !Join [ delimiter, [ comma-delimited list of values ] ]
El siguiente ejemplo utiliza Fn::Join para construir un valor de cadena. Utiliza la función Ref con el parámetro Partition y el pseudo parámetro AWS::AccountId:
!Join
- ""
- - "arn:"
- !Ref Partition
- ":s3:::elasticbeanstalk-*-"
- !Ref "AWS::AccountId"
- "-*"
Fn::Sub
La función intrínseca Fn::Sub sustituye variables en una cadena de entrada con valores que tú especificas.
- En tus plantillas, puedes utilizar esta función para construir comandos o salidas que incluyan valores que no están disponibles hasta que crees o actualices un stack.
El siguiente ejemplo utiliza un mapeo para sustituir la variable ${Domain} con el valor resultante de la función Ref:
Name: !Sub
- www.${Domain}
- { Domain: !Ref RootDomainName }
Stacks y Stack Sets
Stacks
Recursos desplegados basados en plantillas.
- Crear, actualizar y eliminar stacks utilizando plantillas.
- Desplegados a través de la Consola de Administración, CLI o APIs.
Errores en la creación de stacks:
- El retroceso automático en caso de error está habilitado por defecto.
- Se te cobrará por los recursos aprovisionados, incluso si hay un error.
Actualización de stacks:
- AWS CloudFormation proporciona dos métodos para actualizar stacks: actualización directa o creación y ejecución de conjuntos de cambios.
- Cuando actualizas un stack directamente, envías los cambios y AWS CloudFormation los despliega de inmediato.
- Utiliza actualizaciones directas cuando necesites desplegar rápidamente tus actualizaciones.
- Con los conjuntos de cambios, puedes previsualizar los cambios que AWS CloudFormation hará en tu stack, y luego decidir si aplicas esos cambios.
Stack Sets
AWS CloudFormation StackSets extiende la funcionalidad de los stacks, permitiéndote crear, actualizar o eliminar stacks en varias cuentas y regiones con una sola operación.
- Usando una cuenta de administrador, defines y gestionas una plantilla de AWS CloudFormation, y utilizas la plantilla como base para aprovisionar stacks en cuentas objetivo seleccionadas en las regiones especificadas.
- Una cuenta de administrador es la cuenta de AWS en la que creas los Stack Sets.
- Un Stack Set se gestiona iniciando sesión en la cuenta de administrador de AWS en la que fue creado.
- Una cuenta objetivo es la cuenta en la que creas, actualizas o eliminas uno o más stacks en tu Stack Set.
Antes de que puedas usar un Stack Set para crear stacks en una cuenta objetivo, debes establecer una relación de confianza entre la cuenta de administrador y las cuentas objetivo.
Nested Stacks
Los stacks anidados permiten la reutilización del código de CloudFormation para casos de uso comunes.
Por ejemplo, configuración estándar para un balanceador de carga, servidor web, servidor de aplicaciones, etc.
En lugar de copiar el código cada vez, crea una plantilla estándar para cada caso de uso común y referencia esa plantilla desde dentro de tu plantilla de CloudFormation.
Mejores Prácticas
AWS proporciona «helper scripts» en Python que pueden ayudarte a instalar software e iniciar servicios en tus instancias EC2.
- Utiliza CloudFormation para realizar cambios en tu entorno en lugar de acceder directamente a los recursos.
- Usa los conjuntos de cambios (Change Sets) para identificar posibles puntos problemáticos en tus actualizaciones.
- Utiliza políticas de stack (Stack Policies) para proteger explícitamente las partes sensibles de tu stack.
- Usa un sistema de control de versiones, como CodeCommit o GitHub, para rastrear los cambios en las plantillas.
Precios
- No hay un cargo adicional por AWS CloudFormation.
- Pagas por los recursos de AWS (como instancias Amazon EC2, balanceadores de carga de Elastic Load Balancing, etc.) creados utilizando AWS CloudFormation de la misma manera que si los hubieras creado manualmente.
- Solo pagas por lo que utilizas, a medida que lo usas; no hay tarifas mínimas ni compromisos iniciales requeridos.
Snippets
Consulta las plantillas