Что это и в каком виде доступно
Stacks, попытка HashiCorp сделать нативный multi-stack orchestrator, закрыть нишу Terragrunt'а в самом Terraform. Анонс 2024, публичный beta в 2025.
На момент написания: HCP Terraform-only. Open-source CLI с поддержкой Stacks, в работе. Тех, кто на open-source Terraform для них Terragrunt остаётся.
Если ты уже в HCP Terraform / Terraform Cloud, Stacks серьёзно расссматривай для multi-env / multi-region setups.
Концепции
| Термин | Что значит |
|---|---|
| Component | Один Terraform-модуль с своим state'ом. Building block. |
| Stack | Набор components с явными dependencies между ними. |
| Deployment | Inputs для components, разворачивающие конкретный env. |
| Stack definition | *.tfstack.hcl файл, описывающий components. |
| Deployment file | *.tfdeploy.hcl файл, описывающий deployments. |
Минимальная структура
my-stack/
├── components.tfstack.hcl # definition
├── deployments.tfdeploy.hcl # deployments
├── network/ # component 1 (Terraform module)
│ └── main.tf
└── app/ # component 2
└── main.tf
components.tfstack.hcl:
component "network" {source = "./network"
inputs = {cidr_block = var.cidr_block
}
providers = {aws = provider.aws.this
}
}
component "app" {source = "./app"
inputs = {vpc_id = component.network.vpc_id
subnet_ids = component.network.subnet_ids
}
providers = {aws = provider.aws.this
}
}
variable "cidr_block" {type = string
}
required_providers { aws = {source = "hashicorp/aws"
version = "~> 5.60"
}
}
provider "aws" "this" { config {region = var.region
}
}
variable "region" {type = string
}
deployments.tfdeploy.hcl:
deployment "us_east_1_dev" { inputs = {cidr_block = "10.0.0.0/16"
region = "us-east-1"
}
}
deployment "us_east_1_prod" { inputs = {cidr_block = "10.1.0.0/16"
region = "us-east-1"
}
}
deployment "eu_west_1_prod" { inputs = {cidr_block = "10.2.0.0/16"
region = "eu-west-1"
}
}
Три deployments из одной stack-definition. Каждая управляет своими network+app, изолированные state'ы.
Что важно
- Components имеют свои state'ы. Один component = один state. Между component'ами явные cross-stack deps через outputs.
- Deployments, это «инстансы» stack'а. Три deployments = три параллельные инфры.
- Один config, N сред. Нет copy-paste, нет шести
terragrunt.hcl. - HCP оркестрирует apply. Сам понимает граф deps между components, apply'ит в правильном порядке.
Сравнение с Terragrunt
| Stacks | Terragrunt | |
|---|---|---|
| Где живёт | HCP Terraform (Cloud) | OSS, local или CI |
| HCL-диалект | новый (.tfstack.hcl, .tfdeploy.hcl) | свой (.terragrunt.hcl) |
| Cross-stack deps | через component.X.output | через dependency блок |
| Apply orchestration | HCP automatic | Terragrunt run-all |
| State | HCP-managed | любой backend |
| Cost | Платный HCP | Free OSS |
| Maturity | Beta-ish 2025 | Production proven |
Stacks потенциально cleaner. Terragrunt, есть сегодня и работает.
Когда переезжать на Stacks
- Уже на HCP Terraform. Бесплатно интегрируется в workflow.
- Многоокружения, многорегионы. Это его use-case.
- Команда не любит Terragrunt-DSL. Stacks ближе к нативному HCL.
Когда не переезжать:
- На open-source Terraform, пока нет.
- Маленький проект, overkill.
- Используешь Terragrunt и не сломано, не чини.
Подводные камни
-
Двоится HCL-стек.
.tf+.tfstack.hcl+.tfdeploy.hcl, три разных файла-типа для одного проекта. Reviewer и тулчейн должны знать оба. -
HCP-lock-in. Без HCP Stacks не запустишь. Перевозить обратно в open-source, refactor.
-
Изменения схемы. Stacks ещё развиваются; синтаксис может меняться между релизами HCP.
-
CLI парность. HCP-CLI команды для Stacks отличаются от обычного
terraform.tcli stack ...и т.д. Команды учить заново. -
Open-source CLI обещан, но дат нет. Если planning на 6 месяцев вперёд, заложи риск, что в OSS не появится.
-
Не заменяет Terragrunt 1:1. Например, Terragrunt-specific фичи (custom hooks,
before_hook/after_hook) в Stacks нет, orchestration делает HCP.