Aller au contenu

Secteur public — Ingestion batch avec piste d'audit

Parcours personas : alice (mise en place) → bob (engineer) → carol (analyste) → alice (audit) · Catalogues : postgres_oltp_publicsector (96 départements INSEE) · Durée : ~30 min · Difficulté : étoile étoile étoile

Cette démo parcourt un cycle d'ingestion batch complet. Bob dépose un CSV dans la zone d'atterrissage, un DAG d'orchestration le ramasse, la couche Transform le normalise, la nouvelle table est enregistrée dans le Catalogue, et Carol l'interroge. Alice boucle la boucle en inspectant la piste d'audit OCSF.

Ce que la démo prouve

  • Une ingestion batch CSV est un DAG en 5 étapes : land → validate → transform → register → federate.
  • Toute lecture et écriture est capturée sous forme d'événement OCSF dans la piste d'audit.
  • Le Catalogue enregistre automatiquement la nouvelle table ; Carol n'a pas besoin de ticket.
  • Les événements OCSF sont filtrables par persona et par ressource.

Pré-requis

  • URL démo : https://demo.akko-ai.com
  • Catalogue postgres_oltp_publicsector déjà fédéré (96 départements INSEE).
  • 3 personas provisionnées : alice, bob, carol.
  • Bucket de stockage objet landing-publicsector existe (créé par akko-init).

Étape 1 — Alice prépare le bucket et le rôle d'ingestion

Se connecter en alice. Aller dans Gouvernance → Stockage objet. Confirmer que le bucket landing-publicsector est présent.

Aller dans Gouvernance → Rôles. Confirmer que akko-engineer a WRITE sur landing-publicsector/inbox/ et READ sur landing-publicsector/processed/.

Capture : tests/e2e/playwright/artefacts/demos/publicsector-ingest/01-alice-bucket.png

Étape 2 — Bob upload le batch CSV

Se déconnecter, se connecter en bob. Aller dans DevHub → Object browser.

Déposer subventions_2026_q1.csv (8 412 lignes, 7 colonnes) dans landing-publicsector/inbox/.

Résultat attendu : un toast Uploaded 8412 rows in 1.2s. La couche Orchestration détecte le nouveau fichier en 30 s.

landing-publicsector/
  inbox/
    subventions_2026_q1.csv      <-- nouveau
  processed/

Capture : tests/e2e/playwright/artefacts/demos/publicsector-ingest/02-bob-upload.png

Étape 3 — Bob déclenche le DAG d'ingestion

Aller dans DevHub → Orchestration. Localiser le DAG publicsector_csv_ingest. Cliquer Trigger.

Résultat attendu : 5 tâches réussissent dans l'ordre :

sense_landing      OK  (0,8 s)
validate_schema    OK  (1,2 s)  --> 0 ligne rejetée
transform_normalize OK (3,4 s)  --> codes région en majuscules, dates parsées
register_catalog   OK  (0,9 s)  --> table postgres_oltp_publicsector.public.subventions_2026_q1 enregistrée
publish_event      OK  (0,2 s)  --> événement OCSF envoyé à l'audit log

Total : 6,5 s.

Capture : tests/e2e/playwright/artefacts/demos/publicsector-ingest/03-dag-run.png

Étape 4 — Bob lance la transformation

Aller dans DevHub → Transform. Le DAG a déjà invoqué dbt run --select +subventions_q1_aggregated. Confirmer que le modèle est vert.

Sortie attendue :

Running with dbt=1.8.0
Found 1 model, 0 tests
1 of 1 START sql view model marts.subventions_q1_aggregated  [RUN]
1 of 1 OK   created sql view model marts.subventions_q1_aggregated  [SELECT in 0.43s]
Completed successfully

Capture : tests/e2e/playwright/artefacts/demos/publicsector-ingest/04-dbt-run.png

Étape 5 — Carol interroge la nouvelle table

Se déconnecter, se connecter en carol. Ouvrir DevHub → Éditeur SQL.

Lancer :

SELECT region_code, count(*) AS n_subventions, sum(amount) AS total_eur
FROM postgres_oltp_publicsector.public.subventions_2026_q1
GROUP BY region_code
ORDER BY total_eur DESC;

Résultat attendu : 96 lignes, une par département, triées par total. Top 5 :

| région | n_subventions | total_eur     |
| 75     | 412           | 18 472 000,00 |
| 13     | 289           | 12 105 000,00 |
| 69     | 267           | 11 820 000,00 |
| 33     | 251           | 10 940 000,00 |
| 59     | 244           | 10 612 000,00 |

Capture : tests/e2e/playwright/artefacts/demos/publicsector-ingest/05-carol-query.png

Étape 6 — Alice inspecte la piste d'audit

Se déconnecter, se connecter en alice. Aller dans Gouvernance → Piste d'audit.

Filtrer par resource = postgres_oltp_publicsector.public.subventions_2026_q1.

Résultat attendu : 5 événements OCSF visibles :

| horodatage          | acteur | action            | ressource                        | résultat |
| 2026-05-17 10:42:01 | bob    | object.put        | landing-publicsector/inbox/...   | ok       |
| 2026-05-17 10:42:31 | system | dag.start         | publicsector_csv_ingest          | ok       |
| 2026-05-17 10:42:38 | system | table.register    | postgres_oltp_publicsector...    | ok       |
| 2026-05-17 10:42:39 | system | transform.run     | dbt subventions_q1_aggregated    | ok       |
| 2026-05-17 10:45:14 | carol  | query.execute     | postgres_oltp_publicsector...    | ok       |

Cliquer n'importe quel événement pour voir le JSON OCSF brut.

Capture : tests/e2e/playwright/artefacts/demos/publicsector-ingest/06-audit-trail.png

Nettoyage

  • Optionnel : archiver la table en déclenchant le DAG publicsector_csv_archive qui déplace le CSV vers landing-publicsector/processed/.
  • Se déconnecter.

Ce que la démo prouve

  • L'ingestion batch CSV est un DAG self-service, pas un ticket.
  • Le Catalogue reste à jour sans enregistrement manuel.
  • La piste d'audit capture la chaîne de garde complète, persona par persona, en OCSF.
  • Carol tire d'une table fédérée quelques instants après l'upload de Bob.

Fichiers dans le repo

Fichier Rôle
airflow/dags/publicsector_csv_ingest.py DAG d'ingestion en 5 étapes
dbt/models/marts/publicsector/subventions_q1_aggregated.sql Agrégation curatée
helm/akko/charts/akko-init/templates/landing-buckets-job.yaml Crée le bucket

Voir aussi