He comenzado una seria de vídeos sobre AWS CloudFormation en los que intentaré reflejar la potencia que tiene este servicio para automatizar la creación de entornos.
En mi caso también es muy potente para la creación de tareas, pruebas y exámenes para mis alumnos utilizando la plataforma de AWS Academy.
Ya entiendo que actualmente todo el mundo está con Terraform, CDK, pulumi o yo que se. Pero CloudFormation se puede utilizar directamente en nuestra consola de un Learning Lab utilizando git y aws-cli de forma muy sencilla. Y eso me ha gustado mucho. (Ya lo mostraré en otro vídeo).
Funciones utilizadas y para que sirven
GitHub
Si quieres ver el código que voy haciendo sobre el tema en GitHub:
https://github.com/javiteran/AWS_CloudFormation/
Mas recursos recomendables
Recursos utilizados en la creación de una VPC
Type: AWS::EC2::VPC
Type: AWS::EC2::VPCCidrBlock
Type: AWS::EC2::Subnet
Type: AWS::EC2::InternetGateway
Type: AWS::EC2::VPCGatewayAttachment
Type: AWS::EC2::RouteTable
Type: AWS::EC2::Route
Type: AWS::EC2::SubnetRouteTableAssociation
Código del ejemplo del vídeo.
AWSTemplateFormatVersion: '2010-09-09'
Description: >
Creacion de una VPC, 4 subredes publicas y privadas, internet gateway y tabla de rutas con IPv4 e IPv6
Autor: Javier Teran Gonzalez. https://www.youtube.com/javiteran
Fecha creacion: 30/01/2025
Version: 1.00
#Parametros del proyecto. No son obligatorios
Parameters:
NombreProyecto:
Description: 'Nombre del proyecto'
Type: String
Default: 'SRI24'
NN:
Type: Number
Description: 'Numero de alumno'
Default: 15
ConstraintDescription: 'Debe estar en el rango del [1-50]'
MinValue: 1
MaxValue: 50
#Recursos del proyecto
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.24.0.0/16
EnableDnsHostnames: true
EnableDnsSupport: true
Tags:
- Key: Name
Value: !Sub '${NombreProyecto}${NN}-vpc'
IPv6CidrBlock:
Type: AWS::EC2::VPCCidrBlock
Properties:
VpcId: !Ref VPC
AmazonProvidedIpv6CidrBlock: true
# SubRedes publicas
SubredPublica1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !Sub '10.24.1${NN}.0/25'
Ipv6CidrBlock: !Select [1, !Cidr [!Select [0, !GetAtt 'VPC.Ipv6CidrBlocks'], 256, 64]]
#Ipv6CidrBlock: !GetAtt 'VPC.Ipv6CidrBlocks.0'
AssignIpv6AddressOnCreation: true
AvailabilityZone: !Select [ 0, !GetAZs '' ]
Tags:
- Key: Name
Value: !Sub '${NombreProyecto}${NN}-SubredPublica1'
SubredPublica2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !Sub '10.24.1${NN}.128/25'
Ipv6CidrBlock: !Select [2, !Cidr [!Select [0, !GetAtt 'VPC.Ipv6CidrBlocks'], 256, 64]]
AssignIpv6AddressOnCreation: true
AvailabilityZone: !Select [ 1, !GetAZs '' ]
Tags:
- Key: Name
Value: !Sub '${NombreProyecto}${NN}-SubredPublica2'
# SubRedes privadas
SubredPrivada1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !Sub '10.24.2${NN}.0/25'
Ipv6CidrBlock: !Select [3, !Cidr [!Select [0, !GetAtt 'VPC.Ipv6CidrBlocks'], 256, 64]]
AssignIpv6AddressOnCreation: true
AvailabilityZone: !Select [ 0, !GetAZs '' ]
Tags:
- Key: Name
Value: !Sub '${NombreProyecto}${NN}-SubredPrivada1'
SubredPrivada2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !Sub '10.24.2${NN}.128/25'
Ipv6CidrBlock: !Select [4, !Cidr [!Select [0, !GetAtt 'VPC.Ipv6CidrBlocks'], 256, 64]]
AssignIpv6AddressOnCreation: true
AvailabilityZone: !Select [ 1, !GetAZs '' ]
Tags:
- Key: Name
Value: !Sub '${NombreProyecto}${NN}-SubredPrivada2'
# Internet Gateway y EgressOnlyInternetGateway
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: !Sub '${NombreProyecto}${NN}-igw'
VPCGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref InternetGateway
# Tabla de rutas publica
TablaRutasPublica:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${NombreProyecto}${NN}-rtb-publica'
# Tablas de rutas privadas
TablaRutasPrivada1:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: "Name"
Value: !Sub '${NombreProyecto}${NN}-rtb-privada1'
TablaRutasPrivada2:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: "Name"
Value: !Sub '${NombreProyecto}${NN}-rtb-privada2'
# Rutas por defecto para la tabla de rutas publica. Tanto IPv4 como IPv6
DefaultRouteIPv4:
Type: AWS::EC2::Route
DependsOn: VPCGatewayAttachment
Properties:
RouteTableId: !Ref TablaRutasPublica
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
DefaultRouteIPv6:
Type: AWS::EC2::Route
DependsOn: VPCGatewayAttachment
Properties:
RouteTableId: !Ref TablaRutasPublica
DestinationIpv6CidrBlock: ::/0
GatewayId: !Ref InternetGateway
# Asociacion de subredes publicas con tabla de rutas
SubnetRouteTableAssociation1:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref SubredPublica1
RouteTableId: !Ref TablaRutasPublica
SubnetRouteTableAssociation2:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref SubredPublica2
RouteTableId: !Ref TablaRutasPublica
# Asociacion de subredes privadas con sus tablas de rutas
SubnetRouteTableAssociation3:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref SubredPrivada1
RouteTableId: !Ref TablaRutasPrivada1
SubnetRouteTableAssociation4:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref SubredPrivada2
RouteTableId: !Ref TablaRutasPrivada2
Outputs:
Proyecto:
Description: Nombre del proyecto
Value: !Sub '${NombreProyecto}${NN}'
Export:
Name: "Proyecto"
VPCId:
Description: "VPC ID"
Value: !Ref VPC
Export:
Name: "MiVPCID"
SubredPublica1Id:
Description: "SubredPublica1 ID"
Value: !Ref SubredPublica1
SubredPublica2Id:
Description: "SubredPublica2 ID"
Value: !Ref SubredPublica2
SubredPrivada1Id:
Description: "SubredPrivada1 ID"
Value: !Ref SubredPrivada1
Export:
Name: "MiSubredPrivada1ID" # Exporta el ID de la SubredPrivada1
SubredPrivada2Id:
Description: "SubredPrivada2 ID"
Value: !Ref SubredPrivada2
Export:
Name: "MiSubredPrivada2ID" # Exporta el ID de la SubredPrivada2
# Se utilizan los export para poder importar el ID de la VPC en otro stack/pila que quieras ejecutar después de esta pila.
# Ej: En la plantilla destino utilizar ---> VpcId: !ImportValue MiVPCID
@AWS_Edu
Espero que os sirva. Un saludo.
Top comments (0)