Skip to content

Instantly share code, notes, and snippets.

@javigs82
Created October 20, 2019 16:04
Show Gist options
  • Save javigs82/6553bd72284297bfa7d2e2a624d5a2aa to your computer and use it in GitHub Desktop.
Save javigs82/6553bd72284297bfa7d2e2a624d5a2aa to your computer and use it in GitHub Desktop.
---
# Copyright 2018
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
AWSTemplateFormatVersion: '2010-09-09'
Description: 'VPC: public and private subnets in three availability zones, a template'
Metadata:
'AWS::CloudFormation::Interface':
ParameterGroups:
- Label:
default: 'VPC Parameters'
Parameters:
- ClassB
Parameters:
ClassB:
Description: 'Class B of VPC (10.XXX.0.0/16)'
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 '${AWS::StackName}-igw'
VPCGatewayAttachment:
Type: 'AWS::EC2::VPCGatewayAttachment'
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref InternetGateway
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: !Sub '${AWS::StackName}-A-public-sn'
- Key: Reach
Value: public
SubnetAPrivate:
Type: 'AWS::EC2::Subnet'
Properties:
AvailabilityZone: !Select [0, !GetAZs '']
CidrBlock: !Sub '10.${ClassB}.16.0/20'
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-A-private-sn'
- Key: Reach
Value: private
SubnetBPublic:
Type: 'AWS::EC2::Subnet'
Properties:
AvailabilityZone: !Select [1, !GetAZs '']
CidrBlock: !Sub '10.${ClassB}.32.0/20'
MapPublicIpOnLaunch: true
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-B-public-sn'
- Key: Reach
Value: public
SubnetBPrivate:
Type: 'AWS::EC2::Subnet'
Properties:
AvailabilityZone: !Select [1, !GetAZs '']
CidrBlock: !Sub '10.${ClassB}.48.0/20'
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-B-private-sn'
- Key: Reach
Value: private
SubnetCPublic:
Type: 'AWS::EC2::Subnet'
Properties:
AvailabilityZone: !Select [2, !GetAZs '']
CidrBlock: !Sub '10.${ClassB}.64.0/20'
MapPublicIpOnLaunch: true
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-C-public-sn'
- Key: Reach
Value: public
SubnetCPrivate:
Type: 'AWS::EC2::Subnet'
Properties:
AvailabilityZone: !Select [2, !GetAZs '']
CidrBlock: !Sub '10.${ClassB}.80.0/20'
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-C-private-sn'
- Key: Reach
Value: private
RouteTablePublic: # should be RouteTableAPublic, but logical id was not changed for backward compatibility
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-A-public-rt'
RouteTablePrivate: # should be RouteTableAPrivate, but logical id was not changed for backward compatibility
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-A-private-rt'
RouteTableBPublic:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-B-public-rt'
RouteTableBPrivate:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-B-private-rt'
RouteTableCPublic:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-C-public-rt'
RouteTableCPrivate:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-C-private-rt'
RouteTableAssociationAPublic:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId: !Ref SubnetAPublic
RouteTableId: !Ref RouteTablePublic
RouteTableAssociationAPrivate:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId: !Ref SubnetAPrivate
RouteTableId: !Ref RouteTablePrivate
RouteTableAssociationBPublic:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId: !Ref SubnetBPublic
RouteTableId: !Ref RouteTableBPublic
RouteTableAssociationBPrivate:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId: !Ref SubnetBPrivate
RouteTableId: !Ref RouteTableBPrivate
RouteTableAssociationCPublic:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId: !Ref SubnetCPublic
RouteTableId: !Ref RouteTableCPublic
RouteTableAssociationCPrivate:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId: !Ref SubnetCPrivate
RouteTableId: !Ref RouteTableCPrivate
RouteTablePublicInternetRoute: # should be RouteTablePublicAInternetRoute, but logical id was not changed for backward compatibility
Type: 'AWS::EC2::Route'
DependsOn: VPCGatewayAttachment
Properties:
RouteTableId: !Ref RouteTablePublic
DestinationCidrBlock: '0.0.0.0/0'
GatewayId: !Ref InternetGateway
RouteTablePublicBInternetRoute:
Type: 'AWS::EC2::Route'
DependsOn: VPCGatewayAttachment
Properties:
RouteTableId: !Ref RouteTableBPublic
DestinationCidrBlock: '0.0.0.0/0'
GatewayId: !Ref InternetGateway
RouteTablePublicCInternetRoute:
Type: 'AWS::EC2::Route'
DependsOn: VPCGatewayAttachment
Properties:
RouteTableId: !Ref RouteTableCPublic
DestinationCidrBlock: '0.0.0.0/0'
GatewayId: !Ref InternetGateway
NetworkAclPublic:
Type: 'AWS::EC2::NetworkAcl'
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-public-acl'
NetworkAclPrivate:
Type: 'AWS::EC2::NetworkAcl'
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-private-acl'
SubnetNetworkAclAssociationAPublic:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId: !Ref SubnetAPublic
NetworkAclId: !Ref NetworkAclPublic
SubnetNetworkAclAssociationAPrivate:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId: !Ref SubnetAPrivate
NetworkAclId: !Ref NetworkAclPrivate
SubnetNetworkAclAssociationBPublic:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId: !Ref SubnetBPublic
NetworkAclId: !Ref NetworkAclPublic
SubnetNetworkAclAssociationBPrivate:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId: !Ref SubnetBPrivate
NetworkAclId: !Ref NetworkAclPrivate
SubnetNetworkAclAssociationCPublic:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId: !Ref SubnetCPublic
NetworkAclId: !Ref NetworkAclPublic
SubnetNetworkAclAssociationCPrivate:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId: !Ref SubnetCPrivate
NetworkAclId: !Ref NetworkAclPrivate
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'
NetworkAclEntryInPrivateAllowVPC:
Type: 'AWS::EC2::NetworkAclEntry'
Properties:
NetworkAclId: !Ref NetworkAclPrivate
RuleNumber: 99
Protocol: -1
RuleAction: allow
Egress: false
CidrBlock: '0.0.0.0/0'
NetworkAclEntryOutPrivateAllowVPC:
Type: 'AWS::EC2::NetworkAclEntry'
Properties:
NetworkAclId: !Ref NetworkAclPrivate
RuleNumber: 99
Protocol: -1
RuleAction: allow
Egress: true
CidrBlock: '0.0.0.0/0'
Outputs:
TemplateID:
Description: 'javigs82.me template id.'
Value: 'networking-3azs'
TemplateVersion:
Description: 'javigs82.me template version.'
Value: '__VERSION__'
StackName:
Description: 'Stack name.'
Value: !Sub '${AWS::StackName}'
AZs:
Description: 'AZs'
Value: 3
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'
AZC:
Description: 'AZ of C'
Value: !Select [2, !GetAZs '']
Export:
Name: !Sub '${AWS::StackName}-AZC'
CidrBlock:
Description: 'The set of IP addresses for the VPC.'
Value: !GetAtt 'VPC.CidrBlock'
Export:
Name: !Sub '${AWS::StackName}-CidrBlock'
VPC:
Description: 'VPC.'
Value: !Ref VPC
Export:
Name: !Sub '${AWS::StackName}-VPC'
SubnetsPublic:
Description: 'Subnets public.'
Value: !Join [',', [!Ref SubnetAPublic, !Ref SubnetBPublic, !Ref SubnetCPublic]]
Export:
Name: !Sub '${AWS::StackName}-SubnetsPublic'
SubnetsPrivate:
Description: 'Subnets private.'
Value: !Join [',', [!Ref SubnetAPrivate, !Ref SubnetBPrivate, !Ref SubnetCPrivate]]
Export:
Name: !Sub '${AWS::StackName}-SubnetsPrivate'
RouteTablesPrivate:
Description: 'Route tables private.'
Value: !Join [',', [!Ref RouteTablePrivate, !Ref RouteTableBPrivate, !Ref RouteTableCPrivate]]
Export:
Name: !Sub '${AWS::StackName}-RouteTablesPrivate'
RouteTablesPublic:
Description: 'Route tables public.'
Value: !Join [',', [!Ref RouteTablePublic, !Ref RouteTableBPublic, !Ref RouteTableCPublic]]
Export:
Name: !Sub '${AWS::StackName}-RouteTablesPublic'
SubnetAPublic:
Description: 'Subnet A public.'
Value: !Ref SubnetAPublic
Export:
Name: !Sub '${AWS::StackName}-SubnetAPublic'
RouteTableAPublic:
Description: 'Route table A public.'
Value: !Ref RouteTablePublic
Export:
Name: !Sub '${AWS::StackName}-RouteTableAPublic'
SubnetAPrivate:
Description: 'Subnet A private.'
Value: !Ref SubnetAPrivate
Export:
Name: !Sub '${AWS::StackName}-SubnetAPrivate'
RouteTableAPrivate:
Description: 'Route table A private.'
Value: !Ref RouteTablePrivate
Export:
Name: !Sub '${AWS::StackName}-RouteTableAPrivate'
SubnetBPublic:
Description: 'Subnet B public.'
Value: !Ref SubnetBPublic
Export:
Name: !Sub '${AWS::StackName}-SubnetBPublic'
RouteTableBPublic:
Description: 'Route table B public.'
Value: !Ref RouteTableBPublic
Export:
Name: !Sub '${AWS::StackName}-RouteTableBPublic'
SubnetBPrivate:
Description: 'Subnet B private.'
Value: !Ref SubnetBPrivate
Export:
Name: !Sub '${AWS::StackName}-SubnetBPrivate'
RouteTableBPrivate:
Description: 'Route table B private.'
Value: !Ref RouteTableBPrivate
Export:
Name: !Sub '${AWS::StackName}-RouteTableBPrivate'
SubnetCPublic:
Description: 'Subnet C public.'
Value: !Ref SubnetCPublic
Export:
Name: !Sub '${AWS::StackName}-SubnetCPublic'
RouteTableCPublic:
Description: 'Route table C public.'
Value: !Ref RouteTableCPublic
Export:
Name: !Sub '${AWS::StackName}-RouteTableCPublic'
SubnetCPrivate:
Description: 'Subnet C private.'
Value: !Ref SubnetCPrivate
Export:
Name: !Sub '${AWS::StackName}-SubnetCPrivate'
RouteTableCPrivate:
Description: 'Route table C private.'
Value: !Ref RouteTableCPrivate
Export:
Name: !Sub '${AWS::StackName}-RouteTableCPrivate'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment