Cómo utilizar Cloudformation para crear una VPC en AWS

Utilizando Cloudformation, podemos crear y administrar los recursos de AWS muy fácilmente. Cloudformation puede utilizarse para administrar todos los recursos de AWS utilizando un archivo de texto. Cloudformation nos permite crear y modelar nuestra infraestructura y aplicaciones sin tener que realizar acciones manualmente. Cloudformation nos ayuda a gestionar toda nuestra infraestructura en un archivo de texto, o plantilla. La plantilla de Cloudformation es un archivo de texto formateado en lenguaje JSON o YAML que describe nuestra infraestructura de AWS.

En este artículo, veremos una Cloudformation para crear una VPC con 2 subredes públicas y 2 privadas.

Requisitos previos

  1. Cuenta de AWS (Crea si no tienes una).
  2. Conocimiento básico de las plantillas de Cloudformation.

¿Qué vamos a hacer?

  1. Iniciar sesión en AWS.
  2. Crear una plantilla.
  3. Crear una pila de Cloudformation

Inicia sesión en AWS

  1. Haz clic en aquí para ir a la página de inicio de sesión de AWS.

Cuando pulsemos el enlace anterior, veremos una página web como la siguiente en la que se nos pide que iniciemos sesión con nuestros datos de acceso.

Acceder a AWS

Una vez que iniciemos sesión en AWS con éxito, veremos la consola principal con todos los servicios listados como sigue.

Consola de administración de AWS

Crear una plantilla

Antes de proceder a la creación de una pila, debemos tener una plantilla que se utilizará para crear una VPC. Copia el siguiente código y guárdalo en una máquina local.

---
AWSTemplateFormatVersion: 2010-09-09
Description: >
  This Templates creates a VPC with 3 public and 3 private subnets.
Parameters:
  VpcCIDR:
    TypeString
    DescriptionVPC CIDR (Do Not Change if no customization is required). 
    Default10.10.0.0/16
  PrivateAZ1SubnetCIDR:
    TypeString
    DescriptionSubnet CIDR for 1st Availability Zone (Do Not Change if no customization is required).
    Default10.10.80.0/21
  PrivateAZ2SubnetCIDR:
    TypeString
    DescriptionSubnet CIDR for 2nd Availability Zone (Do Not Change if no customization is required).
    Default10.10.88.0/21
  PrivateAZ3SubnetCIDR:
    TypeString
    DescriptionSubnet CIDR for 3rd Availability Zone (Do Not Change if no customization is required).
    Default10.10.96.0/21
  PublicAZ1SubnetCIDR:
    TypeString
    DescriptionSubnet CIDR for 1st Availability Zone (Do Not Change if no customization is required).
    Default10.10.0.0/21
  PublicAZ2SubnetCIDR:
    TypeString
    DescriptionSubnet CIDR for 2nd Availability Zone (Do Not Change if no customization is required).
    Default10.10.8.0/21
  PublicAZ3SubnetCIDR:
    TypeString
    DescriptionSubnet CIDR for 3rd Availability Zone (Do Not Change if no customization is required). 
    Default10.10.16.0/21
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          defaultVPC
        Parameters:
          - VpcCIDR
      - Label:
          defaultAvailabilty Zone 1
        Parameters:
          - PublicAZ1SubnetCIDR
          - PrivateAZ1SubnetCIDR
      - Label:
          defaultAvailabilty Zone 1
        Parameters:
          - PublicAZ2SubnetCIDR
          - PrivateAZ2SubnetCIDR
      - Label:
          defaultAvailabilty Zone 1
        Parameters:
          - PublicAZ3SubnetCIDR
          - PrivateAZ3SubnetCIDR
