Kom igång med Terraform 2026 — HCL-syntax, providers, resurser, state, moduler och hur du versionshanterar infrastruktur.
Infrastructure as Code (IaC) är 2026 standarden för att hantera molninfrastruktur. Istället för att klicka i en portal eller SSH:a till servrar definierar du allt — nätverk, databaser, load balancers, DNS — i deklarativa konfigurationsfiler. Terraform av HashiCorp är det mest använda IaC-verktyget och stöder alla större molnleverantörer: Azure, AWS, Google Cloud, och tusentals fler via providers.
Den här guiden tar dig från grunderna i HCL-syntax till att bygga din första återanvändbara Terraform-modul. Du lär dig arbeta med state, förstå plan/apply-cykeln, och strukturera Terraform-kod för verkliga projekt. Alla exempel fungerar mot Azure, men principerna är identiska för AWS och andra moln.
Terraform — grundläggande koncept
Terraform använder sitt eget deklarativa språk HCL (HashiCorp Configuration Language). Du beskriver vilket tillstånd infrastrukturen ska ha, och Terraform beräknar vilka ändringar som krävs för att nå dit. Detta skiljer sig från imperativa verktyg som Ansible eller PowerShell DSC där du beskriver stegen för att nå målet.
De fyra grundpelarna i Terraform är: providers som kopplar Terraform till en molnleverantör, resources som definierar vad som ska skapas, state som håller koll på vad som skapats, och modules som grupperar resurser i återanvändbara enheter. Tillsammans ger dessa verktygen för att hantera infrastruktur i alla skalor.
Installation och första konfiguration
Ladda ner Terraform från hashicorp.com och lägg till i din PATH. Verifiera med terraform --version — 2026 är version 1.10 aktuell. Skapa en ny katalog och din första konfigurationsfil:
| 1 | # main.tf |
| 2 | terraform { |
| 3 | required_version = ">= 1.6" |
| 4 | required_providers { |
| 5 | azurerm = { |
| 6 | source = "hashicorp/azurerm" |
| 7 | version = "~> 4.0" |
| 8 | } |
| 9 | } |
| 10 | } |
| 11 | |
| 12 | provider "azurerm" { |
| 13 | features {} |
| 14 | } |
| 15 | |
| 16 | resource "azurerm_resource_group" "rg" { |
| 17 | name = "rg-mitt-projekt" |
| 18 | location = "swedencentral" |
| 19 | } |
Kör terraform init för att ladda ner Azure-providern, terraform plan för att se vad som kommer att skapas, och terraform apply för att skapa resursgruppen i Azure.
HCL-syntax — resurser, variabler och outputs
HCL är designat för att vara läsbart för människor. En resurs deklareras med resource "type" "name" { ... } där type är providerns resurstyp och name är en lokal identifierare. Resursattribut kan vara strängar, siffror, listor eller maps. Du refererar till andra resursers attribut med resursTyp.resursNamn.attribut.
Variabler gör dina konfigurationer återanvändbara. Definiera dem i variables.tf:
| 1 | variable "location" { |
| 2 | description = "Azure-region för alla resurser" |
| 3 | type = string |
| 4 | default = "swedencentral" |
| 5 | } |
| 6 | |
| 7 | variable "environment" { |
| 8 | description = "Miljönamn: dev, staging, production" |
| 9 | type = string |
| 10 | } |
Outputs exporterar värden som kan användas av andra Terraform-konfigurationer eller visas för användaren:
| 1 | output "resource_group_id" { |
| 2 | value = azurerm_resource_group.rg.id |
| 3 | } |
State — hjärtat i Terraform
Terraform state är en JSON-fil som håller reda på alla resurser som Terraform skapat. Den mappar dina deklarationer mot verkliga resurser i molnet. State måste hanteras noggrant — om du förlorar statet vet Terraform inte vad som redan skapats och kan försöka skapa allt på nytt.
För produktion använder du remote state — lagra state i Azure Storage, AWS S3 eller HashiCorp Cloud Platform (HCP). Remote state möjliggör team-samarbete, låsning av state vid ändringar, och versionshistorik. Azure Storage med state-lagring:
| 1 | terraform { |
| 2 | backend "azurerm" { |
| 3 | resource_group_name = "rg-terraform-state" |
| 4 | storage_account_name = "tfmystate" |
| 5 | container_name = "tfstate" |
| 6 | key = "production.terraform.tfstate" |
| 7 | } |
| 8 | } |
Din första modul
Moduler är Terraforms sätt att skapa återanvändbara, testbara komponenter. En modul är helt enkelt en katalog med .tf-filer som innehåller variabler, outputs och resurser. Skapa en modul för en Azure App Service med databas:
| 1 | # modules/webapp/variables.tf |
| 2 | variable "name" { type = string } |
| 3 | variable "location" { type = string } |
| 4 | variable "environment" { type = string } |
| 5 | |
| 6 | # modules/webapp/main.tf |
| 7 | resource "azurerm_service_plan" "plan" { |
| 8 | name = "asp-${var.name}-${var.environment}" |
| 9 | location = var.location |
| 10 | resource_group_name = var.resource_group_name |
| 11 | os_type = "Linux" |
| 12 | sku_name = "B1" |
| 13 | } |
| 14 | |
| 15 | resource "azurerm_linux_web_app" "app" { |
| 16 | name = "app-${var.name}-${var.environment}" |
| 17 | resource_group_name = var.resource_group_name |
| 18 | location = var.location |
| 19 | service_plan_id = azurerm_service_plan.plan.id |
| 20 | } |
| 21 | |
| 22 | resource "azurerm_mssql_database" "db" { |
| 23 | name = "sqldb-${var.name}" |
| 24 | server_id = azurerm_mssql_server.sql.id |
| 25 | } |
| 26 | |
| 27 | # modules/webapp/outputs.tf |
| 28 | output "app_url" { |
| 29 | value = "https://${azurerm_linux_web_app.app.default_hostname}" |
| 30 | } |
Använd modulen från din huvudkonfiguration:
| 1 | module "webbapp" { |
| 2 | source = "./modules/webapp" |
| 3 | name = "minapp" |
| 4 | location = var.location |
| 5 | environment = "production" |
| 6 | resource_group_name = azurerm_resource_group.rg.name |
| 7 | } |
Remote modules och Terraform Registry
Moduler kan också hämtas från Terraform Registry (registry.terraform.io) där tusentals community-moduler finns för vanliga mönster som VPC:er, Kubernetes-kluster och databaser. Du kan också referera moduler direkt från Git-repositories, GitHub, eller S3-buckets:
| 1 | module "vpc" { |
| 2 | source = "terraform-aws-modules/vpc/aws" |
| 3 | version = "5.0.0" |
| 4 | name = "min-vpc" |
| 5 | cidr = "10.0.0.0/16" |
| 6 | } |
Att publicera egna moduler på Terraform Registry är ett utmärkt sätt att dela infrastrukturkomponenter inom din organisation. Använd en konsekvent namngivning, dokumentera variabler och outputs, och versionshantera med Git-tags.
Workspaces — hantera flera miljöer
Terraform workspaces låter dig hantera flera miljöer (dev, staging, production) med samma konfiguration men separata state-filer. Skapa och växla mellan workspaces:
| 1 | terraform workspace new dev |
| 2 | terraform workspace new production |
| 3 | terraform workspace select dev |
| 4 | terraform plan |
| 5 | terraform apply |
Använd terraform.workspace i dina konfigurationer för att anpassa resursnamn och inställningar per miljö. Workspaces är enkelt och fungerar bra för mindre projekt. För större organisationer rekommenderas separata konfigurationskataloger eller Git-grenar med Terraform Cloud för mer avancerad styrning.
Plan/Apply-cykeln och versionshantering
Arbetsflödet med Terraform är konsekvent: terraform init → terraform fmt → terraform validate → terraform plan → terraform apply. fmt formaterar koden enligt standard, validate kontrollerar syntax och interna referenser, plan visar vilka ändringar som kommer att göras, och apply utför dem.
I CI/CD integrerar du Terraform med GitHub Actions eller Azure DevOps. Ett typiskt flöde: pull request skapar en automatisk terraform plan som kommenterar PR:n med resultatet → när PR:n mergas körs terraform apply automatiskt. Detta ger kodgranskning av infrastrukturändringar precis som för applikationskod.
Bästa praxis för Terraform-kod
Efter några projekt lär du dig snabbt vad som fungerar och vad som inte gör det. Organisera din kod efter ansvarsområde: main.tf för resurser, variables.tf för variabler, outputs.tf för outputs, versions.tf för provider och Terraform-version. Använd konsekvent namngivning med prefix för resurstyp (t.ex. rg- för resursgrupp, vnet- för virtuella nätverk).
Använd taggar på alla resurser för kostnadsallokering och identifiering. Lås versioner av providers till en specifik major-version med ~> 4.0 för att undvika oväntade brytningar. Dela upp stora konfigurationer i moduler — en bra tumregel är att varje modul ska göra en sak och göra den bra.
Felsökning och vanliga problem
State-korruption är det allvarligaste problemet i Terraform. Backa upp ditt state regelbundet, använd remote state med låsning, och undvik att redigera state-filer manuellt. Om state blir korrupt, återställ från en backup eller använd terraform import för att återskapa resurser i state.
API-rate limiting från molnleverantörer kan orsaka timeout. Lösningen är att öka timeout-värden i provider-konfigurationen eller dela upp stora konfigurationer i mindre moduler som kan appliceras separat. Kontrollera alltid terraform plan innan apply — det är din sista chans att upptäcka oväntade ändringar som kan påverka produktionen.
Sammanfattning
Terraform är standardverktyget för Infrastructure as Code 2026. Med deklarativ HCL-syntax, ett enormt provider-ekosystem och kraftfulla moduler kan du hantera infrastruktur i alla skalor. Du har nu lärt dig grunderna: installation, HCL-syntax, resurser, state-hantering, moduler och plan/apply-cykeln. Nästa steg är att bygga en komplett miljö med nätverk, databas och applikation som ren Terraform-kod — och versionshantera den precis som din applikation.
“Terraform gör infrastruktur lika hanterbar som applikationskod — versionshanterad, granskningsbar och återanvändbar.”
- Simon Axelsson
Vanliga frågor
- Är Terraform gratis?
- Ja, Terraform är open source (MPL 2.0) och helt gratis att använda. HashiCorp erbjuder betalda produkter som Terraform Cloud och Terraform Enterprise för samarbete, policy-styrning och kostnadskontroll. För enskilda utvecklare och mindre team räcker open source-versionen långt.
- Terraform vs ARM/Bicep — vad ska jag välja?
- Om du bara använder Azure och aldrig planerar att byta molnleverantör är Bicep ett bra alternativ med djup Azure-integration. Terraform är bättre om du använder flera moln (multi-cloud), vill ha samma verktyg oavsett leverantör, eller behöver tillgång till tusentals providers via Terraform Registry.
- Hur återställer jag en resurs som tagits bort utanför Terraform?
- Använd <code>terraform import</code> för att importera den befintliga resursen till Terraform state. Du måste skriva en resursdeklaration som matchar den befintliga resursen och sedan köra <code>terraform import resurstyp.namn /resurs/id</code>. Efter import kan Terraform hantera resursen som om den skapats av Terraform.
- Kan jag använda Terraform med Azure DevOps eller GitHub Actions?
- Ja, båda stöder Terraform-integrering. För GitHub Actions finns <code>hashicorp/setup-terraform</code> som installerar Terraform och cachar provider-plugins. För Azure DevOps finns Terraform-task i Marketplace. Det bästa mönstret är att köra <code>terraform plan</code> i PR-granskning och <code>terraform apply</code> vid merge till main.
- Vad är skillnaden mellan Terraform och Ansible?
- Terraform är ett deklarativt IaC-verktyg för att provisionera infrastruktur (skapa resurser som servrar, nätverk, databaser). Ansible är ett imperativt konfigurationshanteringsverktyg för att installera programvara och konfigurera servrar. De kompletterar varandra: Terraform skapar infrastrukturen, Ansible konfigurerar den.
