Запуск приложения с начальной настройкой

AWSBeginner
Практиковаться сейчас

Введение

Работающий экземпляр полезен только тогда, когда его приложение правильно инициализировано. Вы используете Terraform, чтобы прочитать подготовленный AMI приложения, запустить экземпляр EC2 в предоставленной сети и настроить приложение через User Data.

Вы должны знать переменные и ссылки на ресурсы Terraform, маршрутизацию публичных подсетей, группы безопасности и основы запуска EC2. Эта новая среда предоставляет AMI, пару ключей, сеть и отдельное эталонное приложение. Вы создадите и удалите собственный экземпляр приложения.

Связь с сертификацией

Сертификация Задача экзамена Практика
Cloud Practitioner (CLF-C02) Задача 3.1 Развёртывание инициализированного приложения EC2 через инфраструктуру как код и проверка его развёрнутого состояния с помощью AWS CLI.

Обзор лабораторной работы

Обзор концепции: Terraform читает существующий AMI, создаёт экземпляр EC2 и передаёт User Data, которые меняют ответ приложения.

Чтение AMI и запуск приложения

На этом шаге вы свяжете подготовленный AMI, сетевые входные значения и User Data с ресурсом EC2 в Terraform, а затем проверите ответ инициализированного приложения.

Откройте Terminal и AWS View. Эталонный сервер уже работает. Сеть приложения готова, но application-server пока нет. Эта лабораторная работа не использует VM или ресурсы предыдущей работы.

Перейдите в рабочий каталог и изучите подготовленные входные значения:

cd /home/labex/project/application-launch
cat terraform.tfvars.json

Эти значения определяют предоставленные AMI, подсеть и группу безопасности. Сеть уже назначает публичные IP при запуске, имеет маршрут в интернет и разрешает клиенту User доступ на порт приложения 8081. Terraform подготовлен для среды курса; личные учётные данные не нужны.

Найдите предоставленный образ приложения независимым запросом к AWS. AMI описывает образ, используемый при создании экземпляра; чтение существующего AMI не создаёт новый образ.

aws ec2 \
  describe-images \
  --filters Name=name,Values=report-server-ubuntu-2204 \
  --query 'Images[].{Image:ImageId,Name:Name,Architecture:Architecture}'

Имя — report-server-ubuntu-2204, архитектура — x86_64, а идентификатор совпадает с входным значением ami_id. Источник данных Terraform читает существующий объект; ресурс управляет жизненным циклом объекта. Вы прочитаете этот AMI с помощью data.aws_ami.application, затем создадите экземпляр с помощью aws_instance.application.

Создайте application.tf. Внешний heredoc с разделителем в кавычках записывает HCL без подстановок оболочки. Внутри HCL ${...} подставляет результат выражения Terraform, а jsonencode преобразует сообщение в корректный JSON. Внутренний heredoc CONFIG с разделителем в кавычках записывает этот JSON в конфигурацию подготовленного приложения, когда User Data выполняются в новой гостевой системе.

cat > application.tf <<'HCL'
data "aws_ami" "application" {
  most_recent = true
  filter {
    name   = "image-id"
    values = [var.ami_id]
  }
}

resource "aws_instance" "application" {
  ami                    = data.aws_ami.application.id
  instance_type          = "t3.micro"
  key_name               = "report-key"
  subnet_id              = var.subnet_id
  vpc_security_group_ids = [var.security_group_id]

  user_data_replace_on_change = true
  user_data = <<-SCRIPT
    #!/bin/bash
    set -eu
    cat > /etc/report-app/config.json <<'CONFIG'
    ${jsonencode({ message = var.message })}
    CONFIG
  SCRIPT

  tags = {
    Name = "application-server"
  }
}

output "instance_id" {
  value = aws_instance.application.id
}

output "image_id" {
  value = data.aws_ami.application.id
}
HCL