Resources:
  Vpc:
    TypeAWS::EC2::VPC
    Properties:
      CidrBlock!Ref VpcCIDR
      Tags:
        - KeyName
          Value!Sub ${AWS::StackName}
  InternetGateway:
    TypeAWS::EC2::InternetGateway
    Properties:
      Tags:
        - KeyName
          Value!Sub ${AWS::StackName}
  VPCGatewayAttachment:
    TypeAWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId!Ref InternetGateway
      VpcId!Ref Vpc
  # Public Subnets - Route Table
  PublicRouteTable:
    TypeAWS::EC2::RouteTable
    Properties:
      VpcId!Ref Vpc
      Tags:
        - KeyName
          Value!Sub ${AWS::StackName}-public
        - KeyType
          Valuepublic
  PublicSubnetsRoute:
    TypeAWS::EC2::Route
    Properties:
      RouteTableId!Ref PublicRouteTable
      DestinationCidrBlock0.0.0.0/0
      GatewayId!Ref InternetGateway
    DependsOnVPCGatewayAttachment
  # Public Subnets
  PublicAZ1Subnet:
    TypeAWS::EC2::Subnet
    Properties:
      VpcId!Ref Vpc
      CidrBlock!Ref PublicAZ1SubnetCIDR
      AvailabilityZone!Select [0!GetAZs ""]
      MapPublicIpOnLaunchtrue
      Tags:
        - KeyName
          Value!Sub
            - ${AWS::StackName}-public-${AZ}
            - { AZ!Select [0!GetAZs ""] }
        - KeyType
          Valuepublic
  PublicAZ1SubnetRouteTableAssociation:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId!Ref PublicAZ1Subnet
      RouteTableId!Ref PublicRouteTable
  PublicAZ2Subnet:
    TypeAWS::EC2::Subnet
    Properties:
      VpcId!Ref Vpc
      CidrBlock!Ref PublicAZ2SubnetCIDR
      AvailabilityZone!Select [1!GetAZs ""]
      MapPublicIpOnLaunchtrue
      Tags:
        - KeyName
          Value!Sub
            - ${AWS::StackName}-public-${AZ}
            - { AZ!Select [1!GetAZs ""] }
        - KeyType
          Valuepublic
  PublicAZ2SubnetRouteTableAssociation:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId!Ref PublicAZ2Subnet
      RouteTableId!Ref PublicRouteTable
  PublicAZ3Subnet:
    TypeAWS::EC2::Subnet
    Properties:
      VpcId!Ref Vpc
      CidrBlock!Ref PublicAZ3SubnetCIDR
      AvailabilityZone!Select [2!GetAZs ""]
      MapPublicIpOnLaunchtrue
      Tags:
        - KeyName
          Value!Sub
            - ${AWS::StackName}-public-${AZ}
            - { AZ!Select [2!GetAZs ""] }
        - KeyType
          Valuepublic
  PublicAZ3SubnetRouteTableAssociation:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId!Ref PublicAZ3Subnet
      RouteTableId!Ref PublicRouteTable
  # Private Subnets - NAT Gateways
  AZ1NatGatewayEIP:
    TypeAWS::EC2::EIP
    Properties:
      Domainvpc
    DependsOnVPCGatewayAttachment
  AZ1NatGateway:
    TypeAWS::EC2::NatGateway
    Properties:
      AllocationId!GetAtt AZ1NatGatewayEIP.AllocationId
      SubnetId!Ref PublicAZ1Subnet
  AZ2NatGatewayEIP:
    TypeAWS::EC2::EIP
    Properties:
      Domainvpc
    DependsOnVPCGatewayAttachment
  AZ2NatGateway:
    TypeAWS::EC2::NatGateway
    Properties:
      AllocationId!GetAtt AZ2NatGatewayEIP.AllocationId
      SubnetId!Ref PublicAZ2Subnet
  AZ3NatGatewayEIP:
    TypeAWS::EC2::EIP
    Properties:
      Domainvpc
    DependsOnVPCGatewayAttachment
  AZ3NatGateway:
    TypeAWS::EC2::NatGateway
    Properties:
      AllocationId!GetAtt AZ3NatGatewayEIP.AllocationId
      SubnetId!Ref PublicAZ3Subnet
  # Private Subnets
  PrivateAZ1Subnet:
    TypeAWS::EC2::Subnet
    Properties:
      VpcId!Ref Vpc
      CidrBlock!Ref PrivateAZ1SubnetCIDR
      AvailabilityZone!Select [0!GetAZs ""]
      Tags:
        - KeyName
          Value!Sub
            - ${AWS::StackName}-private-${AZ}
            - { AZ!Select [0!GetAZs ""] }
        - KeyType
          Valueprivate
  PrivateAZ1RouteTable:
    TypeAWS::EC2::RouteTable
    Properties:
      VpcId!Ref Vpc
      Tags:
        - KeyName
          Value!Sub
            - ${AWS::StackName}-private-${AZ}
            - { AZ!Select [0!GetAZs ""] }
        - KeyType
          Valueprivate
  PrivateAZ1Route:
    TypeAWS::EC2::Route
    Properties:
      RouteTableId!Ref PrivateAZ1RouteTable
      DestinationCidrBlock0.0.0.0/0
      NatGatewayId!Ref AZ1NatGateway
  PrivateAZ1RouteTableAssociation:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId!Ref PrivateAZ1Subnet
      RouteTableId!Ref PrivateAZ1RouteTable
  PrivateAZ2Subnet:
    TypeAWS::EC2::Subnet
    Properties:
      VpcId!Ref Vpc
      CidrBlock!Ref PrivateAZ2SubnetCIDR
      AvailabilityZone!Select [1!GetAZs ""]
      Tags:
        - KeyName
          Value!Sub
            - ${AWS::StackName}-private-${AZ}
            - { AZ!Select [1!GetAZs ""] }
        - KeyType
          Valueprivate
  PrivateAZ2RouteTable:
    TypeAWS::EC2::RouteTable
    Properties:
      VpcId!Ref Vpc
      Tags:
        - KeyName
          Value!Sub
            - ${AWS::StackName}-private-${AZ}
            - { AZ!Select [1!GetAZs ""] }
        - KeyType
          Valueprivate
  PrivateAZ2Route:
    TypeAWS::EC2::Route
    Properties:
      RouteTableId!Ref PrivateAZ2RouteTable
      DestinationCidrBlock0.0.0.0/0
      NatGatewayId!Ref AZ2NatGateway
  PrivateAZ2RouteTableAssociation:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId!Ref PrivateAZ2Subnet
      RouteTableId!Ref PrivateAZ2RouteTable
  PrivateAZ3Subnet:
    TypeAWS::EC2::Subnet
    Properties:
      VpcId!Ref Vpc
      CidrBlock!Ref PrivateAZ3SubnetCIDR
      AvailabilityZone!Select [2!GetAZs ""]
      Tags:
        - KeyName
          Value!Sub
            - ${AWS::StackName}-private-${AZ}
            - { AZ!Select [2!GetAZs ""] }
        - KeyType
          Valueprivate
  PrivateAZ3RouteTable:
    TypeAWS::EC2::RouteTable
    Properties:
      VpcId!Ref Vpc
      Tags:
        - KeyName
          Value!Sub
            - ${AWS::StackName}-private-${AZ}
            - { AZ!Select [2!GetAZs ""] }
        - KeyType
          Valueprivate
  PrivateAZ3Route:
    TypeAWS::EC2::Route
    Properties:
      RouteTableId!Ref PrivateAZ3RouteTable
      DestinationCidrBlock0.0.0.0/0
      NatGatewayId!Ref AZ3NatGateway
  PrivateAZ3RouteTableAssociation:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId!Ref PrivateAZ3Subnet
      RouteTableId!Ref PrivateAZ3RouteTable
  
