На главную

DevOps и серверы

Каркас Terraform

Каркас проекта Terraform: фиксированные версии, переменные с проверкой, хранилище состояния, сервер с файрволом у AWS, Hetzner или Yandex Cloud, выходные значения и .gitignore, который не даст закоммитить состояние.

Проект

dev, stage или prod

Состояние Terraform содержит все значения, включая пароли и ключи. Его нельзя держать в git — поэтому в наборе сразу лежит .gitignore, а для командной работы состояние переезжает в хранилище с блокировкой.

Файлы

main.tf

data "aws_ami" "ubuntu" {
  most_recent = true
  owners      = ["099720109477"] # Canonical

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"]
  }
}

resource "aws_security_group" "app" {
  name        = "${var.project}-${var.env}"
  description = "Доступ к приложению"

  ingress {
    description = "SSH"
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = var.ssh_cidr
  }

  ingress {
    description = "HTTPS"
    from_port   = 443
    to_port     = 443
    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" "app" {
  ami                    = data.aws_ami.ubuntu.id
  instance_type          = var.instance_type
  vpc_security_group_ids = [aws_security_group.app.id]

  root_block_device {
    volume_size = 20
    encrypted   = true
  }

  tags = {
    Name = "${var.project}-${var.env}"
  }
}

Порядок команд

terraform init
terraform fmt -recursive
terraform validate
terraform plan -out=tfplan
# посмотрели план глазами — и только потом
terraform apply tfplan