DEV Community

Cover image for AWS CloudFormation Introducción. 1. VPC IPv4/IPv6. IaC. AWS Academy.

AWS CloudFormation Introducción. 1. VPC IPv4/IPv6. IaC. AWS Academy.

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

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

AWS CloudFormation Workshop

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

@AWS_Edu

Espero que os sirva. Un saludo.

Top comments (0)