Word een Gecertificeerd Terraform Professional

Het HashiCorp Terraform Associate certificaat bewijst dat je Infrastructure-as-Code beheerst. Voor data engineers die cloud-infrastructuur provisionen voor Databricks, Snowflake of Azure-omgevingen is dit de perfecte volgende stap.

$70.50
Examenkosten (USD)
60 min
Tijdsduur
57
Vragen
70%
Slagingsdrempel

Wat is Terraform en Waarom Certificeren?

Terraform is een open-source Infrastructure-as-Code (IaC) tool ontwikkeld door HashiCorp. Met Terraform beschrijf je infrastructuur in declaratieve configuratiebestanden — in de HashiCorp Configuration Language (HCL) — en Terraform zorgt ervoor dat de werkelijke infrastructuur overeenkomt met die beschrijving.

Voor data engineers die werken met cloud-dataplatformen is Terraform bijzonder relevant. In plaats van handmatig Azure resource groups, storage accounts, Databricks workspaces en Key Vaults aan te klikken in de portal, schrijf je eenmalig de configuratie en reproduceer je de omgeving consistent in dev, test en productie. Dit elimineert de "het werkte in dev maar niet in prod"-problemen die voortkomen uit handmatige configuratieverschillen.

Waarom Terraform voor Data Engineers?

Moderne data engineering is niet meer alleen pipelines bouwen. Je provisioneert ook de infrastructuur: storage accounts, compute clusters, netwerkconfiguraties, key vaults, service principals en monitoring. Met Terraform doe je dat herhaalbaar, versioneerbaar en auditeerbaar. Het Terraform Associate certificaat bewijst dat je deze skills beheerst.

Examenformat

Onderdeel Detail
Aanbieder HashiCorp via PSI Online
Examen versie 003 (huidige versie, geldig tot nader order)
Tijdsduur 60 minuten
Aantal vragen 57 vragen (mix van multiple choice, multiple select en true/false)
Slagingsdrempel 70% (circa 40 van 57 vragen correct)
Kosten $70.50 USD
Geldigheid 2 jaar
Examenvorm Online proctored (thuis) of test center
Aanbevolen ervaring 6+ maanden Terraform gebruik in de praktijk

De 9 Examendomainen met Gewichten

Domein Verdeling

1. IaC Concepten

~6% — Wat is IaC, voordelen, vergelijking tools

2. Terraform Purpose

~8% — Wat doet Terraform, multi-cloud, open source vs Enterprise

3. Terraform Basics

~32% — HCL syntax, providers, resources, variables, outputs

4. Terraform State

~16% — State files, remote backends, state locking

5. Terraform Modules

~12% — Modules gebruiken, registry, local modules

6. Workflow

~8% — init, plan, apply, destroy, refresh, fmt, validate

7. Terraform Features

~10% — Built-in functions, meta-arguments, lifecycle

8. HCP Terraform

~6% — Terraform Cloud, workspaces, remote runs

9. Enterprise Features

~2% — Sentinel policies, audit logging, SSO

Kernconcepten met Uitleg

Providers

Een provider is een plugin die Terraform instaat stelt om met een specifiek platform of dienst te communiceren. Providers definiëren de beschikbare resource types. Er zijn providers voor AWS, Azure, GCP, Databricks, Snowflake, GitHub en honderden andere diensten.

HCL - Provider configuratie (Azure)

# terraform.tf — vereiste providers declareren
terraform {
  required_version = ">= 1.6.0"

  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.90"
    }
    databricks = {
      source  = "databricks/databricks"
      version = "~> 1.40"
    }
  }
}

# Provider configuratie
provider "azurerm" {
  features {}
  subscription_id = var.subscription_id
  tenant_id       = var.tenant_id
}

provider "databricks" {
  host  = azurerm_databricks_workspace.main.workspace_url
  token = var.databricks_token
}
      

Resources

Een resource is een infrastructuurcomponent die Terraform beheert: een virtual machine, storage account, database, Databricks workspace, etc. Resources zijn het hart van elke Terraform configuratie.