Outputs:
  VpcId:
    DescriptionVPC Id
    Value!Ref Vpc
    Export:
      Name!Sub "${AWS::StackName}-VPC-ID"

Crear una pila de formación de nubes

Para crear una Cloudformation Stack, haz clic en «Servicios» en la parte superior izquierda y busca «Cloudformation».

Pila de formación en la nube

En el panel principal, haz clic en «Crear pila» -> «Con nuevos recursos (estándar)».

Crear pila

La pila necesita un archivo de plantilla que puede ser un archivo local o un archivo de objetos en el S3 Bucket. Como vamos a tener una plantilla local, haz clic en «La plantilla está lista» -> «Subir un archivo de plantilla», haz clic en «Elegir archivo» y selecciona el archivo de plantilla local y sigue adelante.

Plantilla de pila

Dale un nombre a la pila, mantén los demás parámetros sin cambios.

Nombre de la pila y parámetros

Da etiquetas si es necesario.

Etiquetas

Desplázate por la página y haz clic en «Crear pila».

Crear pila

Esto llevará algún tiempo, espera hasta entonces.

Mi VPC

En la pestaña «Eventos» podrás ver el estado o evento que se está produciendo.

Eventos

Ahora, puedes ir a la VPC y comprobar la VPC que se ha creado. Para ir a la VPC, haz clic en «Servicios» en la parte superior y busca a la izquierda la VPC.

AWS VPC

En el panel principal, puedes ver el número de VPC, subredes, tablas de rutas, puertas de enlace de Internet y puertas de enlace de Nat que se han creado.

Iniciar la VPC

Puedes eliminar la VPC simplemente borrando la Pila si ya no la necesitas.

Lista de pilas creadas

Conclusión

En este artículo, hemos visto los pasos para crear una pila de Cloudformation para crear una VPC con 2 subredes públicas y 2 privadas.

También te podría gustar...