Существует множество вариантов инфраструктуры на выбор при построении инфраструктуры приложений. В этом случае я выберу облачную инфраструктуру и буду использовать 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.