HCL - Azure resources aanmaken voor een data platform

# Resource Group
resource "azurerm_resource_group" "data_platform" {
  name     = "rg-dataplatform-${var.environment}-${var.location_short}"
  location = var.location
  tags     = local.common_tags
}

# Azure Data Lake Storage Gen2
resource "azurerm_storage_account" "datalake" {
  name                     = "sadatalake${var.environment}${var.suffix}"
  resource_group_name      = azurerm_resource_group.data_platform.name
  location                 = azurerm_resource_group.data_platform.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
  is_hns_enabled           = true  # Hierarchical Namespace = ADLS Gen2

  tags = local.common_tags
}

# Storage containers (filesystems in ADLS Gen2)
resource "azurerm_storage_data_lake_gen2_filesystem" "bronze" {
  name               = "bronze"
  storage_account_id = azurerm_storage_account.datalake.id
}

resource "azurerm_storage_data_lake_gen2_filesystem" "silver" {
  name               = "silver"
  storage_account_id = azurerm_storage_account.datalake.id
}

resource "azurerm_storage_data_lake_gen2_filesystem" "gold" {
  name               = "gold"
  storage_account_id = azurerm_storage_account.datalake.id
}

# Databricks Workspace
resource "azurerm_databricks_workspace" "main" {
  name                = "dbw-${var.project}-${var.environment}"
  resource_group_name = azurerm_resource_group.data_platform.name
  location            = azurerm_resource_group.data_platform.location
  sku                 = "premium"

  custom_parameters {
    no_public_ip                                         = true
    virtual_network_id                                   = azurerm_virtual_network.main.id
    private_subnet_name                                  = azurerm_subnet.private.name
    public_subnet_name                                   = azurerm_subnet.public.name
    private_subnet_network_security_group_association_id = azurerm_subnet_network_security_group_association.private.id
    public_subnet_network_security_group_association_id  = azurerm_subnet_network_security_group_association.public.id
  }

  tags = local.common_tags
}

# Key Vault voor secrets
resource "azurerm_key_vault" "main" {
  name                       = "kv-${var.project}-${var.environment}"
  location                   = azurerm_resource_group.data_platform.location
  resource_group_name        = azurerm_resource_group.data_platform.name
  tenant_id                  = data.azurerm_client_config.current.tenant_id
  sku_name                   = "standard"
  purge_protection_enabled   = true
  soft_delete_retention_days = 90

  tags = local.common_tags
}
      

Variables en Outputs

HCL - Variables en Outputs

# variables.tf
variable "environment" {
  description = "Deployment omgeving: dev, test, acc, prod"
  type        = string
  validation {
    condition     = contains(["dev", "test", "acc", "prod"], var.environment)
    error_message = "Environment moet dev, test, acc of prod zijn."
  }
}

variable "location" {
  description = "Azure regio voor de resources"
  type        = string
  default     = "westeurope"
}

variable "project" {
  description = "Projectnaam, gebruikt in resource namen"
  type        = string
}

variable "allowed_ip_ranges" {
  description = "Lijst van toegestane IP-adressen voor firewall regels"
  type        = list(string)
  default     = []
}

variable "databricks_config" {
  description = "Configuratie object voor Databricks"
  type = object({
    sku          = string
    no_public_ip = bool
  })
  default = {
    sku          = "premium"
    no_public_ip = true
  }
}

# outputs.tf
output "databricks_workspace_url" {
  description = "URL van de Databricks workspace"
  value       = azurerm_databricks_workspace.main.workspace_url
}

output "storage_account_name" {
  description = "Naam van het ADLS Gen2 storage account"
  value       = azurerm_storage_account.datalake.name
}

output "key_vault_uri" {
  description = "URI van de Key Vault"
  value       = azurerm_key_vault.main.vault_uri
  sensitive   = false
}

