10 промтов для Terraform и IaC: от модулей до multi-cloud
Terraform за последние годы стал стандартом де-факто для управления инфраструктурой как кодом (IaC). По данным опроса HashiCorp 2025 года, более 80% DevOps-инженеров используют Terraform для provisioning облачных ресурсов. Но даже опытные специалисты часто тратят часы на написание конфигураций, отладку state и настройку multi-cloud. Современные языковые модели могут ускорить этот процесс, если правильно формулировать промты. В этой статье — проверенная подборка из 10 промтов для Terraform, разбитая по уровням сложности. Каждый промт сопровождается примером результата и пояснениями.
Базовые промты (уровень: Junior)
1. Создание простого модуля EC2
Задача: Сгенерировать Terraform-модуль для развертывания EC2-инстанса с минимальными параметрами.
Промт:
Создай Terraform-модуль для деплоя EC2-инстанса в AWS. Модуль должен принимать переменные: ami, instance_type, name. Ресурс должен иметь тег Name. Выведи public_ip.
Пример результата:
# modules/ec2/main.tf
resource "aws_instance" "this" {
ami = var.ami
instance_type = var.instance_type
tags = {
Name = var.name
}
}
output "public_ip" {
value = aws_instance.this.public_ip
}
# modules/ec2/variables.tf
variable "ami" {
description = "AMI ID"
type = string
}
variable "instance_type" {
description = "Instance type"
type = string
}
variable "name" {
description = "Name tag"
type = string
}
2. State-бэкап в S3
Задача: Создать конфигурацию backend для хранения state-файла в S3 с DynamoDB-локом.
Промт:
Сгенерируй блок backend для Terraform, который хранит state в S3-бакете 'my-state-bucket' с ключом 'prod/terraform.tfstate' и использует DynamoDB-таблицу 'tf-locks' для блокировок. Регион — us-east-1.
Пример результата:
terraform {
backend "s3" {
bucket = "my-state-bucket"
key = "prod/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "tf-locks"
encrypt = true
}
}
Продвинутые промты (уровень: Middle)
3. Multi-cloud VPC (AWS + GCP)
Задача: Построить VPC в AWS и VPC в GCP с VPN-соединением между ними.
Промт:
Напиши Terraform-конфигурацию, которая создает VPC в AWS (CIDR 10.0.0.0/16) и VPC в GCP (CIDR 10.1.0.0/16), а также VPN-туннель между ними с использованием IPSec. Используй отдельные провайдеры.
Пример результата:
# providers.tf
provider "aws" {
region = "us-west-2"
}
provider "google" {
project = "my-project"
region = "us-central1"
}
# main.tf (фрагмент)
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}
resource "google_compute_network" "main" {
name = "gcp-vpc"
auto_create_subnetworks = false
}
resource "google_compute_subnetwork" "main" {
name = "gcp-subnet"
ip_cidr_range = "10.1.0.0/16"
network = google_compute_network.main.id
}
# Далее — ресурсы VPN-шлюзов и туннелей
Важно: Для полноценной реализации потребуются также ресурсы aws_vpn_gateway, google_compute_vpn_gateway и соответствующие туннели. Полный код приведен в репозитории-примере.
4. Импорт существующей инфраструктуры
Задача: Сгенерировать команды terraform import для переноса существующих ресурсов под управление Terraform.
Промт:
У меня есть AWS security group с ID sg-12345 и S3-бакет 'my-legacy-bucket'. Напиши команды terraform import для этих ресурсов, предполагая, что ресурсы в коде называются 'web_sg' и 'legacy_bucket'.
Пример результата:
terraform import aws_security_group.web_sg sg-12345
terraform import aws_s3_bucket.legacy_bucket my-legacy-bucket
Также полезно добавить блок для генерации конфигурации командой terraform plan -generate-config-out=generated.tf (доступно с Terraform 1.5+).
5. Использование Terraform Cloud в команде
Задача: Настроить удаленное выполнение (remote execution) через Terraform Cloud.
Промт:
Создай конфигурацию Terraform для работы с Terraform Cloud: организация 'my-org', воркспейс 'dev', удаленное выполнение. Добавь переменные окружения для AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY.
Пример результата:
terraform {
cloud {
organization = "my-org"
workspaces {
name = "dev"
}
}
}
# Переменные задаются в UI Terraform Cloud
Экспертные промты (уровень: Senior)
6. Политики Sentinel для compliance
Задача: Написать политику Sentinel, запрещающую создание S3-бакетов без шифрования.
Промт:
Напиши политику Sentinel для Terraform Cloud, которая блокирует apply, если любой aws_s3_bucket не имеет включенного шифрования AES256 или aws:kms.
Пример результата:
import "tfplan/v2" as tfplan
# Разрешенные алгоритмы
allowed_algorithms = ["AES256", "aws:kms"]
# Собираем все S3-бакеты
buckets = filter tfplan.resource_changes as _, rc {
rc.type is "aws_s3_bucket" and
rc.change.actions is not "delete"
}
# Проверяем каждый бакет
violations = []
for buckets as _, bucket {
server_side_encryption = bucket.change.after.server_side_encryption_configuration
if server_side_encryption is null or
server_side_encryption.rule.apply_server_side_encryption_by_default.sse_algorithm not in allowed_algorithms {
violations.append(bucket.address)
}
}
# Если есть нарушения — блокируем
violations is empty or main = rule {
length(violations) == 0
}
7. Multi-cloud Kubernetes (EKS + GKE)
Задача: Развернуть кластеры EKS в AWS и GKE в GCP, а затем объединить их в единую service mesh.
Промт:
Создай Terraform-модуль для развертывания EKS-кластера (AWS) и GKE-кластера (GCP) с поддержкой Istio mesh. Модуль должен выводить kubeconfig для каждого кластера.
Пример результата (фрагмент):
# eks/main.tf
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "~> 20.0"
cluster_name = "my-eks-cluster"
cluster_version = "1.30"
vpc_id = var.vpc_id
subnet_ids = var.subnet_ids
node_groups = {
main = {
desired_capacity = 2
max_capacity = 5
min_capacity = 1
}
}
}
output "eks_kubeconfig" {
value = module.eks.kubeconfig
}
# gke/main.tf
resource "google_container_cluster" "primary" {
name = "my-gke-cluster"
location = "us-central1"
initial_node_count = 2
network = var.network
subnetwork = var.subnetwork
}
output "gke_kubeconfig" {
value = google_container_cluster.primary.endpoint
}
Для полной интеграции с Istio потребуется дополнительная настройка mesh-федерации.
8. Terraform с Terragrunt: DRY-модули
Задача: Организовать код с помощью Terragrunt для избежания дублирования.
Промт:
Создай структуру Terragrunt для двух окружений (dev, prod) с переиспользованием одного модуля VPC. В dev — CIDR 10.0.0.0/16, в prod — 10.1.0.0/16. state должен храниться в отдельных S3-бакетах.
Пример результата:
# terragrunt.hcl (корневой)
remote_state {
backend = "s3"
config = {
bucket = "my-tf-state-${get_aws_account_id()}"
key = "${path_relative_to_include()}/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-locks"
}
}
# dev/terragrunt.hcl
include {
path = find_in_parent_folders()
}
terraform {
source = "../modules/vpc"
}
inputs = {
cidr_block = "10.0.0.0/16"
env_name = "dev"
}
# prod/terragrunt.hcl
include {
path = find_in_parent_folders()
}
terraform {
source = "../modules/vpc"
}
inputs = {
cidr_block = "10.1.0.0/16"
env_name = "prod"
}
9. Кастомный Terraform Provider
Задача: Создать скелет кастомного провайдера для внутреннего API.
Промт:
Напиши минимальную структуру Go-кода для Terraform-провайдера, который управляет ресурсом 'myapp_deployment' с полями name, image, replicas. Используй Terraform Plugin Framework.
Пример результата (фрагмент main.go):
package main
import (
"context"
"github.com/hashicorp/terraform-plugin-framework/providerserver"
"github.com/hashicorp/terraform-plugin-framework/resource"
"github.com/hashicorp/terraform-plugin-framework/tfsdk"
)
func main() {
providerserver.Serve(context.Background(), func() tfsdk.Provider {
return &myProvider{}
}, providerserver.ServeOpts{
Address: "registry.terraform.io/myorg/myprovider",
})
}
type myProvider struct{}
func (p *myProvider) GetResources(_ context.Context) (map[string]tfsdk.ResourceType, diag.Diagnostics) {
return map[string]tfsdk.ResourceType{
"myapp_deployment": &deploymentResourceType{},
}, nil
}
Полный код включает реализацию CRUD-методов для ресурса.
10. Пайплайн GitOps с Terraform и Atlantis
Задача: Настроить автоматический plan/apply при Pull Request.
Промт:
Напиши конфигурацию Atlantis для GitHub, которая при создании PR запускает 'terraform plan', а при merge — 'terraform apply'. Используй webhook secret и S3-бэкенд.
Пример результата (atlantis.yaml):
version: 3
automerge: false
delete_source_branch_on_merge: true
projects:
- name: my-project
dir: .
terraform_version: v1.9.0
autoplan:
enabled: true
when_modified: ["*.tf", "*.tfvars"]
apply_requirements: ["mergeable", "approved"]
workflow: default
workflows:
default:
plan:
steps:
- init
- plan
apply:
steps:
- apply
Заключение
Эти 10 промтов покрывают ключевые сценарии работы с Terraform: от создания простых модулей до multi-cloud и кастомных провайдеров. Главное — помнить, что промт должен быть конкретным и содержать все необходимые входные данные.
Попробуйте применить эти промты в своем проекте. Начните с базовых, затем переходите к продвинутым — и вы увидите, как LLM может стать вашим ассистентом по IaC.
А если вы хотите углубиться в тему и освоить Terraform на профессиональном уровне, обратите внимание на специализированные курсы. Например, ASI Biont поддерживает интеграцию с HashiCorp Cloud Platform через API — подробнее на asibiont.com/courses.
Удачной инфраструктуры!
Комментарии