Servicio nativo de AWS para definir y aprovisionar infraestructura como código usando plantillas YAML o JSON, con gestión de estado y rollback automático.
AWS CloudFormation es el servicio nativo de infraestructura como código de AWS que permite definir recursos de infraestructura mediante plantillas declarativas en YAML o JSON. A diferencia de herramientas imperativas, CloudFormation gestiona el estado completo de la infraestructura, creando, actualizando y eliminando recursos en el orden correcto según las dependencias definidas.
El servicio actúa como un motor de orquestación que traduce las plantillas en llamadas a las APIs de AWS, manteniendo un registro del estado actual y proporcionando rollback automático cuando las operaciones fallan. Esta capacidad de gestión de estado diferencia CloudFormation de scripts de aprovisionamiento tradicionales, ya que entiende las relaciones entre recursos y puede realizar cambios incrementales de forma segura.
CloudFormation es la base tecnológica sobre la que se construyen herramientas como AWS CDK y AWS SAM, que generan plantillas CloudFormation como output final. Comprender CloudFormation es fundamental para diagnosticar problemas en cualquier herramienta de IaC en AWS.
Una plantilla CloudFormation típica contiene varias secciones que definen la infraestructura:
AWSTemplateFormatVersion: '2010-09-09'
Description: 'API serverless con Lambda y DynamoDB'
Parameters:
Environment:
Type: String
Default: dev
AllowedValues: [dev, staging, prod]
Resources:
UserTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: !Sub 'users-${Environment}'
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: userId
AttributeType: S
KeySchema:
- AttributeName: userId
KeyType: HASH
UserFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: !Sub 'user-api-${Environment}'
Runtime: nodejs20.x
Handler: index.handler
Code:
ZipFile: |
exports.handler = async (event) => {
return { statusCode: 200, body: 'Hello World' };
};
Environment:
Variables:
TABLE_NAME: !Ref UserTable
ApiGateway:
Type: AWS::ApiGateway::RestApi
Properties:
Name: !Sub 'user-api-${Environment}'
EndpointConfiguration:
Types: [REGIONAL]
Outputs:
ApiEndpoint:
Description: 'API Gateway endpoint URL'
Value: !Sub 'https://${ApiGateway}.execute-api.${AWS::Region}.amazonaws.com/prod'
Export:
Name: !Sub '${AWS::StackName}-ApiEndpoint'Este ejemplo muestra conceptos clave como parámetros para reutilización, funciones intrínsecas como !Sub y !Ref para referencias dinámicas, y outputs para exponer valores a otros stacks.
Para proyectos complejos, CloudFormation permite dividir la infraestructura en stacks anidados, mejorando la modularidad y reutilización:
NetworkStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: https://s3.amazonaws.com/templates/network.yaml
Parameters:
VpcCidr: 10.0.0.0/16
Environment: !Ref Environment
ApplicationStack:
Type: AWS::CloudFormation::Stack
DependsOn: NetworkStack
Properties:
TemplateURL: https://s3.amazonaws.com/templates/application.yaml
Parameters:
VpcId: !GetAtt NetworkStack.Outputs.VpcId
SubnetIds: !GetAtt NetworkStack.Outputs.PrivateSubnetIdsStackSets permite desplegar la misma infraestructura across múltiples cuentas AWS y regiones desde una cuenta central, esencial para organizaciones con arquitecturas multi-cuenta:
# Desplegado via StackSet en múltiples cuentas
SecurityBaselineStack:
Resources:
CloudTrail:
Type: AWS::CloudTrail::Trail
Properties:
IsLogging: true
S3BucketName: !Sub 'audit-logs-${AWS::AccountId}'
IncludeGlobalServiceEvents: true
GuardDutyDetector:
Type: AWS::GuardDuty::Detector
Properties:
Enable: true
FindingPublishingFrequency: FIFTEEN_MINUTESCloudFormation incluye drift detection para identificar cambios manuales realizados fuera del stack:
# Detectar drift en un stack
aws cloudformation detect-stack-drift --stack-name my-stack
# Ver detalles del drift
aws cloudformation describe-stack-resource-drifts --stack-name my-stackEl drift detection es crucial en entornos donde múltiples equipos pueden modificar recursos, ya que permite mantener la coherencia entre el estado declarado y el real.
| Aspecto | CloudFormation | Terraform |
|---|---|---|
| Proveedor | Solo AWS | Multi-cloud (AWS, Azure, GCP) |
| Lenguaje | YAML/JSON | HCL (HashiCorp Configuration Language) |
| Gestión de estado | Gestionado por AWS | Archivo local o backend remoto |
| Costo | Gratis | Gratis (open source), pago (Terraform Cloud) |
| Velocidad de adopción | Inmediata para nuevos servicios AWS | Retraso en soporte de nuevos servicios |
| Debugging | CloudFormation Events en consola | Plan/apply output y state inspection |
| Rollback | Automático en fallos | Manual con terraform apply previo |
| Modularidad | Nested stacks, cross-stack references | Modules con registry público |
| Testing | Limitado, principalmente cfn-lint | Terratest, kitchen-terraform |
La elección entre CloudFormation y Terraform depende principalmente de si necesitas multi-cloud (Terraform) o si prefieres integración nativa con AWS (CloudFormation). Para organizaciones AWS-first, CloudFormation ofrece ventajas en tiempo de adopción de nuevos servicios y integración con herramientas AWS.
CloudFormation tiene limitaciones técnicas importantes que afectan el diseño de arquitecturas:
Estas limitaciones requieren patrones específicos como stack splitting, uso de custom resources para funcionalidad no soportada, y estrategias de rollback manual para recursos críticos.
CloudFormation es el fundamento de la automatización de infraestructura en AWS y la base sobre la que se construyen CDK, SAM y otras herramientas de nivel superior. Incluso usando abstracciones, los errores de despliegue, problemas de drift y limitaciones de recursos se manifiestan a nivel de CloudFormation.
Para ingenieros staff+, dominar CloudFormation significa entender las capacidades y limitaciones reales de la automatización en AWS, poder diagnosticar problemas complejos de despliegue, y diseñar arquitecturas que aprovechen patrones como StackSets para governance multi-cuenta. La diferencia entre un script de aprovisionamiento y una solución de IaC robusta radica en la gestión de estado, rollback automático y capacidad de cambios incrementales que CloudFormation proporciona nativamente.
Práctica de definir y gestionar infraestructura mediante archivos de configuración versionados en lugar de procesos manuales. Fundamento de la automatización moderna de operaciones.
Framework de infraestructura como código de AWS que permite definir recursos cloud usando lenguajes de programación como TypeScript, Python o Java, generando CloudFormation.
Herramienta de Infrastructure as Code de HashiCorp que permite definir, provisionar y gestionar infraestructura multi-cloud mediante archivos declarativos en HCL.
Framework open-source de AWS para construir aplicaciones serverless con una sintaxis simplificada de CloudFormation, CLI para desarrollo local y despliegue integrado.