🏗️ Terraform Language (HCL)
Providers, Resources, Variables, Outputs, Locals, Data Sources
📦 Providers
Provider — работает с облаком или сервисом через API. Загружается из Terraform Registry. Блок required_providers. Версионирование провайдера: `~> 5.0` (minor и patch обновления). Несколько экземпляров провайдера — alias.
🏗️ Resources
Компонент инфраструктуры. `resource "TYPE" "NAME"`. TYPE ресурса — в формате `provider_resourcetype`. Мета-аргументы ресурса: meta-arguments: `depends_on`, `count`, `for_each`, `provider`, `lifecycle`.
📝 Variables, Outputs, Locals
Input Variables: `var.name`, блок `variable`, type, default, validation. Output Values: возврат значения в другой модуль/корневой модуль. Locals: кэш выражений внутри модуля (local.name). Приоритет переменных: env var > .tfvars > default.
🔍 Data Sources
Блок `data` — чтение существующей инфраструктуры (не созданной Terraform). Например: получение существующего VPC ID, последнего AMI ID. Обращение через `data.TYPE.NAME.attribute`.
💡 Ключевые моменты
- resource "aws_instance" "web" {} — создание ресурса
- var.name — input variable
- output "ip" { value = ... } — выходное значение
- local.name — кэш выражения
- data "aws_ami" "latest" {} — чтение существующего ресурса
- count и for_each — создание нескольких ресурсов
📋 Пример кода
# Provider konfiguratsiya
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = var.region
}
# Variable
variable "region" {
type = string
description = "AWS Region"
default = "us-east-1"
}
variable "instance_count" {
type = number
default = 2
}
# Resource (with for_each)
resource "aws_instance" "web" {
count = var.instance_count
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
tags = {
Name = "web-${count.index}"
Env = local.env
}
}
# Locals
locals {
env = "production"
}
# Data source
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-*-22.04-amd64-*"]
}
owners = ["099720109477"] # Canonical
}
# Output
output "instance_ips" {
value = aws_instance.web[*].public_ip
}
🎯 Советы для экзамена
- count vs for_each: count — одинаковые ресурсы (индексированные [0],[1]...), for_each — map/set (именованные экземпляры, безопаснее при рефакторинге)
- depends_on — для ручного указания зависимости, когда Terraform не может обнаружить implicit dependency (обычно ref = implicit dependency)
- lifecycle { prevent_destroy = true } — защита production-ресурса от случайного `terraform destroy`
- sensitive = true — для output и variable; маскируется в логах, но хранится в открытом виде в state
- `terraform console` — интерактивная проверка HCL-выражений (например: `toset(["a","b"])`)
⚠️ Частые ошибки
- Считать, что порядок в for_each string set гарантирован — set неупорядочен, лучше использовать map
- Считать, что output с sensitive = true скрыт и в state — в state хранится в виде plain text
- Путать Data source и resource: data = READ ONLY, resource = CREATE/UPDATE/DELETE
🧠 Для запоминания: "VROLED" = Variables (input), Resources, Outputs, Locals, External-data (data sources), Dependencies — основные блоки HCL
Проверьте себя по теме «Terraform Language (HCL)»
Бесплатные интерактивные тесты, пробный экзамен и полные уроки — на платформе CertMaster.
Начать бесплатно →