Короткий ответ
provider подключает Terraform к конкретному API (облако, SaaS), resource описывает управляемый объект инфраструктуры, variable параметризует конфигурацию, output возвращает значения после apply, а data source читает уже существующие данные без управления ими.
Как это работает подробнее
каждый блок — декларативная единица: provider задаёт эндпоинт и учётные данные, resource маппится на конкретный API-объект и хранится в state, data source выполняет "только чтение" (например, узнать id текущего VPC), variable и output формируют интерфейс конфигурации для передачи значений снаружи и наружу.
Пример кода
main.tf
provider "aws" {
region = "eu-west-1"
}
data "aws_vpc" "default" {
default = true
}
resource "aws_subnet" "app" {
vpc_id = data.aws_vpc.default.id
cidr_block = "10.0.1.0/24"
}
output "subnet_id" {
value = aws_subnet.app.id
}Что использовать на практике
- Практика. provider обычно настраивается один раз на корень конфигурации; resource-блоки группируют по файлам (main.tf, network.tf); data source удобен, когда ресурс создан вне Terraform (например, существующий VPC, созданный другой командой); output используют для передачи значений между модулями или для вывода в CI/CD.
Подводные камни
- Ошибка. пытаться "управлять" ресурсом через data source (он read-only и не создаёт/не меняет объект); забывать объявить provider с нужной версией, из-за чего в команде у разных людей применяются разные версии провайдера с разным поведением.