Delivery kit

Annex — Tier 2 / 2.5: hosted pipelines

Last changed 2026-08-18 · all documents · security & deployment

Applies when something runs on a schedule: reads client data from a source system, aggregates it, and publishes an output the client opens. This annex adds to baseline-runbook.md.

Tier 2 is where the honest answer to "does our data leave our environment?" changes from "no" to "it depends how we set it up" — so the first section is the one that matters most.

Where the code runs

I decide this with the client before building, and I write the answer into the data-flow diagram. Preference order:

  1. Inside the client's tenant — their Azure subscription, their Function App or scheduled job, their storage. Data never crosses a boundary, they can see and kill it, and there is no bus-factor problem if I disappear. This is the default I argue for.
  2. My EU-region infrastructure, client-owned credentials — used when the client has no place to run it or does not want to manage one. Data crosses to me, so it goes in the Art. 30 register and the DPA has to be in place first. Nothing persists between runs: the source extract is deleted once the aggregate is built, and every copy is gone within seven days of the engagement ending. That is a real constraint on me as well as a promise to them — it means a disputed number cannot be re-checked here without a fresh extract, and I say so up front rather than discovering it during an incident.
  3. My VPS — only when the first two do not fit. See annex-selfhosted.md.

Whichever it is, I state it plainly in writing rather than letting the client assume tier-1 rules still apply. Compute and storage regions are EU/EEA and I record the configured region string, not the vendor's default.

Read-only API scopes

Vault choice

Rules that do not change with the choice: secrets are injected at runtime as environment variables, never committed, never logged, never pasted into chat or a ticket. Rotation is possible without a code change — if rotating a key means editing code, the design is wrong. Keys are rotated at handover and whenever anyone with access leaves.

Backup and restore

What gets backed up:

Restore test: at least once per project, before handover, I rebuild the pipeline from the backup into a scratch environment and run it end to end. I write down the date, what I restored, how long it took, and what was missing — a restore test that finds nothing missing usually means I did not really do it.

Monitoring