platform.start

Short answer

platform.start is the JSON form of the START line. It marks the beginning of one invocation and carries the request ID — the single value that ties every other line of that execution together, and the reason a CloudWatch log group can be untangled at all.

What it is

platform.start is the smallest of the platform records and the one everything else depends on. Two fields: which request this is, and which version of the function ran it. That is all it needs to carry, because its job is to open a scope rather than to report anything.

The requestId is the important half. A CloudWatch log group receives lines from every concurrent execution of a function, interleaved in the order they happened to arrive, with no grouping of any kind. The only thing distinguishing one execution's output from another's is that identifier — stamped on this record, on the matching platform.runtimeDone and platform.report, and on every line the function logs in between. Reassembling an invocation means collecting everything that shares it.

The excerpt on this page shows why that matters more than it sounds. Two invocations start within 150 milliseconds of each other, and their output alternates: a start, a line, another start, another line, a result belonging to the first, a completion belonging to the second. Read top to bottom it is nonsense. Read by request ID it is two perfectly ordinary requests. Nothing is wrong with the logs; they are simply stored in arrival order rather than in the order that means anything.

The version field is quieter but occasionally decisive. When a function is invoked through an alias, this reports the version the alias actually resolved to — so during a weighted deployment, where an alias splits traffic between two versions, this field is what tells you which code handled a given request. If failures cluster on one version and not the other, that is visible here and essentially nowhere else in the log.

What it looks like in your logs

With Advanced Logging Controls set to JSON, this record arrives as an envelope. Here it is raw, and then read the way the text format would have shown it.

CloudWatch Logs Before

9 raw lines, in the order CloudWatch delivered them.

{"time":"2026-09-01T10:04:11.102Z","type":"platform.start","record":{"requestId":"a17c3e50-9b42-4d68-8f01-5c2e7a9b3d40","version":"$LATEST"}}
{"time":"2026-09-01T10:04:11.108Z","type":"function","record":"Request received POST /api/v2/orders"}
{"time":"2026-09-01T10:04:11.244Z","type":"platform.start","record":{"requestId":"b28d4f61-0c53-4e79-9012-6d3f8b0c4e51","version":"$LATEST"}}
{"time":"2026-09-01T10:04:11.251Z","type":"function","record":"Request received GET /api/v2/orders/ord_92ba7c"}
{"time":"2026-09-01T10:04:11.402Z","type":"function","record":"Order created order_id=ord_92ba81"}
{"time":"2026-09-01T10:04:11.409Z","type":"platform.runtimeDone","record":{"requestId":"a17c3e50-9b42-4d68-8f01-5c2e7a9b3d40","status":"success","metrics":{"durationMs":307.11,"producedBytes":184}}}
{"time":"2026-09-01T10:04:11.412Z","type":"platform.report","record":{"requestId":"a17c3e50-9b42-4d68-8f01-5c2e7a9b3d40","status":"success","metrics":{"durationMs":307.11,"billedDurationMs":308,"memorySizeMB":512,"maxMemoryUsedMB":98}}}
{"time":"2026-09-01T10:04:11.488Z","type":"platform.runtimeDone","record":{"requestId":"b28d4f61-0c53-4e79-9012-6d3f8b0c4e51","status":"success","metrics":{"durationMs":244.02,"producedBytes":1184}}}
{"time":"2026-09-01T10:04:11.491Z","type":"platform.report","record":{"requestId":"b28d4f61-0c53-4e79-9012-6d3f8b0c4e51","status":"success","metrics":{"durationMs":244.02,"billedDurationMs":245,"memorySizeMB":512,"maxMemoryUsedMB":99}}}

LogStitch After

The same lines, grouped into the invocation they belong to.

Successa17c3e50-9b42-4d68-8f01-5c2e7a9b3d40dur 307msbilled 308msmem 98/512MBlogs 4
  1. 10:04:11.102PLAT
    START RequestId: a17c3e50-9b42-4d68-8f01-5c2e7a9b3d40 Version: $LATEST
  2. 10:04:11.108
    Request received POST /api/v2/orders
  3. 10:04:11.409PLAT
    RUNTIME_DONE RequestId: a17c3e50-9b42-4d68-8f01-5c2e7a9b3d40	Status: success	Duration: 307.11 ms
  4. 10:04:11.412PLAT
    REPORT RequestId: a17c3e50-9b42-4d68-8f01-5c2e7a9b3d40	Duration: 307.11 ms	Billed Duration: 308 ms	Memory Size: 512 MB	Max Memory Used: 98 MB
Success
Status
307ms
Duration
308ms
Billed
98/512MB
Memory
81%
Headroom
No
Cold start

The panel on the right is generated by running the excerpt on the left through the same parser that powers the free web stitcher — it is what the tool actually produces for this input, not an illustration of it.

What the record contains

Every field Lambda writes in this record, and what each one is telling you.

FieldTypeMeaning
requestId string The invocation's unique identifier. Every log line and platform record for this execution carries it, and it is the key that groups them.
version string The function version this invocation ran against — $LATEST, or a published version number when invoked through an alias or a specific version.

When it appears

Once per invocation, as the first record for that request ID. On a cold start it follows platform.initStart and the initialisation is already complete by the time it appears — which is why init time is reported later, on platform.report, rather than here.

It is the boundary between initialisation and execution. Anything logged before it belongs to container startup and is not attributable to any single request; everything after it, until the matching platform.runtimeDone, belongs to this invocation.

With multiple executions running concurrently in one log group, several platform.start records appear interleaved with each other's output. That interleaving is the whole problem this record exists to solve: the requestId is what lets a reader reassemble which lines belong together.

Also seen as

The same underlying failure, worded differently by a different runtime, SDK version, or logging layer. All of these land here — there is no separate page for each phrasing.

"type":"platform.start"platform.start recordSTART RequestId JSON formatlambda json logging start

Errors that show up alongside this one, or that people mistake for it.

References

Stop reading JSON envelopes.

LogStitch renders every one of these records as a single readable line, in the invocation it belongs to — the same way the text format shows them, with the raw envelope one toggle away. Paste a log excerpt into the free web stitcher and see it, or run the Mac app against your own AWS profiles.