Как Terraform определяет, на каком сервере или в каком облаке выполнять команды?

«Как Terraform определяет, на каком сервере или в каком облаке выполнять команды?» — вопрос из категории Terraform, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Terraform сам не выполняет команды на серверах. Он взаимодействует с API облачных провайдеров или систем управления через провайдеров (providers). Конфигурация провайдера указывает, где и как создавать ресурсы.

Пример для AWS:

provider "aws" {
  region = "eu-west-1"
  # Аутентификация через переменные окружения AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY
}

resource "aws_instance" "app_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

Как это работает:

  1. Провайдер: Блок provider настраивает клиент для работы с API конкретной платформы (AWS, Azure, GCP, Kubernetes и т.д.).
  2. Аутентификация: Указывается через параметры в конфигурации, переменные окружения, IAM-роли (в облаке) или конфигурационные файлы (например, ~/.aws/credentials).
  3. Состояние (State): Файл terraform.tfstate хранит сопоставление ресурсов в коде с реальными ID объектов в облаке. Terraform использует его для понимания, что нужно создать, обновить или удалить.
  4. Локальное выполнение: Команды terraform apply или plan выполняются на той машине, где запущен Terraform CLI. Они лишь генерируют и отправляют план изменений в API облачного провайдера, который уже выполняет операции на своих серверах.

Для локальных команд: Если используется provisioner local-exec, команды выполняются на машине, где запускается Terraform.