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.
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.
# 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.
# 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
# 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 |
# 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.
# 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.
# 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 cloudterraform taint(verouderd) /terraform apply -replace— forceer recreatie van een resourceterraform 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
datablokken
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?
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`?
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?
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?
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?
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`?
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?
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?
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?
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?
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
- HashiCorp Developer: developer.hashicorp.com/terraform/tutorials — Gratis tutorials per domein, aanbevolen als primaire studiebron
- Terraform Registry: registry.terraform.io — Providers, modules en documentatie
- Terraform GitHub: github.com/hashicorp/terraform — Issues, changelogs en examples
- Exam Review: Officiële exam review pagina — Per domein oefenvragen
- Udemy Bryan Cafferky: HashiCorp Certified Terraform Associate Practice Exams — uitgebreide oefenpakket
Gerelateerde Certificeringen
Databricks Data Engineer
Combineer Terraform met Databricks kennis voor een sterk profiel als cloud data engineer.
Naar GidsDatabricks Fundamentals
Bouw het platform dat je met Terraform provisioneert — leer het Databricks Lakehouse platform.
Naar CursusModule 4: Spark SQL
Leer SQL op het Databricks platform — de logische stap na je infrastructuur-certificering.
Naar ModuleTerraform Basics Blog
Introductie artikel over Terraform voor data engineers op het DataPartner365 blog.
Lees ArtikelTerraform Skills in de Markt
Infrastructure-as-Code is een verplichte vaardigheid geworden voor senior data engineers. Terraform domineert de IaC-markt.