AWS

LimitExceededException - Limit Exceeded

Hitting a **LimitExceededException** means your request would exceed AWS Service Quotas—you've reached the maximum number of resources, operations, or concurrent actions allowed for your account. This client-side error (4xx) happens when AWS enforces account-level or service-level limits. Most common when creating too many EC2 instances, DynamoDB tables, or IAM roles, but also appears when Service Quotas (formerly soft limits) are exceeded, concurrent operation limits are hit, or account-level resource caps are reached.

#Common Causes

  • Identity: IAM role/user limit exceeded. Service Control Policy (SCP) enforces lower limits. Account-level restrictions active.
  • Network: VPC endpoint limits. Security Group rules limit (50 rules per group). NACL rules limit (20 rules per direction).
  • Limits: EC2 instance limit (default 20 per region). DynamoDB table limit (256 per region). IAM role limit (5000 per account). Service Quota exceeded. Concurrent operation limit hit.

Solutions

  1. 1Step 1: Diagnose - Check current resource counts: EC2: aws ec2 describe-instances --query 'length(Reservations[*].Instances[*])'. DynamoDB: aws dynamodb list-tables --query 'length(TableNames)'. IAM: aws iam list-roles --query 'length(Roles)'.
  2. 2Step 2: Diagnose - Check Service Quotas: aws service-quotas list-service-quotas --service-code ec2 --query 'Quotas[?QuotaName==`Running On-Demand EC2 instances`].[QuotaName,Value,UsageMetric]' --output table. Compare current usage vs limit.
  3. 3Step 3: Diagnose - Identify which limit is exceeded: Review error message for specific service/resource. Check CloudWatch metrics for usage. Review Service Quotas dashboard.
  4. 4Step 4: Fix - Delete unused resources: EC2: aws ec2 terminate-instances --instance-ids i-xxxxx. DynamoDB: aws dynamodb delete-table --table-name TABLE_NAME. IAM: aws iam delete-role --role-name ROLE_NAME.
  5. 5Step 5: Fix - Request quota increase: aws service-quotas request-service-quota-increase --service-code SERVICE_CODE --quota-code QUOTA_CODE --desired-value NEW_VALUE. Check request status: aws service-quotas list-requested-service-quota-change-history --service-code SERVICE_CODE.

</>Code Examples

Check Current Resource Counts and Limits
1#!/bin/bash
2# Check EC2 instance count
3echo "=== EC2 Instances ==="
4INSTANCE_COUNT=$(aws ec2 describe-instances \
5  --query 'length(Reservations[*].Instances[*])' \
6  --output text)
7echo "Current instances: ${INSTANCE_COUNT}"
8
9# Check DynamoDB table count
10echo "\n=== DynamoDB Tables ==="
11TABLE_COUNT=$(aws dynamodb list-tables \
12  --query 'length(TableNames)' \
13  --output text)
14echo "Current tables: ${TABLE_COUNT}"
15
16# Check IAM role count
17echo "\n=== IAM Roles ==="
18ROLE_COUNT=$(aws iam list-roles \
19  --query 'length(Roles)' \
20  --output text)
21echo "Current roles: ${ROLE_COUNT}"
22
23# Check Service Quotas
24echo "\n=== EC2 Service Quotas ==="
25aws service-quotas list-service-quotas \
26  --service-code ec2 \
27  --query 'Quotas[?contains(QuotaName, '''On-Demand''') || contains(QuotaName, '''Instance''')].QuotaName' \
28  --output table
Request Service Quota Increase
1#!/bin/bash
2# Request EC2 instance limit increase
3SERVICE_CODE="ec2"
4QUOTA_CODE="L-34B43A08"  # Running On-Demand EC2 instances
5CURRENT_VALUE=20
6DESIRED_VALUE=50
7
8echo "=== Requesting Quota Increase ==="
9echo "Service: ${SERVICE_CODE}"
10echo "Quota: Running On-Demand EC2 instances"
11echo "Current: ${CURRENT_VALUE}"
12echo "Desired: ${DESIRED_VALUE}"
13
14aws service-quotas request-service-quota-increase \
15  --service-code ${SERVICE_CODE} \
16  --quota-code ${QUOTA_CODE} \
17  --desired-value ${DESIRED_VALUE}
18
19# Check request status
20echo "\n=== Quota Increase Requests ==="
21aws service-quotas list-requested-service-quota-change-history \
22  --service-code ${SERVICE_CODE} \
23  --query 'RequestedQuotas[*].[QuotaName,DesiredValue,Status,Created]' \
24  --output table
Delete Unused Resources to Free Up Limits
1#!/bin/bash
2# List stopped EC2 instances
3echo "=== Stopped EC2 Instances ==="
4aws ec2 describe-instances \
5  --filters "Name=instance-state-name,Values=stopped" \
6  --query 'Reservations[*].Instances[*].[InstanceId,InstanceType,LaunchTime]' \
7  --output table
8
9# Delete specific instance (be careful!)
10INSTANCE_ID="i-xxxxx"  # Replace with actual instance ID
11echo "\n=== Terminating Instance: ${INSTANCE_ID} ==="
12read -p "Are you sure? (y/N): " -n 1 -r
13echo
14if [[ $REPLY =~ ^[Yy]$ ]]; then
15  aws ec2 terminate-instances --instance-ids ${INSTANCE_ID}
16fi
17
18# List empty DynamoDB tables
19echo "\n=== DynamoDB Tables ==="
20aws dynamodb list-tables --output table
21
22# Delete unused IAM roles
23echo "\n=== Unused IAM Roles ==="
24aws iam list-roles --query 'Roles[*].[RoleName,CreateDate]' --output table | head -20

Related Errors

Provider Information

This error code is specific to AWS services. For more information, refer to the official AWS documentation.

LimitExceededException - Limit Exceeded | AWS Error Reference | Error Code Reference