Ricerca nel sito web

Come utilizzare Cloudformation per creare un VPC su AWS


Su questa pagina

  1. Prerequisiti
  2. Cosa faremo?
  3. Crea un modello
  4. Crea uno stack Cloudformation
  5. Conclusione

Utilizzando Cloudformation, possiamo creare e gestire le risorse AWS molto facilmente. Cloudformation può essere utilizzato per gestire tutte le risorse AWS utilizzando un file di testo. Cloudformation ci consente di creare e modellare la nostra infrastruttura e le nostre applicazioni senza dover eseguire azioni manualmente. Cloudformation ci aiuta a gestire la nostra infrastruttura completa in un file di testo o modello. Il modello Cloudformation è un file di testo formattato in linguaggio JSON o YAML che descrive la nostra infrastruttura AWS.

In questo articolo vedremo una Cloudformation per creare un VPC con 2 sottoreti pubbliche e 2 private.

Prerequisiti

  1. Account AWS (crealo se non ne hai uno).
  2. Comprensione di base dei modelli Cloudformation.

Cosa faremo?

  1. Accedi ad AWS.
  2. Crea un modello.
  3. Crea uno stack Cloudformation 

Accedi ad AWS

  1. Fai clic qui per accedere alla pagina di accesso di AWS.

Quando colpiamo il link sopra, vedremo una pagina web come segue in cui ci viene richiesto di accedere utilizzando i nostri dati di accesso.

Una volta effettuato l'accesso ad AWS con successo, vedremo la console principale con tutti i servizi elencati come segue.

Crea un modello

Prima di procedere con la creazione di uno stack, dovremmo disporre di un modello che verrà utilizzato per creare un VPC. Copia il seguente codice e salvalo su un computer locale.

---
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"

Crea uno stack Cloudformation

Per creare uno Stack Cloudformation, fai clic su \Servizi in alto a sinistra e cerca \Cloudformation.

Nella dashboard principale, fai clic su \Crea stack” -> \Con nuove risorse(standard)\.

Lo stack necessita di un file modello che può essere un file locale o un file oggetto nel bucket S3. Poiché avremo un modello locale, fare clic su \Il modello è pronto” -> \Carica un file modello”, fare clic su \Scegli file” e selezionare il file modello locale e procedere oltre.

Dai un nome allo stack, mantieni invariati tutti gli altri parametri.

Assegna i tag se richiesto.

Scorri la pagina verso il basso e fai clic su \Crea stack

Ci vorrà del tempo, aspetta fino ad allora.

Puoi vedere lo stato o l'evento in corso nella scheda \Eventi.

Ora puoi andare su VPC e controllare il VPC che è stato creato. Per andare a VPC, fai clic su \Servizi in alto e a sinistra cerca VPC.

Nella dashboard principale, puoi vedere il numero di VPC, sottoreti, tabelle di instradamento, gateway Internet, gateway Nat che sono stati creati.

Puoi eliminare il VPC semplicemente eliminando lo Stack se non ne hai più bisogno.

Conclusione

In questo articolo, abbiamo visto i passaggi per creare uno stack Cloudformation per creare un VPC con 2 sottoreti pubbliche e 2 private.