ADOPT
Varför ADOPT?
Terraform är industry standard för Infrastructure as Code med brett stöd för alla stora cloud providers och hundratals andra plattformar. Deklarativ syntax, robust state management och mogen tooling gör det till första valet för att hantera infrastruktur som kod.
Core strengths:
- Multi-cloud - En syntax för AWS, Azure, GCP, Kubernetes och 3000+ providers
- Declarative - Beskriv önskat state, Terraform hanterar resten
- State management - Robust tracking av vad som existerar
- Modular - Återanvändbara modules för DRY-princip
- Plan before apply - Se vad som kommer att ändras innan execution
Key concepts
HCL (HashiCorp Configuration Language):
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.micro"
tags = {
Name = "WebServer"
}
}
Terraform workflow:
terraform init- Installera providers och modulesterraform plan- Preview changesterraform apply- Utför ändringarterraform destroy- Ta bort resurser
State:
- Lagrar current state av din infrastruktur
- Remote backends (S3, Azure Blob, Terraform Cloud) för team collaboration
- State locking för att förhindra conflicts
Best practices
Project structure:
terraform/
├── environments/
│ ├── dev/
│ ├── staging/
│ └── prod/
├── modules/
│ ├── network/
│ ├── compute/
│ └── database/
└── shared/
└── backend.tf
State management:
- Remote state - S3/Azure Blob med state locking (DynamoDB/Azure Storage)
- Workspaces för environments (eller separata state files)
- Never commit state files till Git
- Backup state regelbundet
Code quality:
terraform fmt- Format codeterraform validate- Syntax validationterraform plan- Always preview before applytflint- Linting för best practicescheckov/tfsec- Security scanning
Modules:
- Skapa återanvändbara modules för common patterns
- Version modules (Git tags eller Terraform Registry)
- Azure Verified Modules (AVM) för Azure
- AWS modules från Terraform Registry
Variables & Outputs:
- Använd variables för flexibilitet
- Sensitive values via environment variables eller secret managers
- Outputs för att dela data mellan modules/stacks
Advanced features
Dynamic blocks:
- Generera repetitiv configuration
- Loop över lists och maps
Data sources:
- Query existing infrastructure
- Integration med external systems
Provisioners (använd sparsamt):
local-execochremote-exec- Prefer cloud-init eller configuration management istället
Terraform Cloud/Enterprise
Benefits:
- Remote execution och state
- Team collaboration
- Policy as Code (Sentinel)
- Private module registry
- VCS integration (GitHub, GitLab)
Free tier:
- Up to 5 users
- Remote state och execution
- Private modules
Utmaningar
⚠️ Tänk på:
- State drift - resurser ändrade utanför Terraform
- Import av existing infrastructure kan vara komplext
- Vissa providers har sämre kvalitet än andra
- Upgrade-path mellan major versions kan vara jobbig
- License-ändringar 2023 (BSL) - se OpenTofu för open source-alternativ
Terraform vs alternativ
Terraform vs CloudFormation/ARM:
- Terraform: Multi-cloud, bättre syntax, större community
- CloudFormation/ARM: Djupare integration med AWS/Azure
Terraform vs Pulumi:
- Terraform: HCL, deklarativ, established
- Pulumi: Riktiga programmeringsspråk (Python, TypeScript), mer flexibility
Terraform vs Ansible:
- Terraform: Infrastructure provisioning (create/destroy)
- Ansible: Configuration management (configure existing resources)
- Använd ofta båda tillsammans
Migrering och adoption
Start small:
- Börja med ny infrastruktur
- Terraform endast i dev först
- Bygga upp modules library
- Importera existing resources stegvis
- Rulla ut till staging/prod
Team enablement:
- Training på Terraform basics
- Kodreview-process
- Shared modules och best practices
- CI/CD integration