Когда инфраструктура растёт, почти сразу возникает вопрос: как безопасно разделить dev, staging и prod, не копируя один и тот же Terraform-код в три разные папки. Один из базовых инструментов для этого — Terraform Workspaces.
Что такое Terraform Workspace
Workspace в Terraform — это способ использовать одну и ту же конфигурацию, но хранить разные state-файлы для разных окружений.
Проще говоря:
- код инфраструктуры остаётся общим
- состояние ресурсов разделяется по средам
- dev не конфликтует с staging и prod
Это удобно, когда ресурсы отличаются в параметрах, но логика инфраструктуры одинакова.
Как это работает
По умолчанию Terraform работает в workspace default.
Можно создать отдельные рабочие пространства:
devstagingprod
Основные команды:
terraform workspace list— список workspacesterraform workspace new dev— создать новое окружениеterraform workspace select prod— переключитьсяterraform workspace show— показать текущее workspace
Как использовать workspace в коде
Terraform позволяет получить имя текущего окружения через:
terraform.workspace
Пример:
resource "aws_instance" "app" {
instance_type = terraform.workspace == "prod" ? "t3.medium" : "t3.micro"
tags = {
Environment = terraform.workspace
}
}
Так можно:
- менять размеры инстансов
- подставлять разные теги
- переключать настройки сети, БД и лимитов
Плюсы Terraform Workspaces ✅
- меньше дублирования кода
- удобное разделение state
- быстрый запуск одинаковой инфраструктуры для нескольких сред
- подходит для типовых окружений
Ограничения и риски ⚠️
Workspaces — не универсальное решение.
Важно понимать:
- если
prodсильно отличается отdev, конфиг станет перегружен условиями - легко ошибиться и применить изменения не в то окружение
- workspaces не заменяют полноценную стратегию изоляции аккаунтов, VPC и секретов
Для критичных production-сред часто лучше дополнительно разделять:
- cloud-аккаунты
- backend для state
- CI/CD пайплайны
- права доступа
Когда использовать
Workspaces подходят, если:
- инфраструктура между средами почти одинакова
- различия сводятся к переменным и размерам ресурсов
- нужен быстрый и понятный способ разделить dev/staging/prod
Если же среды архитектурно разные, практичнее использовать:
- отдельные директории
- отдельные root modules
- Terragrunt или другую обвязку
Практический совет 💡
Не завязывайте всю логику только на terraform.workspace. Лучше комбинировать его с variables и tfvars, чтобы конфигурация оставалась читаемой и предсказуемой.
Итог
Terraform Workspaces — это простой механизм управления окружениями, который помогает держать единый код и раздельное состояние. Для небольших и средних проектов это удобный способ организовать dev/staging/prod без лишнего дублирования. Для сложной enterprise-инфраструктуры workspaces стоит применять осознанно и в связке с более строгой изоляцией 🔐
📌 Загляните в подборку каналов про IT — там много полезного про Terraform, DevOps, cloud и инфраструктуру.