Существует множество вариантов инфраструктуры на выбор при построении инфраструктуры приложений. В этом случае я выберу облачную инфраструктуру и буду использовать AWS в качестве облачного провайдера. Этот выбор поможет мне получить практический опыт, поскольку я работаю над получением сертификата AWS.

Существует несколько вариантов обучения использованию AWS для размещения инфраструктуры, включая Kubernetes, контейнеры и PaaS. Однако я начну с основ: размещение приложения на машинах AWS EC2 с балансировщиком нагрузки и автоматическим масштабированием.

Чтобы получить еще больше опыта работы с сервисами AWS, мы будем использовать AWS CloudFormation для развертывания нашей инфраструктуры в виде кода.

Этот документ не предназначен для использования в качестве руководства по синтаксису шаблонов CloudFormation. Если вы ищете такого рода информацию, есть несколько доступных ресурсов.

Чтобы начать разработку нашей инфраструктуры, мы начнем с сетевой стороны, поскольку каждому экземпляру EC2 потребуется существующая подсеть.

Сначала мы создадим основу шаблона CloudFormation.

AWSTemplateFormatVersion: "2010-09-09"
Description: networking for the file manager application
Parameters:
  VpcCidrRange:
    Type: String
  SubnetAvailabilityZoneA:
    Type: String
  SubnetCidrRangeA:
    Type: String
  SubnetAvailabilityZoneB:
    Type: String
  SubnetCidrRangeB:
    Type: String

В этом разделе мы определяем основной диапазон VPC CIDR в качестве параметра. Цель состоит в том, чтобы определить все динамические значения шаблона в качестве параметров, чтобы нам не нужно было изменять шаблон для настройки нашей конфигурации.

Далее мы определяем шаблон VPC в списке ресурсов.

FileManagerVpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCidrRange
FileManagerSubnetA:
  Type: AWS::EC2::Subnet
  Properties:
    VpcId: !Ref FileManagerVpc
    CidrBlock: !Ref SubnetCidrRangeA
    AvailabilityZone: !Ref SubnetAvailabilityZoneA
FileManagerSubnetB:
  Type: AWS::EC2::Subnet
  Properties:
    VpcId: !Ref FileManagerVpc
    CidrBlock: !Ref SubnetCidrRangeB
    AvailabilityZone: !Ref SubnetAvailabilityZoneB

Практически невозможно запомнить все свойства каждого шаблона, поэтому вам придется часто обращаться к документации AWS. К счастью, у AWS очень хорошая документация.

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html

В данном случае у нас есть один VPC и две подсети. Это необходимо, потому что балансировщик нагрузки, который мы создадим позже, требует как минимум двух зон доступности для обеспечения максимальной отказоустойчивости. Следующим шагом является создание интернет-шлюза и подключение его к VPC.

Internetgateway:
    Type: AWS::EC2::InternetGateway
InternetGatewayAttachment:
  Type: AWS::EC2::VPCGatewayAttachment
  Properties:
    VpcId: !Ref FileManagerVpc
    InternetGatewayId: !Ref Internetgateway

InternetGatewayAttachment отвечает за подключение интернет-шлюза к VPC. Чтобы направить трафик через интернет-шлюз, создайте таблицу маршрутов в облаке VPC и назначьте ее каждой подсети. Когда вы назначаете таблицу маршрутов, которая перенаправляет весь трафик через интернет-шлюз в подсеть, эта подсеть становится общедоступной.

RouteTableA:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref FileManagerVpc
SubnetARoute:
  Type: AWS::EC2::Route
  Properties:
    RouteTableId: !Ref RouteTableA
    GatewayId: !Ref Internetgateway
    DestinationCidrBlock: 0.0.0.0/0
SubnetAAssociationRouteTable:
  Type: AWS::EC2::SubnetRouteTableAssociation
  Properties:
    RouteTableId: !Ref RouteTableA
    SubnetId: !Ref FileManagerSubnetA

Мы должны сделать то же самое для обеих подсетей. Последним шагом будет предоставление сгенерированных подсетей в качестве выходных данных шаблона.

Outputs:
  subnetA:
    Description: load balancer subnet A
    Value: !Ref FileManagerSubnetA
    Export:
      Name: subnetA
  subnetB:
    Description: load balancer subnet B
    Value: !Ref FileManagerSubnetB
    Export:
      Name: subnetB
  mainvpc:
    Description: vpcfor file manager application
    Value: !Ref FileManagerVpc
    Export:
      Name: mainvpc

Мы будем использовать эти значения в следующем шаблоне для создания экземпляров EC2. Теперь, когда мы завершили шаблон, давайте начнем определять переменные. Для этого создайте файл JSON в следующем формате:

[
    {
        "ParameterKey": "VpcCidrRange",
        "ParameterValue": "10.0.0.0/16"
    },
    {
      "ParameterKey": "SubnetAvailabilityZoneA",
      "ParameterValue": "us-east-1a"
    },
    {
      "ParameterKey": "SubnetCidrRangeA",
      "ParameterValue": "10.0.1.0/24"
    },
    {
      "ParameterKey": "SubnetAvailabilityZoneB",
      "ParameterValue": "us-east-1b"
    },
    {
      "ParameterKey": "SubnetCidrRangeB",
      "ParameterValue": "10.0.2.0/24"
    }
]

Чтобы загрузить шаблон в AWS, мы будем использовать интерфейс командной строки AWS.

aws cloudformation create-stack --template-body file://file-manager-vpc.yaml --parameters file://vpc-parameters.json --stack-name file-manager-vpc

Если вы используете VSCode, вы можете проверить состояние своих стеков с помощью расширения AWS.