0Pricing
DevOps Bootcamp · Урок

Подготовка экземпляров EC2

Напишите конфигурации Terraform для развёртывания и управления виртуальными машинами Amazon EC2, включая настройки сети и групп безопасности.

«Подготовка экземпляров EC2» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.

Экземпляры EC2 с Terraform

Добро пожаловать! На этом уроке вы научитесь создавать и управлять виртуальными машинами Amazon EC2 с помощью Terraform.

EC2 (Elastic Compute Cloud) предоставляет масштабируемые виртуальные серверы в облаке. Использование инфраструктуры как кода (IaC) с Terraform для EC2 позволяет описывать серверы в коде и обеспечивать единообразное, воспроизводимое развертывание.

Определение экземпляра EC2

Основным ресурсом для экземпляра EC2 в Terraform является aws_instance. Необходимо указать как минимум два ключевых аргумента:

  • ami: образ Amazon Machine Image (OS, программное обеспечение), который будет использоваться.
  • instance_type: конфигурация оборудования (например, t2.micro для экземпляров, подходящих для бесплатного уровня).

Базовый блок aws_instance выглядит так:

resource "aws_instance" "web_server" {
  ami           = "ami-053b04dcd42d5397e" # Example: Amazon Linux 2 in us-east-1
  instance_type = "t2.micro"

  tags = {
    Name = "MyWebServer"
  }
}

Запуск первого EC2

Объединим все элементы и запустим простой экземпляр EC2. Эта конфигурация определяет провайдера AWS и экземпляр EC2.

Для развертывания сохраните конфигурацию в файл .tf, затем выполните в терминале команды terraform init, terraform plan и terraform apply.

provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "web_server" {
  ami           = "ami-053b04dcd42d5397e" # Amazon Linux 2 AMI for us-east-1
  instance_type = "t2.micro"

  tags = {
    Name = "MyBasicWebServer"
  }
}

Защита EC2: группы безопасности

Группы безопасности работают как виртуальные брандмауэры для экземпляров EC2. Они управляют тем, какой входящий (ingress) и исходящий (egress) сетевой трафик может достигать экземпляра или покидать его.

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

Создание группы безопасности

Группа безопасности определяется с помощью ресурса aws_security_group. Мы добавим правило ingress, разрешающее доступ по SSH (порт 22) отовсюду (0.0.0.0/0).

Для группы безопасности необходимо указать существующий vpc_id, в котором она будет размещена.

resource "aws_security_group" "allow_ssh" {
  name        = "allow_ssh_traffic"
  description = "Allow SSH inbound traffic"
  vpc_id      = "vpc-0123456789abcdef0" # IMPORTANT: Replace with YOUR VPC ID!

  ingress {
    description = "SSH from anywhere"
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1" # All protocols
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "allow_ssh_sg"
  }
}

Подключение группы безопасности к EC2

Теперь обновим наш aws_instance, чтобы использовать эту новую группу безопасности. Мы ссылаемся на идентификатор группы безопасности с помощью aws_security_group.allow_ssh.id.

Не забудьте заменить vpc_id в группе безопасности на фактический идентификатор VPC из вашей учетной записи AWS, чтобы конфигурацию можно было выполнить.

provider "aws" {
  region = "us-east-1"
}

resource "aws_security_group" "allow_ssh" {
  name        = "allow_ssh_traffic_example"
  description = "Allow SSH inbound traffic"
  vpc_id      = "vpc-0123456789abcdef0" # IMPORTANT: Replace with YOUR VPC ID!

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_instance" "web_server" {
  ami             = "ami-053b04dcd42d5397e"
  instance_type   = "t2.micro"
  vpc_security_group_ids = [
    aws_security_group.allow_ssh.id
  ]

  tags = {
    Name = "WebServerWithSSH"
  }
}

Сеть EC2: VPC и подсети

Каждый экземпляр EC2 находится внутри виртуального частного облака (VPC) и определенной подсети внутри этого VPC. VPC — это изолированная виртуальная сеть, а подсети — логические части VPC (например, общедоступные или частные).

