DataPartner365

Jouw partner voor datagedreven groei en inzichten

Terraform Basics

Laatst bijgewerkt: 9 september 2025
Leestijd: 16 minuten
Terraform, Infrastructure as Code, IaC, HashiCorp, cloud infrastructure, DevOps, automation

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:

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

1

Write

Schrijf Terraform configuratie in .tf files met HCL syntax

2

Init

Initialiseer Terraform: download providers en configureer backend

3

Plan

Genereer execution plan: wat zal Terraform creëren/wijzigen/verwijderen?

4

Apply

Voer plan uit en implementeer infrastructuur in de cloud

5

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?

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

1

Week 1-2: Fundamentals

Installeer Terraform, begrijp HCL syntax, leer basis resources, oefen met terraform init/plan/apply.

2

Week 3-4: State & Providers

Master state management, configureer remote backend, werk met meerdere providers, gebruik variables en outputs.

3

Week 5-6: Modules & Workspaces

Creëer en gebruik modules, implementeer workspaces voor omgevingsmanagement, gebruik data sources.

4

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

Production Best Practices

Terraform Enterprise en Cloud

Terraform Cloud/Enterprise Features