Как использовать Cloudformation для создания VPC на AWS
На этой странице
- Предварительные требования
- Что будем делать?
- Создать шаблон
- Создание стека Cloudformation
- Заключение
Используя Cloudformation, мы можем очень легко создавать ресурсы AWS и управлять ими. Cloudformation можно использовать для управления всеми ресурсами AWS с помощью текстового файла. Cloudformation позволяет нам создавать и моделировать нашу инфраструктуру и приложения без необходимости выполнять действия вручную. Cloudformation помогает нам управлять всей нашей инфраструктурой в текстовом файле или шаблоне. Шаблон Cloudformation — это форматированный текстовый файл на языке JSON или YAML, описывающий нашу инфраструктуру AWS.
В этой статье мы рассмотрим Cloudformation для создания VPC с 2 общедоступными и 2 частными подсетями.
Предпосылки
- Аккаунт AWS (создайте, если у вас его нет).
- Основное понимание шаблонов Cloudformation.
Что мы будем делать?
- Войдите в AWS.
- Создайте шаблон.
- Создание стека Cloudformation
Войти в АВС
- Нажмите здесь, чтобы перейти на страницу входа в AWS.
Когда мы перейдем по приведенной выше ссылке, мы увидим следующую веб-страницу, где нам необходимо войти в систему, используя наши данные для входа.
После успешного входа в AWS мы увидим главную консоль со всеми перечисленными ниже службами.
Создать шаблон
Прежде чем мы приступим к созданию стека, у нас должен быть шаблон, который будет использоваться для создания VPC. Скопируйте следующий код и сохраните на локальном компьютере.
---
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"
Создайте стек Cloudformation
Чтобы создать стек Cloudformation, нажмите «Сервисы» в левом верхнем углу и найдите «Cloudformation».
На главной панели нажмите «Создать стек» -> «С новыми ресурсами (стандартными)».
Для стека требуется файл шаблона, который может быть локальным файлом или объектным файлом в корзине S3. Поскольку у нас будет локальный шаблон, нажмите «Шаблон готов» -> «Загрузить файл шаблона», нажмите «Выбрать файл», выберите локальный файл шаблона и продолжайте.
Дайте имя стеку, все остальные параметры оставьте без изменений.
Дайте Теги, если требуется.
Прокрутите страницу вниз и нажмите «Создать стопку».
Это займет некоторое время, подождите до тех пор.
Вы можете увидеть статус или происходящее событие на вкладке «События».
Теперь вы можете перейти в VPC и проверить созданный VPC. Чтобы перейти к VPC, нажмите «Услуги» вверху и левый поиск VPC.
На главной панели вы можете увидеть количество созданных VPC, подсетей, таблиц маршрутизации, интернет-шлюзов и шлюзов Nat.
Вы можете удалить VPC, просто удалив стек, если он вам больше не нужен.
Заключение
В этой статье мы рассмотрели шаги по созданию стека Cloudformation для создания VPC с 2 общедоступными и 2 частными подсетями.