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.
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.