Outcome
By the end of this lesson, you will be able to explain why exports run asynchronously, compare the crash-recovery model of the three export surfaces, and read the recommendation workbook without misreading its de-duplicated totals.
| Tier | Architect |
| JTBD | ”Get a year of audit evidence out of the platform without the browser giving up.” |
| Personas | Security/Compliance · FinOps Lead · Engineering Leader |
| Prerequisites | M3.3.L3 (filtering, sorting, exporting) |
| Time | 9 minutes |
| Bloom verb | Explain (Understand), Compare (Analyze), Read (Apply) |
1. Concept
A year-long audit-log export is not a request a browser can hold open. So exports run as background jobs: the HTTP request returns immediately and the work continues.
THREE SURFACES, THREE FORMATS
Audit logs CSV aggregator Cost reports CSV aggregator Recommendations .xlsx recommenderThe three do not share a crash-recovery model, and knowing which one you are using changes what you should do when an export disappears.
The two models
IN-PROCESS (audit logs, cost reports) Concurrency bounded in-process at 5 concurrent exports. NO JOBS TABLE. A pod restart DROPS PROGRESS SILENTLY. You re-trigger from the UI.
PERSISTED (recommendations only) Every export lands in a table carrying status, the requested filters, the output key, any error, and lock fields. The owning pod HEARTBEATS its lock. A sweeper reclaims rows whose lock went stale (a likely pod crash) and marks them FAILED with the reason "lock expired (owning pod likely crashed)". You re-submit.THE PRACTICAL DIFFERENCE A crashed recommendation export shows up as a FAILED ROW with a reason. A crashed audit-log export shows up as NOTHING AT ALL.
So for a long audit export, if it never arrives, do notwait. Re-trigger.Note the sweeper does not auto-respawn. The retry counter measures sweeper-attributed failures, not automatic retries, so a row with a retry count of 3 means three crashes, not three attempts on your behalf.
Admin history exists for one surface only
RECOMMENDATIONS an internal endpoint lists past export rows, so support can see who exported what and when, and can re-submit on a customer's behalf.
AUDIT LOGS no admin history.COST REPORTS no admin history.Worth knowing for a compliance conversation: “who exported our audit log and when” is answerable from the audit log itself (the export is a request like any other), not from an export history.
Delivery
Completed reports are written to object storage with aSHORT-LIVED SIGNED DOWNLOAD URL, surfaced on the pageyou started from.
For very long jobs the URL is ALSO EMAILED, so you canclose the tab.This is what the export.ready notification event (T1.M1.6.L4) carries. If your org runs long exports, subscribing to it is what turns “check back later” into “you will be told”.
The recommendation workbook
Two sheets, and the structure is worth knowing before you send one to leadership.
SHEET 1: EXECUTIVE SUMMARY Report context and traceability: organisation name and id, who generated it, when, and the applied-filter scope. Headline totals: total recommendations, resources affected, overall potential monthly and annual savings. Breakdowns by recommendation type, cloud provider, service, severity and status.
SHEET 2: RECOMMENDATION DETAILS One row per recommendation: region, resource group, tags, cloud account, monthly and annual savings, recommended action, supporting evidence, first detected, age in days, last evaluated.The traceability block on sheet 1 is what makes the workbook evidence rather than a snapshot. It records what was filtered, so somebody opening it six months later knows what the numbers were of.
The de-duplication rule, and why totals do not add up
This is the thing to understand before someone asks about it in a meeting.
SUMMARY SAVINGS ARE DE-DUPLICATED PER RESOURCE.
It is a SUM OF MAX, never a raw sum: mutually-exclusivelevers do not stack, matching the product's own rollup.
CONSEQUENCE: BREAKDOWN ROWS MAY NOT ADD UP TO THEOVERALL TOTAL. The sheet says so.WHY IT MUST WORK THIS WAY
One EC2 instance can carry a rightsizing recommendation and a schedule recommendation. You cannot capture both in full: rightsize it and the schedule saving changes; schedule it and the rightsizing saving changes.
A naive sum would present leadership with a savings figure the org could never actually capture.So when a reader adds the provider breakdown and finds it exceeds the headline, the headline is the honest number and the breakdown is a view.
One historical note worth carrying
BEFORE A FIX IN 2026, THE RECOMMENDATION EXPORTDOCUMENTED THAT IT HONOURED YOUR FILTERS AND DID NOT.It hard-coded status=open and ignored every filter.
It now genuinely honours status, provider, category,resource type, severity, cloud account, rule, searchand sort.If you have archived exports from before that fix, they are status=open snapshots regardless of what the filename or your memory says.
Severity is a summary column, not a detail column
Severity appears in the sheet-1 breakdown and is anaccepted filter, and it is deliberately NOT a column onsheet 2.
WHY: severity is not surfaced in the product UI, and theexport shows what the UI shows.That principle, an export mirrors the product rather than exposing everything the database holds, is the reason the workbook stays defensible as a description of what the customer can see.
Memory does not scale with your org
Detail rows stream through a streaming writer while the summary accumulates from counters in the same pass. No second query, no retained rows. So a 40,000-recommendation export costs the same memory as a 400-row one, which is why the export does not need a size limit.
2. Demo
A SOC 2 evidence pull, and a leadership deck, in one week:
MONDAY: audit evidence Filter: all mutations, full previous year, one org. Export to CSV. Request returned immediately.
40 minutes later: nothing.
DIAGNOSIS: audit-log exports are IN-PROCESS with no jobs table. A pod restart drops progress silently, and there is no failed row to find. There was a deploy that afternoon.
ACTION: re-triggered, subscribed to export.ready first so the second attempt would announce itself. Second attempt: signed URL arrived, plus an email.
WHAT THEY CHANGED PERMANENTLY Long audit exports now run outside deploy windows, and export.ready is subscribed. Both take a minute to set up and remove the entire failure mode.
WEDNESDAY: the leadership workbook Recommendations export, filters: open + applied, all providers, savings above $100.
Arrived as .xlsx with the traceability block naming the filter scope. That block is why the CFO's office accepted it as evidence rather than as a screenshot.
THE QUESTION IN THE MEETING "Your provider breakdown adds to $61,200 and your headline says $48,900. Which is right?"
The headline. Summary savings are de-duplicated per resource as a sum of max, because mutually-exclusive levers do not stack: an instance carrying both a rightsizing and a schedule recommendation cannot capture both in full.
A raw sum would have promised $61,200 that the org could never have captured. The sheet states this, and the person who read the note was the one who asked the question.
THE ARCHIVED-EXPORT TRAP, AVOIDED Someone produced a comparison export from eight months earlier. Its filters were not what the filename said: exports before the 2026 fix hard-coded status=open. The comparison was dropped rather than being made against a different population.3. Hands-on (6 min)
1. Start an audit-log export covering your longest available window. Note the model: in-process / persisted: ________________ If it never arrives, what will you see? ________
2. Are you subscribed to export.ready? Y / N If N, subscribe before running long exports.
3. Run a recommendations export. Open sheet 1. headline potential savings $______ sum of the provider breakdown $______ Do they match? Y / N Explain the difference in one line: ______________________________________________
4. On sheet 1, find the traceability block. What filter scope does it record? ______________________________________________
5. Check any archived recommendation export from before 2026. Does its content match its stated filters? Y / N4. Knowledge check
Q1
A long audit-log export never arrives and no error appears anywhere. The explanation:
A. Audit-log exports run in-process with no jobs table, so a pod restart drops progress silently
B. The export is still running, since a large audit export can take many hours to finish
C. The signed URL expired before you opened it
D. The export exceeded the concurrency limit and was rejected
Show answer
Correct: A. There is no failed row to find, and the correct action is to re-trigger. Only recommendation exports persist, and a crashed one appears as a failed row with a reason. The practical habit that removes this failure mode entirely: run long exports outside deploy windows and subscribe to export.ready so a completed export announces itself.
Q2
A recommendation workbook’s provider breakdown sums to more than its headline savings figure. Which is correct?
A. The breakdown, since it is itemised
B. Neither; the export is inconsistent
C. Both, for different time windows
D. The headline
Show answer
Correct: D. Summary savings are de-duplicated per resource as a sum of max rather than a raw sum, because mutually-exclusive levers do not stack: an instance carrying both a rightsizing and a schedule recommendation cannot capture both in full. The sheet states that breakdown rows may not add to the total. A raw sum would present leadership with a savings figure the org could never capture, which is the specific over-claim this rule prevents. It matches the product’s own rollup, so the workbook and the UI agree.
Q3
Severity appears in the workbook’s sheet-1 breakdown but is not a column on sheet 2. Why?
A. It would make the detail sheet too wide
B. Severity is only meaningful in aggregate
C. Severity is not surfaced in the product UI, and the export shows what the UI shows
D. It is derived at read time and therefore cannot be exported on a per-row basis
Show answer
Correct: C. An export that mirrors the product rather than exposing everything the database holds stays defensible as a description of what the customer can actually see. It remains an accepted filter, so you can scope an export by severity even though it does not appear as a detail column.
5. Apply
Subscribe to export.ready and schedule long audit exports outside deploy windows. Those two changes remove the only failure mode the in-process surfaces have.
When a recommendation workbook goes to leadership, point at the de-duplication note before someone adds the breakdown themselves. Explaining it first is a credibility gain; explaining it afterwards is a correction.
Related lessons
- L3: Filtering, sorting, exporting
- L4: Audit as compliance evidence
- T1.M1.6.L4: The subscribable event catalogue
- T2.M2.1.L5: Reading a recommendation card
Glossary terms touched
Async export · Signed download URL · Sum of max · Stale lock