Anonimizacja danych wrażliwych na Airflow

Utworzono: maj 2025 Zaktualizowano: 1 października 2026

z pracy

Python, Apache Airflow, AWS S3, Pandas, Docker, GitLab CI/CD, pytest

Pipeline, który bierze surowe pliki z danymi osobowymi, czyści je, anonimizuje i sprawdza, zanim ktokolwiek zacznie na nich pracować.

Pliki CSV z danymi osobowymi przychodzą do S3 i zanim ktokolwiek zacznie na nich pracować, trzeba usunąć albo zamaskować dane osobowe, ujednolicić formaty i sprawdzić, czy plik w ogóle ma sens. Pliki są różnej jakości, część niekompletna, a przy RODO trzeba potem umieć pokazać, co się z danymi działo.

Gdzie to robić

Pierwszy pomysł to załadować wszystko do bazy i maskować dane osobowe widokami albo procedurami, tylko że właśnie w bazie miało ich nie być. Drugi, jeden skrypt z crona, działa, dopóki pierwszy raz nie padnie w połowie i nie wiadomo, co już przeszło. Stanęło na Airflow, bo ponowienia i historia przebiegów są tam wbudowane, a ta historia przy okazji jest śladem do audytu, którego wymaga RODO.

Jak to jest poukładane

Zestaw DAG-ów, a w każdym małe kroki: pobranie pliku z S3, czyszczenie, ujednolicenie formatów, anonimizacja, walidacja schematu i reguł jakości. Jak coś padnie, Airflow powtarza tylko ten krok, a dla każdego typu danych można ustawić, co ma się stać z plikiem, który nie przeszedł walidacji.

python
from datetime import datetime

from airflow.decorators import dag, task


@dag(schedule=None, start_date=datetime(2025, 1, 1), catchup=False)
def anonymise_file():
    @task(retries=3)
    def fetch() -> str: ...  # plik z S3 wskazany przy uruchomieniu

    @task
    def clean(path: str) -> str: ...

    @task
    def anonymise(path: str) -> str: ...  # tu znikają albo są maskowane dane osobowe

    @task
    def validate(path: str) -> str: ...

    validate(anonymise(clean(fetch())))


anonymise_file()

Wszystko chodzi w Dockerze, testy w pytest idą w GitLab CI przy każdej zmianie i dostają dane syntetyczne, więc prawdziwe dane nie trafiają ani do repozytorium, ani do CI.