## Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. ## SPDX-License-Identifier: MIT-0 AWSTemplateFormatVersion: '2010-09-09' Description: 'Cloudformation Template to create a VPC with 2 public subnets in 2 AZs needed for Metrics & Analytics Solution.' Metadata: 'AWS::CloudFormation::Interface': ParameterGroups: - Label: default: 'VPC Parameters' Parameters: - ClassB ParameterLabels: ClassB: default: ClassB 2nd Octet Parameters: ClassB: Description: 'Specify the 2nd Octet of IPv4 CIDR block for the VPC (10.XXX.0.0/16) in the range [0-255]' Type: Number Default: 0 ConstraintDescription: 'Must be in the range [0-255]' MinValue: 0 MaxValue: 255 Resources: VPC: Type: 'AWS::EC2::VPC' Properties: CidrBlock: !Sub '10.${ClassB}.0.0/16' EnableDnsSupport: true EnableDnsHostnames: true InstanceTenancy: default Tags: - Key: Name Value: !Sub '${AWS::StackName}-VPC' InternetGateway: Type: 'AWS::EC2::InternetGateway' Properties: Tags: - Key: Name Value: !Sub '10.${ClassB}.0.0/16' VPCGatewayAttachment: Type: 'AWS::EC2::VPCGatewayAttachment' Properties: VpcId: !Ref VPC InternetGatewayId: !Ref InternetGateway NATEIPA: DependsOn: VPCGatewayAttachment Type: AWS::EC2::EIP Properties: Domain: vpc NATEIPB: DependsOn: VPCGatewayAttachment Type: AWS::EC2::EIP Properties: Domain: vpc SubnetAPublic: Type: 'AWS::EC2::Subnet' Properties: AvailabilityZone: !Select [0, !GetAZs ''] CidrBlock: !Sub '10.${ClassB}.0.0/20' MapPublicIpOnLaunch: true VpcId: !Ref VPC Tags: - Key: Name Value: !Join - '_' - - 'Metrics-Analytics' - !Select [0, !GetAZs ''] - 'Public' - Key: Reach Value: public SubnetBPublic: Type: 'AWS::EC2::Subnet' Properties: AvailabilityZone: !Select [1, !GetAZs ''] CidrBlock: !Sub '10.${ClassB}.16.0/20' MapPublicIpOnLaunch: true VpcId: !Ref VPC Tags: - Key: Name Value: !Join - '_' - - 'Metrics-Analytics' - !Select [1, !GetAZs ''] - 'Public' - Key: Reach Value: public RouteTablePublic: Type: 'AWS::EC2::RouteTable' Properties: VpcId: !Ref VPC Tags: - Key: Name Value: !Join - '_' - - !Sub '10.${ClassB}.0.0/16' - 'Public' RouteTableAssociationAPublic: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: SubnetId: !Ref SubnetAPublic RouteTableId: !Ref RouteTablePublic RouteTableAssociationBPublic: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: SubnetId: !Ref SubnetBPublic RouteTableId: !Ref RouteTablePublic RouteTablePublicInternetRoute: Type: 'AWS::EC2::Route' DependsOn: VPCGatewayAttachment Properties: RouteTableId: !Ref RouteTablePublic DestinationCidrBlock: '0.0.0.0/0' GatewayId: !Ref InternetGateway NetworkAclPublic: Type: 'AWS::EC2::NetworkAcl' Properties: VpcId: !Ref VPC Tags: - Key: Name Value: !Join - '_' - - !Sub '10.${ClassB}.0.0/16' - 'NACL' - 'Public' SubnetNetworkAclAssociationAPublic: Type: 'AWS::EC2::SubnetNetworkAclAssociation' Properties: SubnetId: !Ref SubnetAPublic NetworkAclId: !Ref NetworkAclPublic SubnetNetworkAclAssociationBPublic: Type: 'AWS::EC2::SubnetNetworkAclAssociation' Properties: SubnetId: !Ref SubnetBPublic NetworkAclId: !Ref NetworkAclPublic NetworkAclEntryInPublicAllowAll: Type: 'AWS::EC2::NetworkAclEntry' Properties: NetworkAclId: !Ref NetworkAclPublic RuleNumber: 99 Protocol: -1 RuleAction: allow Egress: false CidrBlock: '0.0.0.0/0' NetworkAclEntryOutPublicAllowAll: Type: 'AWS::EC2::NetworkAclEntry' Properties: NetworkAclId: !Ref NetworkAclPublic RuleNumber: 99 Protocol: -1 RuleAction: allow Egress: true CidrBlock: '0.0.0.0/0' Outputs: TemplateID: Description: 'Template ID' Value: 'VPC-3AZs' StackName: Description: 'Stack name' Value: !Sub '${AWS::StackName}' VPC: Description: 'VPC' Value: !Ref VPC Export: Name: !Sub '${AWS::StackName}-VPC' ClassB: Description: 'Class B' Value: !Ref ClassB Export: Name: !Sub '${AWS::StackName}-ClassB' CidrBlock: Description: 'The set of IP addresses for the VPC' Value: !GetAtt 'VPC.CidrBlock' Export: Name: !Sub '${AWS::StackName}-CidrBlock' AZs: Description: 'AZs' Value: 2 Export: Name: !Sub '${AWS::StackName}-AZs' AZA: Description: 'AZ of A' Value: !Select [0, !GetAZs ''] Export: Name: !Sub '${AWS::StackName}-AZA' AZB: Description: 'AZ of B' Value: !Select [1, !GetAZs ''] Export: Name: !Sub '${AWS::StackName}-AZB' SubnetsPublic: Description: 'Subnets public' Value: !Join [',', [!Ref SubnetAPublic, !Ref SubnetBPublic]] Export: Name: !Sub '${AWS::StackName}-SubnetsPublic' RouteTablesPublic: Description: 'Route tables public' Value: !Ref RouteTablePublic Export: Name: !Sub '${AWS::StackName}-RouteTablePublic' SubnetAPublic: Description: 'Subnet A public' Value: !Ref SubnetAPublic Export: Name: !Sub '${AWS::StackName}-SubnetAPublic' SubnetBPublic: Description: 'Subnet B public' Value: !Ref SubnetBPublic Export: Name: !Sub '${AWS::StackName}-SubnetBPublic'