# Locals voor herbruikbare waarden
locals {
  location_short = {
    "westeurope"  = "we"
    "northeurope" = "ne"
    "eastus"      = "eu"
  }[var.location]

  common_tags = {
    Environment = var.environment
    Project     = var.project
    ManagedBy   = "Terraform"
    Owner       = "DataTeam"
  }
}
      

State Management

Terraform houdt de "werkelijke staat" van je infrastructuur bij in een state file (terraform.tfstate). Dit bestand is de brug tussen je configuratie en de werkelijke resources in de cloud. Het is cruciaal dit bestand goed te beheren.

State Type Locatie Geschikt voor Nadelen
Local State Lokale bestandssysteem Persoonlijke experimenten Niet deelbaar, geen locking, verlies bij crash
Remote State (Azure Blob) Azure Storage Account Teams, CI/CD pipelines Setup vereist, kleine complexiteit
HCP Terraform HashiCorp Cloud Platform Teams met extra features nodig Kosten bij grotere teams
HCL - Remote state backend (Azure Blob Storage)

# backend.tf — remote state in Azure Blob Storage
terraform {
  backend "azurerm" {
    resource_group_name  = "rg-terraform-state"
    storage_account_name = "saterraformstate001"
    container_name       = "tfstate"
    key                  = "dataplatform/prod/terraform.tfstate"
    use_oidc             = true  # Gebruik Azure AD workload identity (aanbevolen)
  }
}
      

Modules

