LakeFormation & Unity Catalog: Data Governance in 2026

Gepubliceerd: 4 mei 2026
Leestijd: 12 minuten
Dataplatformen

Vergelijk AWS LakeFormation en Databricks Unity Catalog voor centrale toegangsbeheer, fine-grained beveiliging en AVG-compliance in je data platform.

Data Governance in 2026: Waarom Nu Meer dan Ooit

De datawereld staat nooit stil. In 2026 beheren organisaties petabytes aan gevoelige data verspreid over meerdere clouds, on-premises systemen en SaaS-platforms. De AVG (GDPR) is inmiddels strenger gehandhaafd dan ooit — boetes van tientallen miljoenen euro's zijn geen uitzondering meer voor Nederlandse ondernemingen die hun databeleid niet op orde hebben. Tegelijkertijd eisen business-units snelle, zelfbedienings-analytics zonder weken te wachten op data-toegangsverzoeken.

Twee platformen domineren momenteel het debat rond enterprise data governance: AWS Lake Formation voor organisaties die zwaar inzetten op het AWS-ecosysteem, en Databricks Unity Catalog voor teams die werken met een multi-cloud of Spark-georiënteerde stack. Beide beloven fine-grained access control, centrale beheersbaarheid en compliance-ondersteuning — maar hun aanpak verschilt wezenlijk.

In dit artikel duiken we diep in beide oplossingen: hoe ze werken, wanneer je welke kiest, en hoe je ze productie-waardig implementeert. Met concrete codevoorbeelden, een eerlijke vergelijking en praktische tips voor Nederlandse data-engineers en architecten.

Kernbegrippen

Unity Catalog: De gecentraliseerde governance-laag van Databricks die data-assets (tabellen, views, volumes, modellen) beheert over meerdere workspaces en clouds heen via één unified metastore.

AWS Lake Formation: AWS-service die fine-grained toegangscontrole biedt op data die is opgeslagen in Amazon S3, beheerd via een centrale permissie-laag bovenop de bestaande IAM-structuur.

Fine-grained access control (FGAC): Toegangsbeheer op rij- en kolomniveau, in tegenstelling tot grove S3-bucket of database-niveau permissies.

Unity Catalog: Architectuur en Werking

Unity Catalog introduceert een drielaags namespace: catalog.schema.table. Dit klinkt simpel, maar de consequenties zijn enorm. Waar je voorheen per Databricks-workspace een aparte metastore had (Hive Metastore), beheer je nu alle data-assets centraal — inclusief Delta-tabellen, externe tabellen, views, functies, ML-modellen en volumes.

1

Account-level Metastore

Eén Unity Catalog metastore per regio, gelinkt aan je Databricks Account. Alle workspaces binnen die regio delen dezelfde governance-laag. Data staat in je eigen cloud storage (S3, ADLS of GCS) — Databricks slaat geen klantdata op.

2

Catalogs als Isolatie-eenheid

Een catalog is de hoogste namespace en is ideaal voor omgeving-scheiding (dev/test/prod) of business-unit isolatie. Elke catalog heeft een eigen storage root en kan afzonderlijk worden beheerd.

3

Schemas, Tabellen en Volumes

Binnen een catalog maak je schemas (vergelijkbaar met databases). Tabellen kunnen managed of external zijn. Volumes zijn voor ongestructureerde bestanden — ideaal voor raw-landing zones.

4

Identity Federation & Groepen

Unity Catalog synchroniseert met je identity provider (Azure AD, Okta, AWS SSO) via SCIM. Groepen definieer je eenmalig op account-niveau en wijs je toe aan catalogs, schemas of tabellen.

5

Row Filters en Column Masks

De kroon op het werk: dynamische row-level security en column masking zonder views te hoeven aanmaken. Een Python/SQL-functie evalueert bij elke query welke rijen en kolommen een gebruiker mag zien.

Unity Catalog in de Praktijk: SQL-configuratie

-- Stap 1: Catalog aanmaken en rechten toewijzen
CREATE CATALOG IF NOT EXISTS prod_financials
  MANAGED LOCATION 's3://mijn-bedrijf-unity/prod-financials/';

