# Блок provider: кому Terraform будет звонить _Провайдеры · TerraformLab Knowledge Base_ **TL;DR:** Блок provider настраивает плагин: в какой регион AWS обращаться, какие endpoints использовать, какие credentials брать. Один такой блок на провайдера в большинстве случаев хватит. ## Что такое provider в Terraform Provider, это плагин-посредник между Terraform и облаком. AWS Provider знает, как разговаривать с AWS API. Google Cloud Provider, с GCP. Есть провайдеры для GitHub (управлять репозиториями), Cloudflare (DNS), даже для домашнего роутера. Каждому провайдеру нужна конфигурация: куда обращаться, с какими ключами, в какой регион. Это и делает блок `provider`. ## Минимальный пример ```hcl 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](/terraform/kb/tf-init.md). - **`provider "aws"`**, настройка скачанного плагина. Здесь, только регион. AWS credentials в этом примере не указаны. Terraform возьмёт их из стандартных мест (env vars, `~/.aws/credentials`). См. [aws-provider](/terraform/kb/aws-provider.md). ## Зачем нужен alias Иногда одного провайдера мало. Классический случай. Нужно ресурсы в двух разных регионах AWS: ```hcl 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-провайдер умеет автоматически клеить теги на все ресурсы: ```hcl 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](/terraform/kb/tf-version-constraints.md). ## Подводные камни - **Одинаковый `provider "aws" {}` дважды без alias, ошибка.** Можно либо один без alias, либо несколько с разными alias. - **`required_providers` обязателен.** Если он отсутствует, Terraform не знает что качать в `init`. Раньше работало по умолчанию через `hashicorp/aws`, теперь это deprecated. - **`provider` блок может быть пустым:** `provider "aws" {}`, валидно, если все настройки берутся из env/файлов credentials. - **Endpoints (см. [localstack-provider](/terraform/kb/localstack-provider.md)) надо указывать осторожно**, в проде они должны исчезнуть, иначе можете случайно отправить запрос в неправильный кластер. - **Не коммитьте credentials в блок provider.** Никогда не пишите `access_key = "AKIA..."` в HCL. Используйте env vars или роли IAM. Единственное исключение: захардкоженные `"test"` для LocalStack в учебных задачах. ## Команды ```bash terraform providers ``` Показывает дерево всех провайдеров, которые использует ваш проект: включая транзитивные из модулей. ```bash terraform providers lock -platform=linux_amd64 -platform=darwin_arm64 ``` Перегенерировать lockfile для нескольких платформ: если ваша команда на разных OS. ## См. также - [terraform init: первая команда в любом проекте](/terraform/kb/tf-init.md) - [AWS Provider: настройки и где Terraform берёт ключи](/terraform/kb/aws-provider.md) - [LocalStack: учебный AWS, который живёт в Docker](/terraform/kb/localstack-provider.md) - [Version constraints в Terraform: required_version и провайдеры](/terraform/kb/tf-version-constraints.md)