¿Qué es AWS CloudFormation?
AWS CloudFormation es un servicio de AWS que te permite modelar y configurar tus recursos de AWS de manera fácil y rápida. Puedes utilizar lenguajes de programación o archivos de texto simples para modelar y provisionar, en una operación automatizada y segura, todos los recursos necesarios para tus aplicaciones a lo largo de todas las regiones y cuentas de AWS. Este servicio te permite tratar tu infraestructura como código, lo que facilita la gestión de recursos, el control de versiones y la reutilización.
Ventajas de usar CloudFormation en AWS
- Automatización y Eficiencia: Reduce el tiempo necesario para provisionar tus recursos y elimina las tareas manuales y los errores asociados.
- Gestión de Infraestructura Como Código (IaC): Permite versionar y revisar tu infraestructura de la misma manera que lo haces con tu código.
- Reutilización: Facilita la reutilización de modelos de infraestructura para diferentes entornos, como desarrollo, pruebas y producción, asegurando consistencia y ahorro de tiempo.
- Seguridad y Conformidad: Integra controles de acceso y políticas para garantizar que tu infraestructura cumpla con los requisitos de seguridad y gobernanza.
Ejemplo de Plantilla de CloudFormation
¿Cómo funciona CloudFormation? Este es un ejemplo simple de una plantilla que crea un bucket en S3:
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Ejemplo mejorado de CloudFormation: Crear un bucket S3 con parámetros y salida de ARN.'
Parameters:
BucketName:
Description: 'Nombre único para el bucket de S3'
Type: String
Default: 'mi-bucket-unico-12345'
Resources:
MiBucketS3:
Type: 'AWS::S3::Bucket'
Properties:
BucketName: !Ref BucketName
Outputs:
BucketARN:
Description: 'ARN del bucket de S3 creado'
Value: !GetAtt MiBucketS3.Arn
BucketName:
Description: "Nombre del Bucket"
Value: !Ref MiBucketS3
Explicación de la Plantilla
- Parameters: Esta sección define los parámetros que se pueden pasar a la plantilla en el momento de la creación del stack. Aquí hemos definido un parámetro
BucketName
, que permite al usuario especificar un nombre para el bucket de S3. El uso de parámetros hace que tu plantilla sea reutilizable y flexible para diferentes situaciones sin necesidad de editar la plantilla para cada despliegue. - Resources: Define los recursos que AWS CloudFormation creará. En este caso, estamos creando un bucket de S3. El nombre del bucket se establece a través de una referencia al parámetro
BucketName
usando!Ref BucketName
. - Outputs: Esta sección devuelve valores específicos del stack. Hemos añadido el ARN del bucket creado con
!GetAtt MiBucketS3.Arn
, lo que permite a los usuarios obtener el ARN del bucket después de que el stack sea creado. También devolvemos el nombre del bucket como un output para que sea fácilmente accesible.
Uso de !Ref y !Sub
- !Ref: Se utiliza para referenciar otros objetos en la plantilla, como parámetros o recursos. En este caso, usamos
!Ref
para obtener el valor del parámetroBucketName
y asignarlo al nombre del bucket. - !Sub: Aunque en este ejemplo no se ha utilizado
!Sub
, esta función se puede usar para sustituir variables en una cadena de texto. Por ejemplo, si quisieras crear un nombre de bucket que incluya el ID de la región, podrías hacerlo así:BucketName: !Sub '${AWS::Region}-mi-bucket-unico'
.
Cargar la Plantilla vía Web
Cómo desplegar una plantilla incorporando prácticas recomendadas:
1. Iniciar Sesión y Navegar a CloudFormation
Primero, inicia sesión en la consola de AWS y navega hasta el servicio CloudFormation. Este es tu punto de partida para crear, actualizar y gestionar tus stacks de CloudFormation.
2. Crear un Nuevo Stack
Haz clic en «Create stack» > «With new resources (standard)». Esta opción te permite iniciar el proceso de creación de un nuevo stack basado en tu plantilla de CloudFormation.
3. Creando la plantilla
A. Utilizar un Bucket S3 para Organizar tus Plantillas
Una buena práctica es crear un bucket de Amazon S3 específicamente para almacenar tus plantillas de CloudFormation. Esto no solo ayuda a mantener tus plantillas organizadas, sino que también facilita el acceso y la reutilización de las mismas en futuros despliegues.
- Sube tu plantilla a este bucket de S3.
- Cuando crees un nuevo stack elige «Amazon S3 URL» e introduce la URL de la plantilla que has subido a tu bucket de S3.
B. Subir archivo para crear la plantilla
Selecciona «Upload a template file», elige el archivo de tu plantilla y haz clic en «Next».
C. Opción para Editar la Plantilla Directamente al Crear el Stack
Además de subir una plantilla o seleccionarla desde S3, tienes la opción de editar la plantilla directamente en la consola al momento de crear el stack. Esta opción te permite realizar ajustes rápidos sin la necesidad de modificar el archivo de la plantilla externamente y volver a subirlo. Al hacer esto, AWS automáticamente almacenará tu plantilla en un bucket S3 generado por AWS, aunque el nombre del archivo será determinado por AWS y no por ti.
4. Configuración y Despliegue del Stack
Independientemente del método que elijas para proporcionar tu plantilla, el siguiente paso es asignar un nombre a tu stack. Este nombre te ayudará a identificarlo dentro de tus recursos de CloudFormation.
Posteriormente, configura cualquier parámetro adicional que requiera tu plantilla. Los parámetros son una manera poderosa de personalizar tus stacks de CloudFormation, permitiéndote reutilizar tus plantillas para diferentes entornos o configuraciones.
Finalmente, sigue las instrucciones en la consola para completar la configuración de tu stack y haz clic en «Create stack». AWS CloudFormation ahora procederá a crear y configurar los recursos definidos en tu plantilla.
Cargar la Plantilla vía Python con Boto3
Si prefieres trabajar programáticamente, puedes utilizar el siguiente script de Python con Boto3 para cargar tu plantilla:
import boto3
import json
import time
# Carga la plantilla de CloudFormation
def cargar_plantilla(file_path):
with open(file_path, 'r') as file:
return file.read()
# Crear un stack en CloudFormation
def crear_stack(cf_client, stack_name, template_body, parameters):
cf_client.create_stack(
StackName=stack_name,
TemplateBody=template_body,
Parameters=[
{
'ParameterKey': 'BucketName',
'ParameterValue': parameters['BucketName']
},
],
Capabilities=[
'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'
]
)
print(f"Creando stack {stack_name}. Esto puede tomar algunos minutos...")
waiter = cf_client.get_waiter('stack_create_complete')
waiter.wait(StackName=stack_name)
print(f"Stack {stack_name} creado exitosamente.")
# Obtener outputs del stack
def obtener_outputs(cf_client, stack_name):
response = cf_client.describe_stacks(StackName=stack_name)
stacks = response['Stacks']
outputs = stacks[0]['Outputs']
return outputs
# Main
if __name__ == '__main__':
# Configura tus propios valores aquí
stack_name = 'MiStackS3'
template_file_path = 'mi_plantilla_s3.yaml'
bucket_name = 'mi-bucket-unico-12345' # Asegúrate de que este nombre sea único globalmente
# Inicializa el cliente de CloudFormation
cf_client = boto3.client('cloudformation')
# Cargar y crear el stack
template_body = cargar_plantilla(template_file_path)
crear_stack(cf_client, stack_name, template_body, {'BucketName': bucket_name})
# Obtener y mostrar outputs del stack
outputs = obtener_outputs(cf_client, stack_name)
for output in outputs:
print(f"{output['OutputKey']}: {output['OutputValue']}")
El script lee y carga la plantilla de CloudFormation. Crea un stack en CloudFormation pasando los parámetros necesarios y espera hasta que el stack sea creado exitosamente y luego obtiene la salida (outputs) del stack, como el ARN del bucket de S3.
*Para hacer uso de este script necesitas tener instalado awscli y boto3, pasa por este post para más info.
Como vemos AWS CloudFormation es una herramienta que simplifica el proceso de despliegue y gestión de recursos con la capacidad de cargar plantillas tanto a través de la consola web como mediante scripts, tienes la flexibilidad de elegir el método que mejor se adapte a tu flujo de trabajo.
Y esto es todo amigos. Espero que os sea de ayuda!
Para mantener la web y seguir compartiendo conocimiento, considera invitarme a un café. Siempre se alegra uno 😉
Un comentario