GRANT USE CATALOG ON CATALOG prod_financials TO `data-analysts`;
GRANT USE CATALOG ON CATALOG prod_financials TO `data-engineers`;

-- Stap 2: Schema en tabel aanmaken
CREATE SCHEMA IF NOT EXISTS prod_financials.transactions
  COMMENT 'Financiële transactiedata - AVG-gevoelig';

CREATE TABLE prod_financials.transactions.betalingen (
  transactie_id   BIGINT        NOT NULL,
  klant_id        STRING        NOT NULL,
  bsn_hash        STRING        COMMENT 'Gehashte BSN - pseudoniem',
  bedrag          DECIMAL(12,2),
  valuta          STRING,
  land            STRING,
  aanmaak_datum   TIMESTAMP,
  verwerkt        BOOLEAN
)
USING DELTA
TBLPROPERTIES (
  'delta.enableChangeDataFeed' = 'true',
  'classification'             = 'confidential',
  'data_owner'                 = 'finance-team@bedrijf.nl'
);

-- Stap 3: Granulaire permissies
GRANT SELECT ON TABLE prod_financials.transactions.betalingen 
  TO `data-analysts`;

-- Engineers mogen alles
GRANT ALL PRIVILEGES ON SCHEMA prod_financials.transactions 
  TO `data-engineers`;

Row-Level Security met Row Filters

-- Row filter functie: analisten zien alleen transacties uit eigen regio
CREATE OR REPLACE FUNCTION prod_financials.transactions.filter_regio(land STRING)
RETURNS BOOLEAN
LANGUAGE SQL
COMMENT 'Beperkt rijen tot de regio van de ingelogde gebruiker'
AS $$
  CASE
    WHEN IS_MEMBER('nl-analysts') THEN land = 'NL'
    WHEN IS_MEMBER('be-analysts') THEN land = 'BE'
    WHEN IS_MEMBER('data-engineers') THEN TRUE  -- volledige toegang
    ELSE FALSE
  END
$$;

-- Filter toepassen op de tabel
ALTER TABLE prod_financials.transactions.betalingen
  SET ROW FILTER prod_financials.transactions.filter_regio ON (land);

-- Column mask voor BSN-hash: alleen security-team ziet de waarde
CREATE OR REPLACE FUNCTION prod_financials.transactions.mask_bsn(bsn_hash STRING)
RETURNS STRING
LANGUAGE SQL
AS $$
  CASE
    WHEN IS_MEMBER('security-team') THEN bsn_hash
    ELSE '***MASKED***'
  END
$$;

ALTER TABLE prod_financials.transactions.betalingen
  ALTER COLUMN bsn_hash SET MASK prod_financials.transactions.mask_bsn;

Pro Tip: Audit Logging

Unity Catalog logt automatisch elke datalezing en schrijfoperatie naar de Databricks System Tables (catalog: system.access.audit). Voor AVG-compliance kun je hier direct op querien: wie heeft welke persoonsgegevens bekeken, wanneer, en via welk notebook of job? Stel een alert in als ongebruikelijke patronen worden gedetecteerd.

-- AVG Audit: wie heeft klantdata bekeken in de afgelopen 7 dagen?
SELECT 
  user_identity.email                           AS gebruiker,
  request_params.table_full_name                AS tabel,
  COUNT(*)                                      AS aantal_queries,
  MIN(event_time)                               AS eerste_toegang,
  MAX(event_time)                               AS laatste_toegang
FROM system.access.audit
WHERE action_name IN ('commandSubmit', 'runCommand')
  AND request_params.table_full_name LIKE 'prod_financials.transactions%'
  AND event_date >= CURRENT_DATE - INTERVAL 7 DAYS
GROUP BY 1, 2
ORDER BY aantal_queries DESC;

AWS Lake Formation: Architectuur en Werking

Lake Formation positioneert zich als de centrale permissie-broker bovenop het AWS data-ecosysteem. In plaats van direct S3-bucket policies en IAM-rollen te beheren, delegeer je alle data-toegang aan Lake Formation. Services als Athena, Glue, Redshift Spectrum, EMR en QuickSight respecteren deze permissies automatisch.

Glue Data Catalog Integratie

