Поиск по сайту:

Как использовать Cloudformation для создания VPC на AWS


На этой странице

  1. Предварительные требования
  2. Что будем делать?
  3. Создать шаблон
  4. Создание стека Cloudformation
  5. Заключение

Используя Cloudformation, мы можем очень легко создавать ресурсы AWS и управлять ими. Cloudformation можно использовать для управления всеми ресурсами AWS с помощью текстового файла. Cloudformation позволяет нам создавать и моделировать нашу инфраструктуру и приложения без необходимости выполнять действия вручную. Cloudformation помогает нам управлять всей нашей инфраструктурой в текстовом файле или шаблоне. Шаблон Cloudformation — это форматированный текстовый файл на языке JSON или YAML, описывающий нашу инфраструктуру AWS.

В этой статье мы рассмотрим Cloudformation для создания VPC с 2 общедоступными и 2 частными подсетями.

Предпосылки

  1. Аккаунт AWS (создайте, если у вас его нет).
  2. Основное понимание шаблонов Cloudformation.

Что мы будем делать?

  1. Войдите в AWS.
  2. Создайте шаблон.
  3. Создание стека Cloudformation 

Войти в АВС

  1. Нажмите здесь, чтобы перейти на страницу входа в 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 частными подсетями.