Экземпляр ссылается на источник данных AMI, а не на скопированный идентификатор образа. Предоставленные входные значения подсети и группы подключают его к подготовленной сети. User Data выполняются при первой загрузке для настройки приложения; это не команда интерактивного входа. Входное значение message по умолчанию — Terraform report application. user_data_replace_on_change делает последующие изменения стартовой конфигурации явной заменой экземпляра; это поведение выпуска рассматривается в одной из следующих лабораторных работ.

Инициализируйте, отформатируйте и проверьте конфигурацию:

terraform init
terraform fmt
terraform validate

Если init сообщает Incomplete lock file information for providers, речь идёт о контрольных суммах для других платформ. Эта подготовленная VM использует linux_amd64; продолжайте после успешного завершения инициализации и валидации.

Изучите план. Он читает предоставленный AMI и предлагает создать один экземпляр EC2. Он не должен заменять эталонный сервер или создавать новый AMI.

terraform plan

Примените изменения и введите yes в ответ на запрос:

terraform apply

Сохраните и выведите полученные идентификаторы экземпляра и образа:

INSTANCE_ID=$(terraform output -raw instance_id)
echo "$INSTANCE_ID"
IMAGE_ID=$(terraform output -raw image_id)
echo "$IMAGE_ID"

Независимо запросите экземпляр. Сверьте его работающее состояние, образ, подсеть и группу безопасности с подготовленными входными значениями.

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{ID:InstanceId,State:State.Name,Image:ImageId,Subnet:SubnetId,Groups:SecurityGroups[].GroupId,PublicIP:PublicIpAddress}'

В AWS View выберите application-server, User · 198.51.100.10 и Application · 8081, затем нажмите Send request. Ожидайте Connected · 200 и Terraform report application. Фактический ответ приложения показывает, что стартовая конфигурация дошла до рабочей нагрузки; одного running для подтверждения этого результата недостаточно.

Инициализированное приложение отвечает через подготовленную сеть.

Пример контрольной точки: AWS View показывает работающее приложение и его фактическое сообщение после инициализации. Идентификаторы ресурсов и адреса различаются в каждой VM.

Изучите сопоставление Terraform и подтвердите согласованность:

terraform state list
terraform plan

Состояние содержит источник данных AMI и ресурс экземпляра; план сообщает No changes.

Удаление экземпляра с сохранением предоставленной инфраструктуры

На этом шаге вы удалите только экземпляр приложения под управлением Terraform, сохранив его исходный образ, подготовленную сеть и эталонное приложение.

Источник данных не владеет образом, который читает. VPC, подсеть, маршрут, группа безопасности и пара ключей также предоставлены вне этого состояния. Изучите область удаления перед её одобрением:

terraform plan -destroy

Ожидайте удаление одного управляемого экземпляра. Затем выполните удаление и введите yes:

terraform destroy

Запросите тот же идентификатор экземпляра. Его состояние должно быть terminated; неудачный запрос не доказывает завершение работы экземпляра.

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{ID:InstanceId,State:State.Name}'

Подготовленный образ должен по-прежнему существовать с исходным идентификатором:

aws ec2 \
  describe-images \
  --image-ids "$IMAGE_ID" \
  --query 'Images[].{Image:ImageId,Name:Name}'

Проверьте оставшееся состояние:

terraform state list

Управляемого ресурса приложения быть не должно. В AWS View завершённый экземпляр больше нельзя выбрать как работающую цель. Выберите reference-server, источник User и порт 8081 и отправьте запрос. Ответ по-прежнему должен быть Connected · 200 с Reference application.

Сохраните файлы HCL для изучения. Сохранённая конфигурация предложит новый экземпляр при последующем обычном планировании; это не означает, что операция destroy завершилась неудачно.

Резюме

Вы разобрались в различии между источником данных AMI и ресурсом EC2, подключили предоставленные сетевые входные значения, инициализировали приложение через User Data и проверили его фактический ответ. Вы подтвердили план без изменений и удалили только управляемый экземпляр, сохранив образ, сеть и эталонное приложение.