Lake Formation werkt naadloos samen met de AWS Glue Data Catalog als metadataopslag. Tabellen, databases en partities gedefinieerd in Glue worden automatisch beveiligd via Lake Formation policies.

Data Filters (Row & Column)

Net als Unity Catalog ondersteunt Lake Formation row- en column-level security via Data Filters. Deze filters zijn declaratief en worden geëvalueerd op query-tijd door de aangeroepen service.

Cross-Account Data Sharing

Met Lake Formation Resource Links en RAM (Resource Access Manager) deel je data over AWS-accounts heen. Essentieel voor data mesh-architecturen waarbij producenten en consumenten in aparte accounts opereren.

Lake Formation Configuratie via AWS CLI & CloudFormation

# Lake Formation data location registreren
aws lakeformation register-resource \
  --resource-arn arn:aws:s3:::mijn-data-lake-bucket \
  --use-service-linked-role \
  --region eu-west-1

# Database aanmaken in Glue Catalog
aws glue create-database \
  --database-input '{
    "Name": "financiele_data",
    "Description": "AVG-gevoelige financiële transacties",
    "Parameters": {
      "classification": "confidential",
      "data_owner": "finance-team@bedrijf.nl"
    }
  }'

# Lake Formation permissies toekennen: SELECT op specifieke kolommen
aws lakeformation grant-permissions \
  --principal DataLakePrincipalIdentifier=arn:aws:iam::123456789012:role/DataAnalystRole \
  --resource '{
    "TableWithColumns": {
      "DatabaseName": "financiele_data",
      "Name": "betalingen",
      "ColumnWildcard": {
        "ExcludedColumnNames": ["bsn_hash", "rekeningnummer_raw"]
      }
    }
  }' \
  --permissions SELECT \
  --permissions-with-grant-option []
# CloudFormation: Lake Formation Data Filter voor rij-niveau beveiliging
Resources:
  NLOnlyDataFilter:
    Type: AWS::LakeFormation::DataCellsFilter
    Properties:
      TableCatalogId: !Ref AWS::AccountId
      DatabaseName: financiele_data
      TableName: betalingen
      Name: nl_transactions_only
      RowFilter:
        FilterExpression: "land = 'NL'"
      ColumnWildcard:
        ExcludedColumnNames:
          - bsn_hash
          - rekeningnummer_raw

  AnalystPermission:
    Type: AWS::LakeFormation::PrincipalPermissions
    Properties:
      Principal:
        DataLakePrincipalIdentifier: !Sub 
          "arn:aws:iam::${AWS::AccountId}:role/NLDataAnalystRole"
      Resource:
        DataCellsFilter:
          TableCatalogId: !Ref AWS::AccountId
          DatabaseName: financiele_data
          TableName: betalingen
          Name: nl_transactions_only
      Permissions:
        - SELECT
      PermissionsWithGrantOption: []

Unity Catalog vs. Lake Formation: Eerlijke Vergelijking

Criterium Unity Catalog AWS Lake Formation
Multi-cloud ✅ AWS, Azure, GCP ❌ AWS-only
Engine-afhankelijkheid Optimaal met Databricks/Spark; beperkte externe integraties Breed: Athena, Redshift, EMR, Glue, QuickSight, SageMaker
Row-level security ✅ Dynamische SQL-functies (Python/SQL) ✅ Declaratieve FilterExpression
Column masking ✅ Functies met is_member() logica ✅ Via ColumnWildcard excludes (minder dynamisch)
Delta Lake / Iceberg ✅ Native Delta; Iceberg via UniForm ✅ Iceberg native; Delta via Athena/EMR
Data lineage ✅ Automatische kolom-niveau lineage ⚠️ Beperkt; via AWS Glue DataBrew of DataZone
ML-model governance ✅ MLflow-modellen in Unity Catalog ❌ Niet van toepassing (SageMaker Model Registry apart)
Prijs Inbegrepen bij Databricks Premium/Enterprise Gratis service; kosten via onderliggende services
AVG-audit logging ✅ System Tables (direct querybaar) ✅ CloudTrail + Lake Formation logs naar S3/CloudWatch
Data sharing extern ✅ Delta Sharing protocol (open standaard) ✅ Lake Formation cross-account + AWS Data Exchange
Leercurve Gemiddeld (SQL-first, vertrouwd voor analisten) Hoog (IAM + LF-permissies interactie complex)
Geschikt voor Databricks-heavy shops, multi-cloud, DS/ML-teams AWS-native organisaties, brede service-integratie

