ERROR REFERENCE
CREATE_FAILED / UPDATE_FAILED (a resource, not the stack)
CREATE_FAILED is not one error — it is CloudFormation
reporting that some specific resource failed for some specific
reason, followed by a wall of rollback noise. The triage skill is
finding the first failed resource and reading its
status reason; everything after it is consequence.
WHAT IT MEANS
What this event means
Each failed event carries the three things that matter: the logical
resource ID, the resource type, and a status reason - often with a
nested Resource handler returned message: "..." quoting
the actual service error. Once one resource fails, CloudFormation
cancels the siblings (Resource creation cancelled) and
rolls back the rest; those later events are noise wearing the same
*_FAILED costume.
TRIAGE
How to triage it
-
Read events oldest-first and stop at the first failure
(read-only):
aws cloudformation describe-stack-events --stack-name my-app \ --query 'reverse(StackEvents)[?contains(ResourceStatus, `FAILED`)] | [0]' - Read the nested handler message first. The quoted service error ("already exists", "not authorized", "invalid request") names the real cause; the stabilization or cancellation wording around it is the wrapper.
- Fix the resource-level cause, then redeploy. If this was the stack's first deploy, expect ROLLBACK_COMPLETE to require a delete before the retry.
AUTOMATE THE TRIAGE
Diagnose this automatically
SAM Doctor orders findings by first matching line, so the root failure outranks the rollback noise it caused - and when the status reason matches a more specific rule (a taken bucket name, a missing capability), that rule reports instead of the generic one. Runs locally; no AWS access, no log upload.
python -m pip install sam-doctor
sam-doctor diagnose deployment.log --format markdown
RELATED
Related errors
- Resource did not stabilize — the slow-resource variant of a failed create.
- Stack entered rollback — what the rest of the log is doing after the first failure.
- BucketAlreadyExists — a specific cause that often hides inside CREATE_FAILED noise.