По умолчанию EC2 может запускаться в VPC или подсети по умолчанию. Для большего контроля и упорядоченности часто указывают, какую подсеть должен использовать экземпляр.

Создание базовой сети

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

Эта полная настройка обеспечивает возможность EC2 взаимодействовать с Интернетом.

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "main-vpc-lesson"
  }
}

resource "aws_subnet" "public" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "us-east-1a"
  map_public_ip_on_launch = true # Instances in this subnet get a public IP
  tags = {
    Name = "public-subnet-lesson"
  }
}

resource "aws_internet_gateway" "gw" {
  vpc_id = aws_vpc.main.id
  tags = {
    Name = "main-gw-lesson"
  }
}

resource "aws_route_table" "public_rt" {
  vpc_id = aws_vpc.main.id

  route {
    cidr_block = "0.0.0.0/0" # Traffic to the internet
    gateway_id = aws_internet_gateway.gw.id
  }
  tags = {
    Name = "public-rt-lesson"
  }
}

resource "aws_route_table_association" "public_rt_assoc" {
  subnet_id      = aws_subnet.public.id
  route_table_id = aws_route_table.public_rt.id
}

EC2 в вашей пользовательской сети

Теперь объединим все части: пользовательские VPC, подсеть, группу безопасности и экземпляр EC2. EC2 будет запущен в указанной общедоступной подсети и автоматически получит общедоступный IP-адрес.

Эта полная конфигурация обеспечивает детальный контроль над развертыванием EC2 и делает его доступным по SSH.

provider "aws" {
  region = "us-east-1"
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  tags = { Name = "main-vpc-lesson" }
}

resource "aws_subnet" "public" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "us-east-1a"
  map_public_ip_on_launch = true
  tags = { Name = "public-subnet-lesson" }
}

resource "aws_internet_gateway" "gw" {
  vpc_id = aws_vpc.main.id
  tags = { Name = "main-gw-lesson" }
}

resource "aws_route_table" "public_rt" {
  vpc_id = aws_vpc.main.id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.gw.id
  }
  tags = { Name = "public-rt-lesson" }
}

resource "aws_route_table_association" "public_rt_assoc" {
  subnet_id      = aws_subnet.public.id
  route_table_id = aws_route_table.public_rt.id
}

resource "aws_security_group" "allow_ssh" {
  name        = "allow_ssh_lesson"
  description = "Allow SSH inbound traffic"
  vpc_id      = aws_vpc.main.id
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_instance" "web_server" {
  ami             = "ami-053b04dcd42d5397e"
  instance_type   = "t2.micro"
  subnet_id       = aws_subnet.public.id
  vpc_security_group_ids = [
    aws_security_group.allow_ssh.id
  ]
  associate_public_ip_address = true
  tags = {
    Name = "FullWebServerLesson"
  }
}

Проверка конфигурации EC2

Какие из следующих аргументов необходимы для определения базового ресурса aws_instance в Terraform?

Итоги: EC2 с Terraform

Отличная работа! Вы научились развертывать экземпляры Amazon EC2 с помощью Terraform.

  • Мы определили экземпляры EC2 с помощью ресурса aws_instance.
  • Мы защитили их с помощью aws_security_group, настроив сетевой трафик.
  • Мы настроили простую пользовательскую сеть (VPC, подсеть, интернет-шлюз и таблицу маршрутизации) для размещения EC2.
  • Теперь у Вас есть основа для развертывания виртуальных серверов и управления ими в виде кода!

Часто задаваемые вопросы

Урок «Подготовка экземпляров EC2» бесплатный?

Да — полный текст урока «Подготовка экземпляров EC2» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.

Чему я научусь в уроке «Подготовка экземпляров EC2»?

Напишите конфигурации Terraform для развёртывания и управления виртуальными машинами Amazon EC2, включая настройки сети и групп безопасности. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать DevOps Bootcamp?

Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Подготовка экземпляров EC2»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке DevOps Bootcamp?

Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Настройка поставщика AWS
  2. Подготовка экземпляров EC2
  3. Управление корзинами S3 и IAM
  4. Настройка VPC и сети
← Назад к DevOps Bootcamp