GNU/Linux >> Tutoriales Linux >  >> Linux

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

  1. Cuenta de AWS (cree si no tiene una).
  2. Comprensión básica de las plantillas de formación en la nube.

¿Qué haremos?

  1. Inicie sesión en AWS.
  2. Cree una plantilla.
  3. Cree una pila de formación en la nube 

Iniciar sesión en AWS

  1. Haga 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 Cloudformation

Para crear una pila de Cloudformation, haga clic en "Servicios" en la esquina superior izquierda y busque "Cloudformation".

En el panel 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.

Dé un nombre a la pila, mantenga todos los demás parámetros sin cambios.

Proporcione etiquetas si es necesario.

Desplácese hacia abajo en la página y haga clic en "Crear pila"

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

Puedes ver el estado o el evento que tiene lugar en la pestaña "Eventos".

Ahora, puede ir a VPC y buscar la VPC que se creó. Para ir a VPC, haga clic en "Servicios" en la parte superior izquierda y busque VPC.

En el panel 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.


Linux
  1. Cómo usar el comando mkdir para hacer o crear un directorio de Linux

  2. Cómo crear y usar subdominios

  3. Cree una nube privada virtual (VPC) en AWS con Terraform

  4. Cómo crear un rol de IAM en AWS usando Terraform

  5. Cómo usar AWS CLI para administrar Amazon S3

Cómo crear un emparejamiento de VPC entre 2 VPC en AWS

Cómo crear un depósito S3 usando Python Boto3 en AWS

Cómo crear un tema de SNS y un suscriptor en AWS

Cómo crear una tabla de DynamoDB en AWS

Cómo usar Cloudformation para crear colas SQS en AWS

Cómo crear y usar un archivo de intercambio en Linux