Let op: IAM-complexiteit bij Lake Formation

Een veelgemaakte fout bij Lake Formation: IAM-rollen blijven directe S3-toegang houden naast Lake Formation-permissies. Zorg dat je S3-bucket policies alleen de Lake Formation service-role toestaan, en alle andere principals weigeren. Anders omzeilen gebruikers via de AWS SDK de governance-laag volledig. Voeg dit toe aan je S3-bucket policy:

{
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::mijn-data-lake-bucket/*",
  "Condition": {
    "StringNotLike": {
      "aws:PrincipalArn": [
        "arn:aws:iam::*:role/aws-service-role/lakeformation.amazonaws.com/*",
        "arn:aws:iam::123456789012:role/DataLakeAdmin"
      ]
    }
  }
}

Hybride Aanpak: Lake Formation + Unity Catalog

In 2026 kiezen veel Nederlandse organisaties niet voor óf/óf maar voor een hybride governance-model: AWS Lake Formation als de authoritative permissie-laag op S3-niveau, gecombineerd met Unity Catalog als de Databricks-governance-laag die external locations gebruikt.

Praktijkcase: Nederlandse Retailer met Multi-Cloud Data Platform

Een Nederlandse retailer met 200+ winkels gebruikt AWS als primaire cloud voor operationele data, maar Databricks op Azure voor advanced analytics en ML. Hun governance-architectuur:

  • S3 (AWS): Lake Formation beheert toegang voor Athena, Glue ETL en QuickSight dashboards. Business users en BI-teams werken hier.
  • Unity Catalog: Data engineers en scientists op Databricks lezen via External Locations vanuit S3 (cross-cloud via S3-compatible API op Azure). Governance op kolom-niveau via Unity Catalog.
  • Synchronisatie: Een dagelijkse reconciliatie-job vergelijkt Lake Formation en Unity Catalog permissies en escaleert afwijkingen via PagerDuty.

Resultaat: AVG-audit is volledig aantoonbaar, time-to-access voor nieuwe analisten daalde van 3 weken naar 4 uur, en het aantal data-incidenten daalde met 78% in het eerste jaar.

Unity Catalog External Location naar S3

-- External Location aanmaken in Unity Catalog die verwijst naar S3
-- (vereist een Storage Credential met AWS IAM Role)
CREATE STORAGE CREDENTIAL aws_s3_prod
  WITH AWS IAM ROLE arn:aws:iam::123456789012:role/DatabricksUnityRole
  COMMENT 'Productie S3 toegang voor Unity Catalog';

CREATE EXTERNAL LOCATION prod_s3_financials
  URL 's3://mijn-data-lake-bucket/financials/'
  WITH (STORAGE CREDENTIAL aws_s3_prod)
  COMMENT 'Financiële data opgeslagen in AWS S3';

GRANT READ FILES ON EXTERNAL LOCATION prod_s3_financials TO `data-engineers`;

-- External tabel registreren vanuit S3
CREATE TABLE prod_financials.transactions.betalingen_external
  USING DELTA
  LOCATION 's3://mijn-data-lake-bucket/financials/delta/betalingen/';

-- Verificatie: Unity Catalog enforce de permissies,
-- onderliggende S3 is beschermd via Lake Formation + IAM
DESCRIBE EXTENDED prod_financials.transactions.betalingen_external;

AVG Compliance: Concrete Maatregelen

Voor Nederlandse organisaties is AVG-compliance geen nice-to-have maar een wettelijke verplichting. Beide governance-platforms bieden bouwstenen, maar de implementatie vereist bewuste keuzes.

A

Classificeer je data first

Gebruik Unity Catalog Tags of Lake Formation LF-Tags om kolommen te labelen: pii=true, special_category=true, retention_days=365. Maak governance-beleid afhankelijk van deze tags, niet van hardcoded tabelnamen.

B

Recht op vergetelheid automatiseren

Implementeer een GDPR Erasure Service: bij een verwijderverzoek triggert een API een DELETE op Delta-tabellen op basis van klant-ID. Log de actie in een audit-tabel. Delta Lake's VACUUM verwijdert daarna de fysieke bestanden na retentieperiode.

C

Pseudonimisering in de pipeline

Verwerk persoonsgegevens nooit in plain text in je Gold-laag. Hash BSN, e-mail en telefoon in de Bronze→Silver transformatie. Bewaar de mapping-tabel in een aparte, streng beveiligde catalog.

D

Data retentie afdwingen

Definieer retentiebeleid als tabel-eigenschappen en implementeer een Databricks Workflow of AWS Glue job die wekelijks verlopen data verwijdert. Log deleties voor de Functionaris Gegevensbescherming.

-- Unity Catalog: AVG-tags toewijzen aan kolommen
ALTER TABLE prod_financials.transactions.betalingen
  ALTER COLUMN klant_id SET TAGS ('pii' = 'true', 'data_subject' = 'klant');

ALTER TABLE prod_financials.transactions.betalingen
  ALTER COLUMN bsn_hash SET TAGS ('pii' = 'true', 'special_category' = 'false',
                                   'pseudonymized' = 'true');

-- Query: welke kolommen zijn PII in onze productie-catalogs?
SELECT 
  catalog_name,
  schema_name,
  table_name,
  column_name,
  tag_name,
  tag_value
FROM system.information_schema.column_tags
WHERE tag_name = 'pii' 
  AND tag_value = 'true'
  AND catalog_name LIKE 'prod_%'
ORDER BY catalog_name, table_name;

-- GDPR Erasure: verwijder alle data van klant
DELETE FROM prod_financials.transactions.betalingen
WHERE klant_id = :klant_id_param;

-- Loggen van de erasure actie
INSERT INTO prod_governance.audit.erasure_log VALUES (
  current_timestamp(),
  :klant_id_param,
  'betalingen',
  current_user(),
  'GDPR_ERASURE_REQUEST',
  :ticket_id
);

Best Practices voor Productie-implementatie

Governance as Code

Beheer al je Unity Catalog- en Lake Formation-permissies via Terraform (Databricks Provider / AWS LF Provider). Sla in Git op, review via pull requests, en deploy via CI/CD. Nooit meer handmatige UI-klikken in productie.

Groepen, niet Individuen

Ken permissies altijd toe aan groepen, nooit aan individuele gebruikers of service principals. Zo scale je governance mee met je organisatie en hoef je bij rol-wijzigingen maar één plek aan te passen.

Least Privilege by Default

Begin met nul permissies en voeg toe op basis van aantoonbare business-behoefte. Implementeer een Access Request Portal zodat gebruikers zelf een verzoek indienen, goedgekeurd door de data owner.

Terraform: Unity Catalog Infrastructure as Code

# terraform/unity_catalog/main.tf
terraform {
  required_providers {
    databricks = {
      source  = "databricks/databricks"
      version = "~> 1.38"
    }
  }
}

# Catalog aanmaken
resource "databricks_catalog" "prod_financials" {
  name    = "prod_financials"
  comment = "Productie financiële data - AVG-gevoelig"
  
  storage_root = "s3://mijn-bedrijf-unity/prod-financials/"
  
  properties = {
    data_classification = "confidential"
    data_owner          = "finance-team@bedrijf.nl"
    gdpr_applicable     = "true"
  }
}

# Schema
resource "databricks_schema" "transactions" {
  catalog_name = databricks_catalog.prod_financials.name
  name         = "transactions"
  comment      = "Transactiedata"
}

# Groep: data-analysts
resource "databricks_group" "data_analysts" {
  display_name = "data-analysts"
}

# Permissies: analisten mogen catalog en schema gebruiken
resource "databricks_grants" "catalog_usage" {
  catalog = databricks_catalog.prod_financials.name

  grant {
    principal  = databricks_group.data_analysts.display_name
    privileges = ["USE_CATALOG"]
  }
}

resource "databricks_grants" "schema_usage" {
  schema = "${databricks_catalog.prod_financials.name}.${databricks_schema.transactions.name}"

  grant {
    principal  = databricks_group.data_analysts.display_name
    privileges = ["USE_SCHEMA", "SELECT"]
  }
}