Перейти к основному содержимому

Terraform — практический путь

Разработчику Инженеру
Дальше по курсу

Теория state и модулей — в Terraform и модулях.


Terraform — практический путь

Эта статья проводит через минимальный, но реалистичный стек на AWS: одна ВМ → веб-сервер → несколько инстансов за Application Load Balancer (ALB). Цель — почувствовать цикл init → plan → apply → destroy, прежде чем углубляться в state и модули.


Подготовка

  • Учётная запись AWS и IAM-пользователь с правами EC2, VPC, ELB (для учёбы — ограниченная policy).
  • Установленный Terraform CLI в PATH.
  • Credentials через aws configure или переменные AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY.
mkdir terraform-demo && cd terraform-demo

Шаг 1 — один EC2

main.tf:

terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}

provider "aws" {
region = "eu-central-1"
}

resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0" # замените на актуальный Amazon Linux в вашем регионе
instance_type = "t3.micro"

tags = {
Name = "terraform-demo-web"
}
}
terraform init # скачивает провайдер aws
terraform validate
terraform plan # + create aws_instance.web
terraform apply # подтверждение yes
terraform show # атрибуты созданного ресурса

Разбор:

  • terraform init — обязателен после clone и при смене required_providers.
  • plan показывает + create без изменений в облаке.
  • AMI региональны — для prod берите ID из data source aws_ami, а не константу.

Шаг 2 — веб-сервер через user_data

Добавьте user_data — скрипт первого запуска (cloud-init):

resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.micro"

user_data = <<-EOF
#!/bin/bash
yum install -y httpd
systemctl start httpd
echo "Hello from Terraform" > /var/www/html/index.html
EOF

tags = { Name = "terraform-demo-web" }
}

После apply откройте public IP инстанса в браузере (если security group пускает 80/tcp — для учёбы добавьте aws_security_group с ingress на 80).


Шаг 3 — outputs

outputs.tf:

output "instance_public_ip" {
value = aws_instance.web.public_ip
description = "Public IP of the web server"
}

terraform apply выведет IP; output можно передать в Ansible или CI через terraform output -json.


Шаг 4 — кластер и ALB (концепция)

Следующий уровень из книги — Auto Scaling Group (ASG) + ALB + несколько подсетей. Логика та же, ресурсов больше:

VPC → public subnets (2 AZ) → ALB → target group → ASG (N × EC2)

Ключевые ресурсы:

  • aws_vpc, aws_subnet — сеть;
  • aws_lb, aws_lb_listener, aws_lb_target_group — балансировщик;
  • aws_autoscaling_group, aws_launch_template — масштабируемый кластер.

Полный стек удобно оформить модулями, чтобы stage и prod не копировали HCL.


Завершение и очистка

terraform destroy # удаляет все ресурсы из state
Стоимость

Даже t3.micro и ALB могут попадать под платные tier AWS. После эксперимента выполняйте destroy или ставьте prevent_destroy на prod-ресурсы.


См. также

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").