Что такое provider в Terraform
Provider, это плагин-посредник между Terraform и облаком. AWS Provider знает, как разговаривать с AWS API. Google Cloud Provider, с GCP. Есть провайдеры для GitHub (управлять репозиториями), Cloudflare (DNS), даже для домашнего роутера.
Каждому провайдеру нужна конфигурация: куда обращаться, с какими ключами, в какой регион. Это и делает блок provider.
Минимальный пример
terraform { required_providers { aws = {source = "hashicorp/aws"
version = "~> 5.60"
}
}
}
provider "aws" {region = "us-east-1"
}
Тут два блока:
terraform { required_providers { ... } }, мета-блок. Говорит «нужен AWS-провайдер версии 5.60 или выше в рамках мажорной 5». Это читаетterraform init, чтобы знать что качать. См. tf-init.provider "aws", настройка скачанного плагина. Здесь, только регион.
AWS credentials в этом примере не указаны. Terraform возьмёт их из стандартных мест (env vars, ~/.aws/credentials). См. aws-provider.
Зачем нужен alias
Иногда одного провайдера мало. Классический случай. Нужно ресурсы в двух разных регионах AWS:
provider "aws" {region = "us-east-1"
}
provider "aws" {alias = "europe"
region = "eu-central-1"
}
# Ресурс в дефолтном регионе us-east-1
resource "aws_s3_bucket" "us" {bucket = "my-us-bucket"
}
# Ресурс в Европе, явная отсылка к alias
resource "aws_s3_bucket" "eu" {provider = aws.europe
bucket = "my-eu-bucket"
}
Один провайдер без alias, «дефолтный». Любой ресурс без указания provider = идёт в него. Все остальные, через aws.имя_alias'а.
default_tags, пишите так
AWS-провайдер умеет автоматически клеить теги на все ресурсы:
provider "aws" {region = "us-east-1"
default_tags { tags = {Project = "my-project"
Environment = "dev"
ManagedBy = "terraform"
}
}
}
Теперь каждый созданный ресурс получит эти теги без вашего участия. Это спасает деньги (теги нужны для биллинг-аналитики), упрощает уборку (aws s3api list-buckets --query ... --tag-key Environment Value dev), и помогает FinOps.
Если у конкретного ресурса есть свой tags = {...}, они смержатся с default_tags. Свои перевесят default_tags при совпадении ключа.
Version constraints
В required_providers версию можно указать по-разному:
| Запись | Что значит |
|---|---|
"5.60.0" | Ровно 5.60.0, никаких отклонений. |
"= 5.60.0" | То же самое явно. |
">= 5.60.0" | Не ниже 5.60.0. Опасно, может потянуть несовместимую 6.x. |
"~> 5.60" | 5.60.x, 5.61.x, ... Но не 6.x. Pessimistic, безопасный default. |
"~> 5.60.0" | Только 5.60.x. Очень строго. |
">= 5.60, < 6.0" | Эквивалент ~> 5.60, явно. |
Стандарт в нормальных проектах, ~> X.Y. Это автоматические минорные обновления (баг-фиксы, новые ресурсы), но без рисков мажора. См. tf-version-constraints.
Подводные камни
-
Одинаковый
provider "aws" {}дважды без alias, ошибка. Можно либо один без alias, либо несколько с разными alias. -
required_providersобязателен. Если он отсутствует, Terraform не знает что качать вinit. Раньше работало по умолчанию черезhashicorp/aws, теперь это deprecated. -
providerблок может быть пустым:provider "aws" {}, валидно, если все настройки берутся из env/файлов credentials. -
Endpoints (см. localstack-provider) надо указывать осторожно, в проде они должны исчезнуть, иначе можете случайно отправить запрос в неправильный кластер.
-
Не коммитьте credentials в блок provider. Никогда не пишите
access_key = "AKIA..."в HCL. Используйте env vars или роли IAM. Единственное исключение: захардкоженные"test"для LocalStack в учебных задачах.