Wie man mit Cloudformation eine VPC auf AWS erstellt
Mit Cloudformation können wir AWS-Ressourcen ganz einfach erstellen und verwalten. Mit Cloudformation können wir alle AWS-Ressourcen mithilfe einer Textdatei verwalten. Cloudformation ermöglicht es uns, unsere Infrastruktur und Anwendungen zu erstellen und zu modellieren, ohne dass wir Aktionen manuell durchführen müssen. Cloudformation hilft uns, unsere gesamte Infrastruktur in einer Textdatei oder Vorlage zu verwalten. Eine Cloudformation-Vorlage ist eine formatierte Textdatei in JSON- oder YAML-Sprache, die unsere AWS-Infrastruktur beschreibt.
In diesem Artikel werden wir uns eine Cloudformation ansehen, um eine VPC mit 2 öffentlichen und 2 privaten Subnetzen zu erstellen.
Vorraussetzungen
- AWS-Konto (Erstelle wenn du noch keins hast).
- Grundlegendes Verständnis von Cloudformation Templates.
Was werden wir tun?
- Melde dich bei AWS an.
- Erstelle eine Vorlage.
- Erstelle einen Cloudformation Stack
Bei AWS anmelden
- Klicke auf hier um zur AWS-Anmeldeseite zu gelangen.
Wenn wir den obigen Link anklicken, sehen wir die folgende Webseite, auf der wir uns mit unseren Anmeldedaten anmelden müssen.
Sobald wir uns erfolgreich bei AWS angemeldet haben, sehen wir die Hauptkonsole, in der alle Services wie folgt aufgelistet sind.
Eine Vorlage erstellen
Bevor wir mit der Erstellung eines Stacks fortfahren, sollten wir eine Vorlage erstellen, die für die Erstellung einer VPC verwendet wird. Kopiere den folgenden Code und speichere ihn auf einem lokalen Rechner.
--- 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"
Einen Cloudformation Stack erstellen
Um einen Cloudformation Stack zu erstellen, klicke oben links auf „Dienste“ und suche nach „Cloudformation“.
Klicke auf dem Haupt-Dashboard auf „Stack erstellen“ -> „Mit neuen Ressourcen (Standard)“.
Der Stack benötigt eine Vorlagendatei, die eine lokale Datei oder eine Objektdatei im S3 Bucket sein kann. Da wir eine lokale Vorlage verwenden werden, klicke auf „Vorlage ist bereit“ -> „Vorlagendatei hochladen“, klicke auf „Datei auswählen“, wähle die lokale Vorlagendatei aus und fahre fort.
Gib dem Stack einen Namen und lass alle anderen Parameter unverändert.
Gib bei Bedarf Tags an.
Scrolle auf der Seite nach unten und klicke auf „Stapel erstellen“.
Dies wird einige Zeit dauern, warte bis dahin.
Du kannst den Status oder das Ereignis unter dem Reiter „Ereignisse“ sehen.
Jetzt kannst du zum VPC gehen und nachsehen, welcher VPC erstellt wurde. Um zum VPC zu gelangen, klicke oben auf „Dienste“ und suche links nach VPC.
Im Hauptdashboard siehst du die Anzahl der erstellten VPC, Subnetze, Routentabellen, Internet Gateway und Nat Gateway.
Du kannst den VPC löschen, indem du einfach den Stack löschst, wenn du ihn nicht mehr brauchst.
Fazit
In diesem Artikel haben wir gesehen, wie man einen Cloudformation Stack erstellt, um einen VPC mit 2 öffentlichen und 2 privaten Subnetzen zu schaffen.