Cómo usar Cloudformation para crear una VPC en AWS

Usando Cloudformation, podemos crear y administrar recursos de AWS muy fácilmente. Cloudformation se puede utilizar para administrar todos los recursos de AWS mediante un archivo de texto. Cloudformation nos permite crear y modelar nuestra infraestructura y aplicaciones sin tener que realizar acciones manualmente. Cloudformation nos ayuda a administrar nuestra infraestructura completa 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 formación en la nube para crear una VPC con 2 subredes públicas y 2 privadas.
requisitos previos
- Cuenta AWS (Crear si no tienes uno).
- Comprensión básica de las plantillas de Cloudformation.
¿Lo que haremos?
- Inicie sesión en AWS.
- Crea una plantilla.
- Crear una pila de formación en la nube
Iniciar sesión en AWS
- Hacer clic aquí para ir a la página de inicio de sesión de AWS.
Cuando hagamos clic en el enlace anterior, veremos una página web como la siguiente donde debemos iniciar sesión con nuestros datos de inicio de sesión.
Una vez que iniciemos sesión en AWS con éxito, veremos la consola principal con todos los servicios enumerados a continuación.
crear una plantilla
Antes de continuar con la creación de una pila, debemos tener una plantilla que se usará para crear una VPC. Copie el siguiente código y guárdelo en una máquina local.
--- AWSTemplateFormatVersion: 2010-09-09 Description: > This Templates creates a VPC with 3 public and 3 private subnets. Parameters: VpcCIDR: Type: String Description: VPC CIDR (Do Not Change if no customization is required). Default: 10.10.0.0/16 PrivateAZ1SubnetCIDR: Type: String Description: Subnet CIDR for 1st Availability Zone (Do Not Change if no customization is required). Default: 10.10.80.0/21 PrivateAZ2SubnetCIDR: Type: String Description: Subnet CIDR for 2nd Availability Zone (Do Not Change if no customization is required). Default: 10.10.88.0/21 PrivateAZ3SubnetCIDR: Type: String Description: Subnet CIDR for 3rd Availability Zone (Do Not Change if no customization is required). Default: 10.10.96.0/21 PublicAZ1SubnetCIDR: Type: String Description: Subnet CIDR for 1st Availability Zone (Do Not Change if no customization is required). Default: 10.10.0.0/21 PublicAZ2SubnetCIDR: Type: String Description: Subnet CIDR for 2nd Availability Zone (Do Not Change if no customization is required). Default: 10.10.8.0/21 PublicAZ3SubnetCIDR: Type: String Description: Subnet CIDR for 3rd Availability Zone (Do Not Change if no customization is required). Default: 10.10.16.0/21 Metadata: AWS::CloudFormation::Interface: ParameterGroups: - Label: default: VPC Parameters: - VpcCIDR - Label: default: Availabilty Zone 1 Parameters: - PublicAZ1SubnetCIDR - PrivateAZ1SubnetCIDR - Label: default: Availabilty Zone 1 Parameters: - PublicAZ2SubnetCIDR - PrivateAZ2SubnetCIDR - Label: default: Availabilty Zone 1 Parameters: - PublicAZ3SubnetCIDR - PrivateAZ3SubnetCIDR Resources: Vpc: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCIDR Tags: - Key: Name Value: !Sub ${AWS::StackName} InternetGateway: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: !Sub ${AWS::StackName} VPCGatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: InternetGatewayId: !Ref InternetGateway VpcId: !Ref Vpc # Public Subnets - Route Table PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref Vpc Tags: - Key: Name Value: !Sub ${AWS::StackName}-public - Key: Type Value: public PublicSubnetsRoute: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PublicRouteTable DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway DependsOn: VPCGatewayAttachment # Public Subnets PublicAZ1Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref Vpc CidrBlock: !Ref PublicAZ1SubnetCIDR AvailabilityZone: !Select [0, !GetAZs ""] MapPublicIpOnLaunch: true Tags: - Key: Name Value: !Sub - ${AWS::StackName}-public-${AZ} - { AZ: !Select [0, !GetAZs ""] } - Key: Type Value: public PublicAZ1SubnetRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicAZ1Subnet RouteTableId: !Ref PublicRouteTable PublicAZ2Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref Vpc CidrBlock: !Ref PublicAZ2SubnetCIDR AvailabilityZone: !Select [1, !GetAZs ""] MapPublicIpOnLaunch: true Tags: - Key: Name Value: !Sub - ${AWS::StackName}-public-${AZ} - { AZ: !Select [1, !GetAZs ""] } - Key: Type Value: public PublicAZ2SubnetRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicAZ2Subnet RouteTableId: !Ref PublicRouteTable PublicAZ3Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref Vpc CidrBlock: !Ref PublicAZ3SubnetCIDR AvailabilityZone: !Select [2, !GetAZs ""] MapPublicIpOnLaunch: true Tags: - Key: Name Value: !Sub - ${AWS::StackName}-public-${AZ} - { AZ: !Select [2, !GetAZs ""] } - Key: Type Value: public PublicAZ3SubnetRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicAZ3Subnet RouteTableId: !Ref PublicRouteTable # Private Subnets - NAT Gateways AZ1NatGatewayEIP: Type: AWS::EC2::EIP Properties: Domain: vpc DependsOn: VPCGatewayAttachment AZ1NatGateway: Type: AWS::EC2::NatGateway Properties: AllocationId: !GetAtt AZ1NatGatewayEIP.AllocationId SubnetId: !Ref PublicAZ1Subnet AZ2NatGatewayEIP: Type: AWS::EC2::EIP Properties: Domain: vpc DependsOn: VPCGatewayAttachment AZ2NatGateway: Type: AWS::EC2::NatGateway Properties: AllocationId: !GetAtt AZ2NatGatewayEIP.AllocationId SubnetId: !Ref PublicAZ2Subnet AZ3NatGatewayEIP: Type: AWS::EC2::EIP Properties: Domain: vpc DependsOn: VPCGatewayAttachment AZ3NatGateway: Type: AWS::EC2::NatGateway Properties: AllocationId: !GetAtt AZ3NatGatewayEIP.AllocationId SubnetId: !Ref PublicAZ3Subnet # Private Subnets PrivateAZ1Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref Vpc CidrBlock: !Ref PrivateAZ1SubnetCIDR AvailabilityZone: !Select [0, !GetAZs ""] Tags: - Key: Name Value: !Sub - ${AWS::StackName}-private-${AZ} - { AZ: !Select [0, !GetAZs ""] } - Key: Type Value: private PrivateAZ1RouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref Vpc Tags: - Key: Name Value: !Sub - ${AWS::StackName}-private-${AZ} - { AZ: !Select [0, !GetAZs ""] } - Key: Type Value: private PrivateAZ1Route: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PrivateAZ1RouteTable DestinationCidrBlock: 0.0.0.0/0 NatGatewayId: !Ref AZ1NatGateway PrivateAZ1RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PrivateAZ1Subnet RouteTableId: !Ref PrivateAZ1RouteTable PrivateAZ2Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref Vpc CidrBlock: !Ref PrivateAZ2SubnetCIDR AvailabilityZone: !Select [1, !GetAZs ""] Tags: - Key: Name Value: !Sub - ${AWS::StackName}-private-${AZ} - { AZ: !Select [1, !GetAZs ""] } - Key: Type Value: private PrivateAZ2RouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref Vpc Tags: - Key: Name Value: !Sub - ${AWS::StackName}-private-${AZ} - { AZ: !Select [1, !GetAZs ""] } - Key: Type Value: private PrivateAZ2Route: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PrivateAZ2RouteTable DestinationCidrBlock: 0.0.0.0/0 NatGatewayId: !Ref AZ2NatGateway PrivateAZ2RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PrivateAZ2Subnet RouteTableId: !Ref PrivateAZ2RouteTable PrivateAZ3Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref Vpc CidrBlock: !Ref PrivateAZ3SubnetCIDR AvailabilityZone: !Select [2, !GetAZs ""] Tags: - Key: Name Value: !Sub - ${AWS::StackName}-private-${AZ} - { AZ: !Select [2, !GetAZs ""] } - Key: Type Value: private PrivateAZ3RouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref Vpc Tags: - Key: Name Value: !Sub - ${AWS::StackName}-private-${AZ} - { AZ: !Select [2, !GetAZs ""] } - Key: Type Value: private PrivateAZ3Route: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PrivateAZ3RouteTable DestinationCidrBlock: 0.0.0.0/0 NatGatewayId: !Ref AZ3NatGateway PrivateAZ3RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PrivateAZ3Subnet RouteTableId: !Ref PrivateAZ3RouteTable Outputs: VpcId: Description: VPC Id Value: !Ref Vpc Export: Name: !Sub "${AWS::StackName}-VPC-ID"
Crear una pila de formación en la nube
Para crear una pila de Cloudformation, haga clic en «Servicios» en la parte superior izquierda y busque «Cloudformation».
En el tablero principal, haga clic en «Crear pila» -> «Con nuevos recursos (estándar)».
La pila necesita un archivo de plantilla que puede ser un archivo local o un archivo de objeto en el S3 Bucket. Dado que tendremos una plantilla local, haga clic en «La plantilla está lista» -> «Cargar un archivo de plantilla», haga clic en «Elegir archivo» y seleccione el archivo de plantilla local y continúe.
Asigne un nombre a la pila, mantenga todos los demás parámetros sin cambios.
Dar etiquetas si es necesario.
Desplácese hacia abajo en la página y haga clic en «Crear pila»
Anuncio publicitario
Esto tomará algún tiempo, espera hasta entonces.
Puede ver el estado o el evento que tiene lugar en la pestaña «Eventos».
Ahora, puede ir a VPC y verificar la VPC que se creó. Para ir a VPC, haga clic en «Servicios» en la parte superior izquierda y busque VPC.
En el tablero principal, puede ver la cantidad de VPC, subredes, tablas de rutas, Internet Gateway, Nat Gateway que se crearon.
Puede eliminar la VPC simplemente eliminando la pila si ya no la necesita.
Conclusión
En este artículo, vimos los pasos para crear una pila de Cloudformation para crear una VPC con 2 subredes públicas y 2 privadas.