Použití Terraformu s AWS: Kompletní průvodce
Použití Terraformu s AWS: Kompletní průvodce
Správa infrastruktury se vyvinula od ručního klikání v konzoli a křehkých skriptů k deklarativnímu kódu, který lze verzovat, kontrolovat a sdílet. Pro týmy pracující na Amazon Web Services se Terraform stal standardem pro infrastrukturu jako kód (IaC) a znalost toho, jak efektivně používat Terraform s AWS, je nyní klíčovou dovedností cloudových inženýrů. Tento průvodce vás provede celým pracovním postupem – od nastavení poskytovatele AWS až po nasazení reálných zdrojů pomocí postupů na průmyslové úrovni.
Co se naučíte
Na konci tohoto průvodce pochopíte celý pracovní postup Terraformu na AWS – od konfigurace poskytovatele a definování zdrojů až po správu stavu a týmovou spolupráci. Budete schopni s jistotou nasazovat, aktualizovat a odstraňovat infrastrukturu AWS pomocí deklarativního přístupu Terraformu a získáte jasný mentální model pro strukturování vlastních projektů. Naučíte se také praktická bezpečnostní opatření, abyste se vyhnuli nákladným chybám, jako je nasazení do nesprávného účtu AWS.
Pochopení základních konceptů: poskytovatelé, zdroje a stav
Než napíšete jakoukoli konfiguraci, je užitečné porozumět základním stavebním kamenům Terraformu. Na rozdíl od AWS CloudFormation, který je nativní pro AWS a předpokládá vytváření zdrojů v rámci účtu AWS, je Terraform cloudově nezávislý a vyžaduje explicitní deklaraci poskytovatelů, kteří komunikují s konkrétními API.
Co je poskytovatel?
Poskytovatel je plugin, který slouží jako most mezi Terraformem a cílovou platformou. AWS Provider umožňuje Terraformu volat API AWS pro vytváření, čtení, aktualizaci a mazání zdrojů. Protože Terraform podporuje více poskytovatelů – AWS, Kubernetes, Helm a dokonce i SaaS nástroje třetích stran – můžete v rámci jedné konfigurace připravit cluster Amazon EKS a nasadit do něj Helm charty.
Zdroje a datové zdroje
Zdroj definuje komponentu vaší infrastruktury: instanci EC2, bucket S3 nebo bezpečnostní skupinu. Zdroje jsou deklarovány deklarativně – uvedete co chcete a Terraform zjistí jak to vytvořit.
Datový zdroj na druhé straně dotazuje AWS na informace o existujících zdrojích. Například místo pevného zakódování ID AMI, které se může změnit nebo lišit podle regionu, můžete použít datový zdroj k dynamickému získání nejnovější verze Amazon Linux 2023 AMI.
Stav: zdroj pravdy
Terraform udržuje stavový soubor, který sleduje zdroje, které spravuje. Tento stav mapuje vaši konfiguraci na skutečnou infrastrukturu a je nezbytný pro plánování aktualizací, detekci odchylek a čisté odstraňování zdrojů. Pro týmovou práci se důrazně doporučuje ukládat stav do vzdáleného backendu, jako je Amazon S3, aby se předešlo konfliktům a zajistila konzistence.
Začínáme: instalace nástrojů a nastavení přihlašovacích údajů AWS
Předpoklady
Než napíšete byť jen jeden řádek konfigurace, nastavte si lokální prostředí:
- Terraform CLI verze 1.5 nebo novější – stáhněte binární soubor a přidejte jej do PATH.
- AWS CLI – nainstalujte a nakonfigurujte jej s přihlašovacími údaji IAM, které mají dostatečná oprávnění.
- Účet AWS – použijte Free Tier pro procvičování, abyste se vyhnuli neočekávaným nákladům.
Autentizace poskytovatele AWS
AWS poskytovatel Terraformu se autentizuje stejnými metodami jako AWS CLI. Nejjednodušší způsob je nastavit proměnné prostředí s vašimi přihlašovacími údaji IAM:
export AWS_ACCESS_KEY_ID=<váš_přístupový_klíč>
export AWS_SECRET_ACCESS_KEY=<váš_tajný_klíč>
Alternativně může Terraform číst data z výchozího souboru přihlašovacích údajů ~/.aws/credentials.
Krok 1: Napište svou první konfiguraci Terraformu
Vytvořte nový adresář pro váš projekt a definujte poskytovatele a zdroje. Konfigurační soubory Terraformu používají HashiCorp Configuration Language (HCL) a mají příponu .tf.
Blok terraform
Blok terraform konfiguruje samotný Terraform, včetně zdrojů poskytovatelů a omezení verzí. Uzamčení verzí poskytovatele zabraňuje neočekávaným odchylkám při aktualizaci poskytovatele.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
required_version = ">= 1.2"
}
Argument source ukazuje na poskytovatele v registru Terraformu. HashiCorp udržuje poskytovatele AWS, takže jeho zdroj je hashicorp/aws.
Blok provider
Blok provider konfiguruje poskytovatele AWS, včetně výchozího regionu:
provider "aws" {
region = "us-west-2"
}
Definice instance EC2
Blok resource deklaruje komponentu infrastruktury. Zde je návod, jak definovat instanci EC2 pomocí datového zdroje pro získání nejnovější AMI Ubuntu:
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"] # Canonical
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"]
}
}
resource "aws_instance" "app_server" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.micro"
tags = {
Name = "terraform-demo"
}
}
Použití datového zdroje pro AMI činí vaši konfiguraci dynamickou a přenosnou mezi regiony.
Krok 2: Inicializace, plánování a aplikace
Pracovní postup Terraformu se skládá ze tří hlavních příkazů:
terraform init
Inicializujte pracovní adresář. Tím se načtou potřebné pluginy poskytovatele a nakonfiguruje backend:
terraform init
Terraform přečte blok required_providers a nainstaluje zadanou verzi poskytovatele AWS.
terraform plan
Náhled změn, které Terraform provede ve vaší infrastruktuře:
terraform plan
Plán zobrazuje přidání, změny a odstranění – to je vaše příležitost všimnout si chyb před aplikací.
terraform apply
Aplikujte konfiguraci pro vytvoření zdrojů. Terraform znovu zobrazí plán a požádá o potvrzení:
terraform apply
Zadejte yes pro pokračování. Terraform připraví instanci EC2 a zobrazí výsledky.
terraform destroy
Až skončíte, proveďte vyčištění, abyste se vyhnuli nákladům:
terraform destroy
Terraform vypočítá, co je třeba odstranit, na základě stavového souboru a požádá o potvrzení.
Krok 3: Přidání bezpečnostní skupiny a logiky přípravy
Server je bez síťového přístupu k ničemu. Přidejte bezpečnostní skupinu pro správu příchozího a odchozího provozu:
resource "aws_security_group" "web" {
name = "web-sg"
description = "Povolit HTTP a SSH"
vpc_id = var.vpc_id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["10.0.0.0/16"] # Omezit SSH
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
Připojte bezpečnostní skupinu k vaší instanci EC2 uvedením aws_security_group.web.id v argumentu vpc_security_group_ids.
Automatizace instalace softwaru pomocí uživatelských dat
Použijte uživatelská data EC2 k instalaci softwaru při prvním spuštění instance. Například pro instalaci Nginx na Amazon Linux 2023:
resource "aws_instance" "web" {
ami = data.aws_ami.al2023.id
instance_type = "t3.micro"
vpc_security_group_ids = [aws_security_group.web.id]
key_name = var.key_name
user_data = <<-EOF
#!/bin/bash
dnf install -y nginx
systemctl start nginx
echo "<h1>Ahoj od Terraformu</h1>" > /usr/share/nginx/html/index.html
EOF
}
Uživatelská data se spouštějí během počátečního bootování a jsou jednoduchým způsobem inicializace instancí bez dalších nástrojů pro správu konfigurace.
Krok 4: Použití proměnných, výstupů a modulů
Proměnné pro opakované použití
Pevné kódování hodnot činí konfigurace křehkými. Definujte proměnné v souboru variables.tf:
variable "instance_type" {
description = "Typ instance EC2"
type = string
default = "t2.micro"
}
variable "aws_region" {
description = "Region AWS"
type = string
default = "us-west-2"
}
Odkazujte na proměnné v konfiguraci pomocí var.instance_type.
Výstupy pro zobrazení informací
Výstupy umožňují získat informace po aplikaci, například veřejnou IP adresu instance:
output "instance_public_ip" {
description = "Veřejná IP adresa instance EC2"
value = aws_instance.app_server.public_ip
}
Moduly pro opakovaně použitelné komponenty
Moduly jsou kontejnery pro více zdrojů, které lze sdílet napříč různými projekty. Registr Terraformu obsahuje tisíce modulů komunity a můžete také psát vlastní. Používání modulů udržuje kořenovou konfiguraci čistou a podporuje opakované použití.
Krok 5: Vzdálený stav a týmová práce
V jakémkoli týmovém prostředí je ukládání stavu lokálně nebezpečné – může zastarat nebo kolidovat se změnami jiných uživatelů. Nakonfigurujte vzdálený backend, obvykle pomocí Amazon S3 s DynamoDB pro uzamčení stavu:
terraform {
backend "s3" {
bucket = "my-terraform-state-bucket"
key = "prod/terraform.tfstate"
region = "us-west-2"
encrypt = true
dynamodb_table = "terraform-locks"
}
}
Tato konfigurace zajišťuje sdílení stavu a jeho uzamčení během operací aplikace, čímž zabraňuje souběžným změnám, které by mohly poškodit stavový soubor.
Krok 6: Nejlepší bezpečnostní postupy
Omezení poskytovatele na konkrétní účty AWS
Jednou z nejnebezpečnějších chyb je spuštění Terraformu proti nesprávnému účtu AWS, například záměr nasadit do vývojového prostředí, ale náhodné použití přihlašovacích údajů produkce. Nastavení allowed_account_ids v bloku poskytovatele vytváří záchrannou síť:
provider "aws" {
region = "us-west-2"
allowed_account_ids = ["123456789012"] # Pouze tento účet
}
Pokud se pokusíte spustit Terraform s přihlašovacími údaji z jiného účtu, plán okamžitě vyvolá chybu, čímž zabrání nákladným chybám.
Použití rolí IAM místo statických klíčů
Pro instance EC2 vždy používejte profily instancí IAM místo vkládání statických přihlašovacích údajů. To zvyšuje bezpečnost a zjednodušuje rotaci přihlašovacích údajů.
Verzování a kontrola
Všechny konfigurace Terraformu by měly být uloženy v systému verzování. Žádosti o změny infrastruktury by měly být kontrolovány stejně jako kód aplikací – to je základní hodnota IaC.
Jak používat Terraform s AWS v CI/CD pipelinech
Integrace Terraformu do CI/CD pipeline automatizuje nasazení a zajišťuje konzistenci. Typický pracovní postup GitHub Actions:
name: Terraform Apply
on:
push:
branches: [ main ]
jobs:
terraform:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: hashicorp/setup-terraform@v1
- name: Terraform Init
run: terraform init
- name: Terraform Plan
run: terraform plan
- name: Terraform Apply
run: terraform apply -auto-approve
Tento přístup eliminuje ruční kroky aplikace a zaručuje, že každé sloučení do hlavní větve nasazuje infrastrukturu, která byla zkontrolována a otestována.
Často kladené otázky
1. Jaký je rozdíl mezi Terraformem a AWS CloudFormation?
Terraform je cloudově nezávislý a podporuje mnoho poskytovatelů – AWS, Azure, Google Cloud a stovky dalších, zatímco CloudFormation funguje pouze s AWS. Terraform také nabízí flexibilnější pracovní postup s fázemi plan/apply a podporuje širší škálu zdrojů třetích stran.
2. Kde Terraform ukládá stav mé infrastruktury?
Ve výchozím nastavení ukládá Terraform stav do lokálního souboru terraform.tfstate. Pro produkci a týmovou práci byste měli nakonfigurovat vzdálený backend, například Amazon S3, pro centralizované ukládání stavu s uzamčením pro zabránění konfliktům.
3. Co jsou moduly Terraformu a proč bych je měl používat?
Moduly jsou kontejnery pro více zdrojů, které lze opakovaně používat v různých projektech. Používání modulů snižuje duplicitu, zajišťuje konzistenci a umožňuje sdílení vzorů infrastruktury mezi týmy prostřednictvím registru Terraformu.
4. Jak se vyhnout náhodnému nasazení do nesprávného účtu AWS?
Použijte nastavení allowed_account_ids v bloku poskytovatele AWS k omezení Terraformu na konkrétní ID účtů. Pokud přihlašovací údaje neodpovídají povolenému seznamu, Terraform vyvolá chybu před provedením jakýchkoli změn.
5. Jaký je rozdíl mezi terraform plan a terraform apply?
terraform plan zobrazuje náhled změn, které Terraform provede ve vaší infrastruktuře. terraform apply tyto změny provádí. Vždy nejprve spusťte plan, abyste si všimli chyb před změnou zdrojů.
Zdroje
- Terrateam, "How to deploy Nginx with Terraform on AWS" (2026)
- AWS Prescriptive Guidance, "Understanding Terraform resources and providers" (2024)
- AWS Prescriptive Guidance, "Terraform AWS Provider best practices" (2024)
- HashiCorp Developer, "Create infrastructure" (2025)
- Refine, "Getting Started with Terraform on AWS" (2024)
- DevelopersIO, "Terraform AWS Provider allowed_account_ids" (2025)
- GitHub, "terraform-basics-aws" repository
— Editorial Team
Zatím žádné komentáře.