Cloudformation gebruiken om een VPC op AWS te maken

Met behulp van Cloudformation kunnen we heel gemakkelijk AWS resources maken en beheren. Cloudformation kan gebruikt worden om alle AWS resources te beheren met behulp van een tekstbestand. Cloudformation stelt ons in staat onze infrastructuur en toepassingen te maken en te modelleren zonder dat we handmatig handelingen hoeven uit te voeren. Cloudformation helpt ons om onze complete infrastructuur te beheren in een tekstbestand, of sjabloon. Cloudformation sjabloon is een opgemaakt tekstbestand in JSON of YAML taal dat onze AWS infrastructuur beschrijft.

In dit artikel zullen we een Cloudformation zien om een VPC te maken met 2 Public en 2 Private Subnets.

Pre-requisites

  1. AWS Account (Maak aan als je er geen hebt).
  2. Basiskennis van Cloudformation Templates.

Wat zullen we doen?

  1. Log in op AWS.
  2. Maak een sjabloon aan.
  3. Maak een Cloudformation Stack

Login op AWS

  1. Klik op hier om naar de AWS Login pagina te gaan.

Als we op de bovenstaande link klikken, zien we een webpagina als volgt waar we moeten inloggen met onze inloggegevens.

Inloggen op AWS

Zodra we met succes op AWS zijn ingelogd, zien we de hoofdconsole met alle diensten als volgt opgesomd.

AWS Beheerconsole

Maak een sjabloon

Voor we verder gaan met het maken van een stack, moeten we een sjabloon hebben dat gebruikt zal worden om een VPC te maken. Kopieer de volgende code en sla in op een lokale machine.

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

Maak een Cloudformation Stack

Om een Cloudformation Stack te maken, klik je linksboven op “Services” en zoek naar “Cloudformation”.

Cloudformation Stack

Klik op het hoofddashboard op “Create stack” -> “With new resorces(standard)”.

Maak Stapel

De stack heeft een sjabloonbestand nodig dat een lokaal bestand kan zijn of een objectbestand in de S3 Bucket. Omdat we een lokaal sjabloon zullen hebben, klik je op “Sjabloon is klaar” -> “Upload een sjabloonbestand”, klik op “Kies bestand” en kies het lokale sjabloonbestand en ga verder.

Stapel sjabloon

Geef een naam aan de stapel, laat alle andere parameters ongewijzigd.

Stack naam en parameters

Geef tags op als dat nodig is.

Tags

Scroll naar beneden op de pagina en klik op “Create stack”.

Maak stapel

Dit duurt even, wacht tot dan.

Mijn VPC

Je kunt de status of gebeurtenis die plaatsvindt zien onder het tabblad “Events”.

Evenementen

Nu kun je naar VPC gaan en de aangemaakte VPC controleren. Om naar VPC te gaan, klik je bovenaan op “Services” en zoek je links naar VPC.

AWS VPC

In het hoofddashboard zie je het aantal VPC, Subnets, Route Tables, Internet Gateway, Nat Gateway die werden aangemaakt.

Start VPC

Je kunt de VPC verwijderen door alleen de Stack te verwijderen als je hem niet meer nodig hebt.

Lijst van gecreëerde Stacks

Conclusie

In dit artikel zagen we de stappen om een Cloudformation Stack te maken om een VPC te maken met 2 Public en 2 Private Subnet.