Terraform Basics
Een complete beginnersgids over Terraform: leer Infrastructure as Code voor het automatiseren, versioneren en veilig beheren van cloud infrastructuur in AWS, Azure en GCP.
Definitie
Terraform is een open-source Infrastructure as Code (IaC) tool ontwikkeld door HashiCorp waarmee je cloud infrastructuur veilig en efficiënt kunt creëren, wijzigen en versioneren. Terraform gebruikt een declaratieve configuratie taal genaamd HCL (HashiCorp Configuration Language) om cloud resources te beschrijven.
Waarom Terraform?
Terraform lost kritieke problemen op in moderne cloud infrastructure management:
- Infrastructure as Code: Beheer infrastructuur als software code
- Multi-cloud support: Beheer AWS, Azure, GCP en meer met één tool
- Declaratieve syntax: Beschrijf WAT je wilt, niet HOE het gemaakt moet worden
- State management: Houd bij wat er is geïmplementeerd en wat er moet veranderen
- Modulariteit: Hergebruikbare modules voor consistente infrastructuur
- Collaboration: Team samenwerking via versiebeheer (Git)
Belangrijkste Inzicht
Terraform is niet alleen een provisioning tool - het is een complete infrastructuur lifecycle management platform. Het grootste voordeel is de declaratieve aanpak: je beschrijft de gewenste eindtoestand en Terraform berekent automatisch hoe die te bereiken, inclusief het beheren van afhankelijkheden tussen resources.
Terraform vs. Andere IaC Tools
| Aspect | Terraform | CloudFormation | Ansible |
|---|---|---|---|
| Type | Declaratieve IaC | Declaratieve IaC | Imperatieve CM |
| Multi-cloud | ✓ (3000+ providers) | ✗ (alleen AWS) | ✓ (maar minder) |
| State Management | Uitgebreid (.tfstate) | Beperkt | Geen |
| Learning Curve | Matig | Laag (alleen AWS) | Laag (YAML) |
| Best voor | Cloud provisioning | AWS-only omgevingen | Configuration management |
Terraform Architecture
Configuration Files
.tf files met HCL code die infrastructuur beschrijven
Providers
Plugins die communiceren met cloud APIs (AWS, Azure, GCP)
State File
terraform.tfstate slaat huidige infrastructuur toestand op
Modules
Hergebruikbare componenten voor consistente infrastructuur
Terraform Workflow
Write
Schrijf Terraform configuratie in .tf files met HCL syntax
Init
Initialiseer Terraform: download providers en configureer backend
Plan
Genereer execution plan: wat zal Terraform creëren/wijzigen/verwijderen?
Apply
Voer plan uit en implementeer infrastructuur in de cloud
Destroy
Verwijder alle Terraform-managed resources (optioneel)
HCL Syntax Voorbeelden
Basis Terraform Configuratie
# main.tf - Basis Terraform configuratie
# Configureer de AWS provider
terraform {
required_version = ">= 1.0.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "eu-west-1"
}
}
# Configureer de AWS provider
provider "aws" {
region = "eu-west-1"
profile = "default"
}
# Maak een VPC
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "main-vpc"
Environment = "production"
}
}
Complexe Data Infrastructure
# data-infrastructure.tf - Data platform op AWS
# S3 Bucket voor data lake
resource "aws_s3_bucket" "data_lake" {
bucket = "company-data-lake-${var.environment}"
tags = {
Name = "Data Lake"
Environment = var.environment
ManagedBy = "Terraform"
}
}
# Glue Data Catalog Database
resource "aws_glue_catalog_database" "data_catalog" {
name = "data_catalog_${var.environment}"
}
# Redshift Cluster voor data warehouse
resource "aws_redshift_cluster" "data_warehouse" {
cluster_identifier = "data-warehouse-${var.environment}"
database_name = "data_warehouse"
master_username = var.redshift_username
master_password = var.redshift_password
node_type = "dc2.large"
cluster_type = "single-node"
tags = {
Name = "Data Warehouse"
}
}
# IAM Role voor data access
resource "aws_iam_role" "data_access" {
name = "data-access-role-${var.environment}"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "glue.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
}
Essentiële Terraform Commando's
| Commando | Beschrijving | Gebruik |
|---|---|---|
| terraform init | Initialiseer Terraform directory | Download providers, configure backend |
| terraform plan | Genereer execution plan | Zie wat er zal veranderen |
| terraform apply | Voer plan uit | Implementeer infrastructuur |
| terraform destroy | Verwijder resources | Clean up alle Terraform resources |
| terraform fmt | Format code | Zorg voor consistente formatting |
| terraform validate | Valideer configuratie | Check syntax en configuratie |
| terraform state | State management | Bekijk/manipuleer state file |
| terraform workspace | Manage workspaces | Isolate omgevingen (dev, staging, prod) |
Provider Ecosystem
AWS
Amazon Web Services
Azure
Microsoft Azure
GCP
Google Cloud Platform
GitHub
GitHub resources
Datadog
Monitoring en observability
Kubernetes
K8s cluster management
State Management
Local State
terraform.tfstate lokaal op schijf
- ✓ Eenvoudig voor persoonlijk gebruik
- ✗ Geen team collaboration
- ✗ Geen locking mechanism
- ✗ Geen version history
Remote State
State opgeslagen in gedeelde backend
- ✓ Team collaboration
- ✓ State locking
- ✓ Version history
- ✓ Betere security
Remote State Configuratie
# backend.tf - Remote state configuratie
terraform {
backend "s3" {
# S3 bucket voor state opslag
bucket = "company-terraform-state"
key = "global/s3/terraform.tfstate"
region = "eu-west-1"
# DynamoDB voor state locking
dynamodb_table = "terraform-state-locks"
encrypt = true
}
}
# state-locking.tf - DynamoDB table voor locking
resource "aws_dynamodb_table" "terraform_state_lock" {
name = "terraform-state-locks"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
Modules en Modulariteit
Waarom Modules?
- Hergebruik: Eén keer schrijven, overal gebruiken
- Consistentie: Standaard implementatie patterns
- Abstractie: Complexiteit verbergen achter eenvoudige interfaces
- Collaboration: Teams kunnen modules delen en hergebruiken
Module Structuur
# modules/vpc/main.tf
variable "vpc_cidr" {
type = string
default = "10.0.0.0/16"
}
variable "environment" {
type = string
}
resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr
tags = {
Name = "vpc-${var.environment}"
Environment = var.environment
}
}
output "vpc_id" {
value = aws_vpc.main.id
}
# main.tf - Module gebruik
module "vpc" {
source = "./modules/vpc"
vpc_cidr = "10.0.0.0/16"
environment = "production"
}
# Gebruik module output
resource "aws_subnet" "main" {
vpc_id = module.vpc.vpc_id
cidr_block = "10.0.1.0/24"
}
Terraform voor Data Infrastructure
Data Storage Layer
S3 buckets, RDS databases, Redshift clusters, DynamoDB tables
Data Processing Layer
EMR clusters, Glue jobs, Lambda functions, Step Functions
Orchestration Layer
Airflow/MWAA, EventBridge rules, SQS queues, SNS topics
Real-world Case Study: Data Platform Migration
Uitdaging: Een financiële dienstverlener had handmatig geconfigureerde data infrastructuur met inconsistente omgevingen en geen version control.
Oplossing: Terraform implementatie voor volledige data platform:
- VPC, subnets, security groups voor isolatie
- S3 buckets voor data lake met lifecycle policies
- Redshift cluster met automatische scaling
- Glue crawlers en jobs voor ETL
- MWAA (Managed Airflow) voor orchestration
Resultaat: 90% reductie in deployment tijd, 100% consistente omgevingen, en volledige audit trail via Git.
Terraform Leerpad
Week 1-2: Fundamentals
Installeer Terraform, begrijp HCL syntax, leer basis resources, oefen met terraform init/plan/apply.
Week 3-4: State & Providers
Master state management, configureer remote backend, werk met meerdere providers, gebruik variables en outputs.
Week 5-6: Modules & Workspaces
Creëer en gebruik modules, implementeer workspaces voor omgevingsmanagement, gebruik data sources.
Week 7-8: Advanced Patterns
Implementeer CI/CD pipelines, gebruik Terratest voor testing, beheer complexe dependencies, optimaliseer performance.
Veelgemaakte Terraform Fouten
Beginners Valkuilen
- Hardcoded values: Gebruik variables en tfvars files
- Local state in teams: Altijd remote state gebruiken
- Geen state locking: Race conditions en corrupte state
- Grote monolithic configs: Gebruik modules voor modulariteit
- Geen .gitignore voor .tfstate: Nooit state files committen
- Manual changes in console: State drift en inconsistenties
Terraform Best Practices
Development Best Practices
- Gebruik versie constraints voor providers en Terraform zelf
- Implementeer consistent naming conventions
- Gebruik tfvars files voor environment-specific configuratie
- Valideer en format code met terraform validate en fmt
- Gebruik Terratest of Kitchen-Terraform voor testing
Production Best Practices
- Implementeer remote state met locking (S3 + DynamoDB)
- Gebruik workspaces voor environment isolation
- Implementeer CI/CD pipelines met plan/apply workflows
- Gebruik Sentinel policies voor governance en compliance
- Monitor infrastructure drift met定期 checks
Terraform Enterprise en Cloud
Terraform Cloud/Enterprise Features
- Remote Operations: Terraform runs in managed environment
- Collaboration: Team workflows en approval processes
- Policy as Code: Sentinel policies voor governance
- Private Module Registry: Centrale module repository
- Cost Estimation: Voorspel infrastructuur kosten
- Audit Logging: Complete audit trail van changes