--- AWSTemplateFormatVersion: 2010-09-09 Description: Creates Amazon Virtual Private Cloud (Amazon VPC) with two availabilityzones (AZ), two public subnets and two private subnets (one public, private subnet in each AZ), an Internet gateway, and a NAT gateway. Metadata: AWS::CloudFormation::Interface: ParameterGroups: - Label: default: Virtual Private Cloud Parameters: - VpcCidr - AvailabilityZones ParameterLabels: AvailabilityZones: default: Availability Zones (select two) VpcCidr: default: VPC CIDR Parameters: AvailabilityZones: Description: Select two (2) availability zone (AZ). One (1) public subnet and one (1) private subnet will be created in each AZ (4 total subnets). Type: List VpcCidr: AllowedValues: - 10.0.0.0/16 - 172.31.0.0/16 - 192.168.0.0/16 Default: 10.0.0.0/16 Description: Select the private address IPv4 CIDR for the VPC. Type: String Resources: AttachInternetGateway: Type: AWS::EC2::VPCGatewayAttachment Properties: InternetGatewayId: !Ref InternetGateway VpcId: !Ref Vpc InternetGateway: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: !Join [ '', [ 'VPC IGW | ', !Ref 'AWS::StackName' ] ] NatGateway0Eip: Type: AWS::EC2::EIP Properties: Domain: vpc NatGateway1Eip: Type: AWS::EC2::EIP Properties: Domain: vpc NatGateway0: Type: AWS::EC2::NatGateway Properties: AllocationId: !GetAtt NatGateway0Eip.AllocationId SubnetId: !Ref PublicSubnet0 NatGateway1: Type: AWS::EC2::NatGateway Properties: AllocationId: !GetAtt NatGateway1Eip.AllocationId SubnetId: !Ref PublicSubnet1 PrivateRoute0: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PrivateRouteTable0 DestinationCidrBlock: 0.0.0.0/0 NatGatewayId: !Ref NatGateway0 PrivateRoute1: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PrivateRouteTable1 DestinationCidrBlock: 0.0.0.0/0 NatGatewayId: !Ref NatGateway1 PrivateRouteTable0: Type: AWS::EC2::RouteTable Properties: Tags: - Key: Name Value: !Join [ '', [ 'Private Route Table | ', !Ref 'AWS::StackName' ] ] - Key: Network Value: Private VpcId: !Ref Vpc PrivateRouteTable1: Type: AWS::EC2::RouteTable Properties: Tags: - Key: Name Value: !Join [ '', [ 'Private Route Table | ', !Ref 'AWS::StackName' ] ] - Key: Network Value: Private VpcId: !Ref Vpc PrivateRouteTableAssociation0: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PrivateSubnet0 RouteTableId: !Ref PrivateRouteTable0 PrivateRouteTableAssociation1: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PrivateSubnet1 RouteTableId: !Ref PrivateRouteTable1 PrivateSubnet0: Type: AWS::EC2::Subnet Properties: AvailabilityZone: !Select [ 0, !Ref AvailabilityZones ] CidrBlock: !Select [ 1, !Cidr [ !GetAtt Vpc.CidrBlock, 3, 8 ]] Tags: - Key: Name Value: !Join [ '', [ 'Private Subnet 0 | ', !Ref 'AWS::StackName' ] ] - Key: SubnetType Value: Private VpcId: !Ref Vpc PrivateSubnet1: Type: AWS::EC2::Subnet Properties: AvailabilityZone: !Select [ 1, !Ref AvailabilityZones ] CidrBlock: !Select [ 2, !Cidr [ !GetAtt Vpc.CidrBlock, 3, 8 ] ] Tags: - Key: Name Value: !Join [ '', [ 'Private Subnet 1 | ', !Ref 'AWS::StackName' ] ] - Key: SubnetType Value: Private VpcId: !Ref Vpc PublicRoute: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PublicRouteTable DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway PublicRouteTable: Type: AWS::EC2::RouteTable Properties: Tags: - Key: Name Value: !Join [ '', [ 'Public Route Table | ', !Ref 'AWS::StackName' ] ] - Key: Network Value: Public VpcId: !Ref Vpc PublicRouteTableAssociation0: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnet0 RouteTableId: !Ref PublicRouteTable PublicRouteTableAssociation1: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnet1 RouteTableId: !Ref PublicRouteTable PublicSubnet0: Type: AWS::EC2::Subnet Properties: AvailabilityZone: !Select [ 0, !Ref AvailabilityZones ] CidrBlock: !Select [ 0, !Cidr [ !GetAtt Vpc.CidrBlock, 2, 4 ] ] MapPublicIpOnLaunch: true Tags: - Key: Name Value: !Join [ '', [ 'Public Subnet 0 | ', !Ref 'AWS::StackName' ] ] - Key: SubnetType Value: Public VpcId: !Ref Vpc PublicSubnet1: Type: AWS::EC2::Subnet Properties: AvailabilityZone: !Select [ 1, !Ref AvailabilityZones ] CidrBlock: !Select [ 1, !Cidr [ !GetAtt Vpc.CidrBlock, 2, 4 ] ] MapPublicIpOnLaunch: true Tags: - Key: Name Value: !Join [ '', [ 'Public Subnet 1 | ', !Ref 'AWS::StackName' ] ] - Key: SubnetType Value: Public VpcId: !Ref Vpc Vpc: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCidr EnableDnsHostnames: true EnableDnsSupport: true Tags: - Key: Name Value: !Join [ '', [ 'VPC | ', !Ref 'AWS::StackName' ] ] Outputs: VpcId: Value: !Ref Vpc VpcCidr: Value: !Ref VpcCidr DefaultSecurityGroupId: Value: !GetAtt Vpc.DefaultSecurityGroup PrivateSubnetId0: Value: !Ref PrivateSubnet0 PrivateSubnet0Cidr: Value: !Select [ 1, !Cidr [ !GetAtt Vpc.CidrBlock, 3, 8 ] ] PrivateSubnetId1: Value: !Ref PrivateSubnet1 PrivateSubnet1Cidr: Value: !Select [ 2, !Cidr [ !GetAtt Vpc.CidrBlock, 3, 8 ] ] PublicSubnetId0: Value: !Ref PublicSubnet0 PublicSubnet0Cidr: Value: !Select [ 0, !Cidr [ !GetAtt Vpc.CidrBlock, 2, 4 ] ] PublicSubnetId1: Value: !Ref PublicSubnet1 PublicSubnet1Cidr: Value: !Select [ 1, !Cidr [ !GetAtt Vpc.CidrBlock, 2, 4 ] ]