Een module is een herbruikbare verzameling Terraform configuraties. Modules bevorderen DRY-principes (Don't Repeat Yourself) en zorgen voor consistentie tussen omgevingen en teams. Je kunt modules publiceren naar het Terraform Registry of lokaal opslaan.

HCL - Module gebruiken (public registry + lokaal)

# Gebruik een module uit het publieke registry
module "vnet" {
  source  = "Azure/vnet/azurerm"
  version = "~> 4.0"

  resource_group_name = azurerm_resource_group.data_platform.name
  vnet_location       = var.location
  address_space       = ["10.0.0.0/16"]
  subnet_names        = ["databricks-public", "databricks-private"]
  subnet_prefixes     = ["10.0.1.0/24", "10.0.2.0/24"]
}

# Gebruik een lokale module
module "databricks_workspace" {
  source = "./modules/databricks"

  environment         = var.environment
  resource_group_name = azurerm_resource_group.data_platform.name
  location            = var.location
  sku                 = "premium"
  vnet_id             = module.vnet.vnet_id
  public_subnet_name  = module.vnet.vnet_subnets[0]
  private_subnet_name = module.vnet.vnet_subnets[1]
}

# Output van de module gebruiken
output "workspace_url" {
  value = module.databricks_workspace.workspace_url
}
      

Terraform Workflow

De standaard Terraform workflow bestaat uit vier kernopdrachten. Elke data engineer die Terraform gebruikt moet deze stroom begrijpen en veilig kunnen uitvoeren.

Bash - Terraform workflow commando's

# 1. INIT: Providers downloaden en backend initialiseren
terraform init

# Init met backend config (voor CI/CD)
terraform init \
  -backend-config="storage_account_name=saterraformstate001" \
  -backend-config="container_name=tfstate" \
  -backend-config="key=prod/terraform.tfstate"

# 2. VALIDATE: Controleer of de configuratie syntactisch correct is
terraform validate

# 3. FORMAT: Formateer alle .tf bestanden consistent
terraform fmt -recursive

# 4. PLAN: Bekijk wat Terraform gaat doen ZONDER iets te wijzigen
terraform plan -out=tfplan

# Plan voor een specifieke workspace
terraform plan -var="environment=prod" -out=tfplan.prod

# 5. APPLY: Voer de wijzigingen door (vraagt bevestiging)
terraform apply tfplan

# Apply zonder bevestigingsvraag (voor CI/CD)
terraform apply -auto-approve tfplan

# 6. DESTROY: Verwijder ALLE resources in de state
terraform destroy

# Destroy alleen een specifieke resource
terraform destroy -target=azurerm_databricks_workspace.main

# Extra handige commando's
terraform show          # Toon huidige state leesbaar
terraform state list    # Lijst alle resources in state
terraform output        # Toon alle outputs
terraform refresh       # Sync state met werkelijke infrastructuur (verouderd, gebruik plan -refresh-only)
terraform import azurerm_resource_group.main /subscriptions/.../resourceGroups/rg-bestaand
      

Belangrijke State Commando's voor het Examen

  • terraform state mv — hernoem een resource in de state (handig bij refactoring)
  • terraform state rm — verwijder een resource uit de state zonder hem te verwijderen in de cloud
  • terraform taint (verouderd) / terraform apply -replace — forceer recreatie van een resource
  • terraform workspace list/new/select — beheer meerdere state files voor omgevingen

3-Weken Studieplan

Week 1: HCL Fundamenten & Workflow

  • Dag 1-2: Terraform installeren, eerste "Hello World" met een Azure resource group
  • Dag 3: Variables, locals en outputs grondig begrijpen
  • Dag 4: De volledige workflow (init, fmt, validate, plan, apply, destroy) tien keer herhalen
  • Dag 5: Providers begrijpen: version constraints (~>, >=, =)
  • Dag 6-7: Data sources gebruiken: bestaande resources opvragen met data blokken

Week 2: State, Modules & Meta-Arguments

  • Dag 1: State file anatomy: wat staat er in, welke informatie bevat het
  • Dag 2: Remote state opzetten met Azure Blob Storage, state locking begrijpen
  • Dag 3-4: Modules schrijven: maak een herbruikbare module voor een Databricks workspace
  • Dag 5: Meta-arguments: count, for_each, depends_on, lifecycle
  • Dag 6-7: Built-in functies: string functies, collection functies, type conversies

Week 3: HCP Terraform, Oefenvragen & Examen

  • Dag 1-2: HCP Terraform (voorheen Terraform Cloud) opzetten: workspaces, remote runs, variable sets
  • Dag 3: Terraform in CI/CD: GitHub Actions workflow schrijven voor automated plan en apply
  • Dag 4-5: HashiCorp Developer oefenvragen maken (gratis op developer.hashicorp.com)
  • Dag 6: Zwakke punten herhalen, alle commando's en flags doorlopen
  • Dag 7: Examendag

10 Voorbeeldvragen met Antwoorden

Vraag 1: Wat is de primaire functie van de Terraform state file?

A. Sla de Terraform-code op voor versiebeheer
B. Houdt de mapping bij tussen resources in de configuratie en de werkelijke infrastructuur
C. Sla provider credentials op voor authenticatie
D. Documenteer welke wijzigingen er gemaakt zijn

Uitleg: De state file is Terraform's databron over de werkelijke staat van je infrastructuur. Zonder state zou Terraform niet weten welke resources al bestaan en al aangemaakt zijn.

Vraag 2: Wat doet `terraform init`?

A. Maakt de eerste resources aan
B. Downloadt providers, modules en initialiseert de backend
C. Valideert de syntaxis van de configuratie
D. Toont een preview van de wijzigingen

Uitleg: terraform init is altijd de eerste stap. Het downloadt de provider-plugins, modules en configureert de backend voor state storage.

Vraag 3: Wat is het verschil tussen een managed resource en een data source?

A. Een managed resource wordt aangemaakt/beheerd door Terraform; een data source leest bestaande informatie zonder iets te wijzigen
B. Data sources zijn sneller dan managed resources
C. Managed resources kunnen niet worden verwijderd via Terraform
D. Er is geen functioneel verschil

Uitleg: Data sources (data "type" "naam") lezen alleen informatie op uit bestaande resources of externe bronnen. Ze maken niets aan en wijzigen niets.

Vraag 4: Wat is state locking en waarom is het belangrijk?

A. Versleutelt de state file voor beveiliging
B. Vergrendelt bepaalde resources zodat ze niet verwijderd kunnen worden
C. Voorkomt dat twee personen gelijktijdig wijzigingen doorvoeren en de state beschadigen
D. Sluit bepaalde providers af na gebruik

Uitleg: Bij remote state (bijv. Azure Blob) vergrendelt Terraform de state file tijdens een apply. Dit voorkomt conflicterende gelijktijdige runs die de state kunnen beschadigen.

Vraag 5: Welke meta-argument gebruik je om meerdere gelijksoortige resources te maken met een map?

A. count
B. for_each
C. repeat
D. loop

Uitleg: for_each accepteert een map of set van strings en maakt voor elke waarde een resource instantie. count werkt met een getal. for_each geeft betere resource-identificatie in de state.

Vraag 6: Wat doet de `lifecycle` block met `prevent_destroy = true`?

A. Voorkomt dat Terraform de resource vernietigt — terraform destroy geeft een fout
B. Maakt de resource immutable (kan niet gewijzigd worden)
C. Versleutelt de resource in de state file
D. Slaat de resource over bij elke plan/apply

Uitleg: prevent_destroy = true is een veiligheidsnet voor productie-resources. Als Terraform de resource probeert te verwijderen, faalt de operatie met een foutmelding.

Vraag 7: Hoe verwijs je vanuit een module naar een output waarde?

A. output.modulenaam.outputnaam
B. module.modulenaam.outputnaam
C. var.modulenaam.outputnaam
D. local.modulenaam.outputnaam

Uitleg: Module outputs worden benaderd via module.<naam>.<output_naam>. Elke module moet zijn outputs expliciet declareren in een outputs.tf bestand.

Vraag 8: Wat is een Terraform workspace?

A. Een visuele IDE voor het schrijven van Terraform code
B. Een apart state-exemplaar binnen dezelfde backend, waardoor je meerdere omgevingen beheert met dezelfde code
C. Een remote server voor het uitvoeren van Terraform
D. Een map-structuur voor het organiseren van modules

Uitleg: Workspaces (terraform workspace new dev) creëren aparte state files. Hierdoor kun je dezelfde configuratie gebruiken voor dev/test/prod met gescheiden state.

Vraag 9: Welk commando gebruik je om een bestaande resource in Terraform state te importeren?

A. terraform add
B. terraform adopt
C. terraform import
D. terraform sync

Uitleg: terraform import <resource_address> <resource_id> voegt een bestaande resource toe aan de Terraform state. De Terraform configuratie moet je zelf nog schrijven.

Vraag 10: Wat is de aanbevolen manier om gevoelige waarden (passwords, tokens) door te geven aan Terraform?

A. Hardcoded in de .tf bestanden
B. In de terraform.tfvars file die je commit naar Git
C. Via omgevingsvariabelen (TF_VAR_naam) of een secrets manager, en variabele als sensitive markeren
D. In commentaar boven de resource definitie

Uitleg: Gebruik sensitive = true op variabelen met gevoelige data zodat ze niet in de output verschijnen. Geef waarden door via omgevingsvariabelen of een secrets manager zoals Azure Key Vault. Nooit hardcoded in code of versiebeheersysteem.

Nuttige Links

Officiële Resources voor Examenvoorbereiding

Gerelateerde Certificeringen

Databricks Data Engineer

Combineer Terraform met Databricks kennis voor een sterk profiel als cloud data engineer.

Naar Gids

Databricks Fundamentals

Bouw het platform dat je met Terraform provisioneert — leer het Databricks Lakehouse platform.

Naar Cursus

Module 4: Spark SQL

Leer SQL op het Databricks platform — de logische stap na je infrastructuur-certificering.

Naar Module

Terraform Basics Blog

Introductie artikel over Terraform voor data engineers op het DataPartner365 blog.

Lees Artikel

Terraform Skills in de Markt

Infrastructure-as-Code is een verplichte vaardigheid geworden voor senior data engineers. Terraform domineert de IaC-markt.

+20-30%
Salarisverhoging met IaC skills
€75K-€100K
Data Engineer met Terraform + Cloud
400+
Nederlandse vacatures met Terraform
3 weken
Gemiddelde voorbereidingstijd