Categories of AWS SDK Failures
Most AWS SDK incidents are not new bugs. They are the same four failure modes wearing a different service's name tag.
Search across all documentation pages
Most AWS SDK incidents are not new bugs. They are the same four failure modes wearing a different service's name tag.
Once you can sort a symptom into a bucket, the diagnosis path is nearly automatic. This page gives you that map before the deeper defect walkthroughs later in this section.
ExpiredTokenException, ThrottlingException, retry storms, eventual consistency, ConsistentRead.Auth and credential failures. These show up as ExpiredTokenException, UnrecognizedClientException, or a sudden AccessDenied on a call that worked a moment ago. The cause is almost never a permissions change. It is far more often a long-lived process holding a snapshot of temporary credentials (from STS or SSO) past their expiry, instead of letting the SDK's credential provider chain refresh them.
Throttling and rate limits. ThrottlingException, TooManyRequestsException, and S3's SlowDown all mean the same thing: you exceeded a rate limit AWS enforces per account, per service, per operation. This is expected behavior under load, not a defect in the service. The defect, if there is one, is in how your client responds to it.
Retry logic gone wrong. Both SDKs retry safely by default. Trouble starts when someone reimplements retries by hand - fixed delay, no jitter, no cap - or disables the built-in strategy. Under a real outage, many clients retrying in lockstep can turn a partial degradation into a full outage.
Data-consistency surprises. A write completes successfully, but the very next read does not reflect it - or a role you just created gets AccessDenied for a few seconds. This bucket is really a set of per-service consistency guarantees that differ from what people assume.
These buckets interact more than they first appear to.
A credential that is one minute from expiring can produce an error that looks like throttling if your error handling is too broad and just logs "AWS call failed." A retry storm caused by naive retry logic often manifests as an increase in ThrottlingException counts, because the retries themselves are now the load. And a consistency surprise right after a CreateRole call can look like an auth bug, when the real issue is IAM propagation delay, not a bad policy.
# --- Python (boto3) ---
from botocore.exceptions import ClientError
try:
response = client.some_operation()
except ClientError as err:
code = err.response["Error"]["Code"]
# Route by code, not by a generic "it failed" log line.
if code in ("ExpiredTokenException", "UnrecognizedClientException"):
print("auth/credential bucket")
elif code in ("ThrottlingException", "TooManyRequestsException", "SlowDown"):
print("throttling bucket")
else:
print(f"other: {code}")// --- TypeScript (AWS SDK v3) ---
try {
await client.send(command);
} catch (err) {
const name = (err as { name?: string }).name;
// Route by name, not by a generic catch-all message.
if (name === "ExpiredTokenException" || name === "UnrecognizedClientException") {
console.log("auth/credential bucket");
} else if (name === "ThrottlingException" || name === "SlowDown") {
console.log("throttling bucket");
} else {
console.log(`other: ${name}`);
}
}This is the habit worth building: branch on the error code or name first, before you decide which playbook to reach for.
At scale, the same bucket can present differently depending on where in the stack it is observed.
ExpiredTokenException appears across many hosts at roughly the same moment, it usually means a fleet of long-running processes all cached credentials near the same startup time. A single host failing intermittently points elsewhere.ThrottlingException under normal load suggests you are near a real service limit and should request a quota increase or batch requests. A sudden spike usually means a traffic pattern change (a backfill job, a new caller) rather than a limit that moved.ThrottlingException/SlowDown/TooManyRequestsException are. Auth errors and validation errors need a different fix entirely.Look at the exception name first. ExpiredTokenException/AccessDenied point to auth, ThrottlingException/SlowDown point to rate limits, a sudden spike in overall error volume during an existing incident points to retries, and "the data doesn't match what I just wrote" points to consistency.
Yes, and it is common during a real incident. A dependency outage triggers throttling and errors, naive retry logic amplifies it into a storm, and the noise makes an unrelated credential expiry harder to spot.
Sometimes indirectly - a retry storm or a missing pagination limit can generate far more requests than the workload actually needs, pushing you into limits you would not otherwise hit.
Because they are time-bound. The credential works right up until its expiry, then fails, and if the process refreshes on the next restart it can look like the issue "fixed itself."
Yes. Since December 2020, S3 provides strong read-after-write consistency for all object operations in every region, so the old "wait and retry" pattern for S3 reads is no longer necessary.
Each bucket has its own defect walkthrough in this section - throttling, credential expiry, retry storms, and eventual consistency - with symptom, diagnosis, and fix for that specific failure mode.
Stack versions: This page was written for boto3 1.43.x (Python 3.10+) and the AWS SDK for JavaScript v3 (Node.js 18+).
Reviewed by Chris St. John·Last updated Jul 23, 2026