Skip to main content
Your progress
0 of 5 lessons complete0%
T3 / M3.3 / L5 OF 5 / Architect TIER / 9 min

Async exports and their guarantees

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.


TierArchitect
JTBD”Get a year of audit evidence out of the platform without the browser giving up.”
PersonasSecurity/Compliance · FinOps Lead · Engineering Leader
PrerequisitesM3.3.L3 (filtering, sorting, exporting)
Time9 minutes
Bloom verbExplain (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.

Terminal window
THREE SURFACES, THREE FORMATS
Audit logs CSV aggregator
Cost reports CSV aggregator
Recommendations .xlsx recommender

The 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

Terminal window
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.
Terminal window
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 not
wait. 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

Terminal window
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

Terminal window
Completed reports are written to object storage with a
SHORT-LIVED SIGNED DOWNLOAD URL, surfaced on the page
you started from.
For very long jobs the URL is ALSO EMAILED, so you can
close 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.

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

Terminal window
SUMMARY SAVINGS ARE DE-DUPLICATED PER RESOURCE.
It is a SUM OF MAX, never a raw sum: mutually-exclusive
levers do not stack, matching the product's own rollup.
CONSEQUENCE: BREAKDOWN ROWS MAY NOT ADD UP TO THE
OVERALL TOTAL. The sheet says so.
Terminal window
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

Terminal window
BEFORE A FIX IN 2026, THE RECOMMENDATION EXPORT
DOCUMENTED 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, search
and 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

Terminal window
Severity appears in the sheet-1 breakdown and is an
accepted filter, and it is deliberately NOT a column on
sheet 2.
WHY: severity is not surfaced in the product UI, and the
export 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:

Terminal window
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)

Terminal window
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 / N

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


Glossary terms touched

Async export · Signed download URL · Sum of max · Stale lock


Start with the bill.

Foundations takes about five hours. The first lesson is nine minutes.

Open curriculum. No login. No paywall. 290 lessons across 7 courses, three publicly verifiable credentials. Read it on the train, take the exam on a Saturday, list the credential on your résumé Monday.

5h median time to finish Foundations
0 logins, paywalls, or marketing forms
open curriculum, public credential verifier
Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console· Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console·