Sửa lỗi 'InsufficientInstanceCapacity' Khi Khởi Chạy hoặc Start EC2 Instances

intermediate☁️ AWS2026-05-17| AWS EC2, AWS CLI, Terraform, CloudFormation — mọi vùng/AZ

Error Message

An error occurred (InsufficientInstanceCapacity) when calling the RunInstances operation: We currently do not have sufficient capacity in the Availability Zone you requested.
#aws#ec2#capacity#devops

TL;DR

AWS đã hết phần cứng vật lý trong Availability Zone bạn chỉ định. Ba cách khắc phục ngay lập tức: thử AZ khác, chuyển sang loại instance tương đương, hoặc chuyển sang region khác. Để đảm bảo lâu dài — workload production, yêu cầu tuân thủ — hãy thiết lập On-Demand Capacity Reservation trước khi thực sự cần.

Nguyên nhân gây ra lỗi này

Mỗi lệnh RunInstances — và mỗi lần khởi động lại instance đã dừng — đều yêu cầu AWS cấp phát máy chủ vật lý thực sự trong một AZ cụ thể. Khi fleet hypervisor của AZ đó đã được đặt hết cho dòng instance của bạn, bạn sẽ nhận được lỗi InsufficientInstanceCapacity. Đây là vấn đề về nguồn cung, không phải vấn đề tài khoản. Tăng service quota không giải quyết được gì ở đây.

Lỗi này thường xảy ra trong các tình huống sau:

  • Khởi chạy các instance GPU nặng như p4d.24xlarge, trn1, hoặc inf2 — những loại này có nguồn cung toàn cầu rất hạn chế
  • Khởi động lại instance đã dừng: AWS đã giải phóng phần cứng khi bạn dừng instance, và giờ vị trí đó đã bị chiếm
  • Auto Scaling group được cấu hình chỉ dùng một AZ với một loại instance duy nhất
  • Triển khai vào AZ nhỏ hoặc ít tài nguyên (ví dụ: us-east-1e trong các tài khoản cũ)

Cách 1: Thử Availability Zone khác

Cách nhanh nhất, tỷ lệ thành công cao nhất. Pool capacity theo từng AZ, nên us-east-1b có thể còn nhiều trong khi us-east-1a đã hết.

# Bỏ ràng buộc AZ — để AWS tự chọn, hoặc chỉ định subnet ở AZ khác
aws ec2 run-instances \
  --image-id ami-0abcdef1234567890 \
  --instance-type m5.xlarge \
  --subnet-id subnet-0bb1234567890abcd \
  --count 1

Cần thử nhiều AZ tự động? Đây là vòng lặp shell nhanh:

#!/bin/bash
SUBNETS=("subnet-aaa" "subnet-bbb" "subnet-ccc")  # mỗi subnet ở một AZ
for SUBNET in "${SUBNETS[@]}"; do
  echo "Trying subnet $SUBNET..."
  RESULT=$(aws ec2 run-instances \
    --image-id ami-0abcdef1234567890 \
    --instance-type m5.xlarge \
    --subnet-id "$SUBNET" \
    --count 1 2>&1)
  if echo "$RESULT" | grep -q "InstanceId"; then
    echo "Success in $SUBNET"
    echo "$RESULT"
    break
  fi
  echo "Failed: $RESULT"
done

Cách 2: Chuyển sang loại instance tương đương

Các dòng instance khác nhau lấy từ các pool capacity khác nhau — ngay cả khi phần cứng bên dưới gần như giống hệt nhau. m5.xlarge (Intel) và m5a.xlarge (AMD) đều cho bạn 4 vCPU và 16 GB RAM, nhưng chúng cạnh tranh trên kho vật lý riêng biệt.

# m5.xlarge bị lỗi? Thử m6i.xlarge — cùng thông số, pool riêng biệt
aws ec2 run-instances \
  --image-id ami-0abcdef1234567890 \
  --instance-type m6i.xlarge \
  --subnet-id subnet-0bb1234567890abcd \
  --count 1

Các cặp thay thế đáng tin cậy để thử:

  • m5m5a / m6i / m6a
  • c5c5a / c6i
  • r5r5a / r6i
  • p3p3dn / p4d nếu có, nếu không thì dùng EC2 Capacity Blocks

Cách 3: Dùng Spot Instance làm phương án dự phòng

Spot lấy từ pool capacity riêng biệt. Việc On-Demand cạn kiệt không ảnh hưởng đến nó. Cách này phù hợp cho batch job, CI runner, hoặc bất kỳ workload nào có thể chịu được gián đoạn.

aws ec2 run-instances \
  --image-id ami-0abcdef1234567890 \
  --instance-type m5.xlarge \
  --subnet-id subnet-0bb1234567890abcd \
  --instance-market-options '{"MarketType":"spot","SpotOptions":{"SpotInstanceType":"one-time"}}' \
  --count 1

Cách 4: Đặt trước capacity với On-Demand Capacity Reservations

Đang chạy traffic production hoặc workload nhạy cảm về tuân thủ? Đừng đánh cược vào việc capacity sẽ còn khi bạn cần. Hãy tạo reservation trước — trước khi sự cố buộc bạn phải làm vậy.

aws ec2 create-capacity-reservation \
  --instance-type m5.xlarge \
  --instance-platform Linux/UNIX \
  --availability-zone us-east-1a \
  --instance-count 5 \
  --instance-match-criteria open

Tiêu chí match open có nghĩa là bất kỳ lần khởi chạy On-Demand nào trong AZ đó với loại phù hợp sẽ tự động dùng reservation của bạn — không cần thêm flag khi khởi chạy. Lưu ý: bạn trả theo giá On-Demand 24/7 dù instance có đang chạy hay không. Chỉ đặt trước những gì bạn thực sự sẽ dùng.

Để chỉ định reservation một cách tường minh:

aws ec2 run-instances \
  --image-id ami-0abcdef1234567890 \
  --instance-type m5.xlarge \
  --subnet-id subnet-in-us-east-1a \
  --capacity-reservation-specification \
    'CapacityReservationTarget={CapacityReservationId=cr-0123456789abcdef0}' \
  --count 1

Cách 5: Auto Scaling group — bật multi-AZ và mixed instance types

ASG chỉ dùng một AZ và một loại instance là thảm họa capacity đang chờ xảy ra. Chính sách mixed instances phân tán rủi ro trên nhiều pool cùng lúc:

aws autoscaling update-auto-scaling-group \
  --auto-scaling-group-name my-asg \
  --availability-zones us-east-1a us-east-1b us-east-1c \
  --mixed-instances-policy '{
    "LaunchTemplate": {
      "LaunchTemplateSpecification": {
        "LaunchTemplateId": "lt-0123456789abcdef0",
        "Version": "$Latest"
      },
      "Overrides": [
        {"InstanceType": "m5.xlarge"},
        {"InstanceType": "m5a.xlarge"},
        {"InstanceType": "m6i.xlarge"},
        {"InstanceType": "m6a.xlarge"}
      ]
    },
    "InstancesDistribution": {
      "OnDemandBaseCapacity": 1,
      "OnDemandPercentageAboveBaseCapacity": 100
    }
  }'

Cách 6: Với instance đã dừng không thể khởi động lại

Dừng một EC2 instance sẽ giải phóng phần cứng bên dưới trở lại pool. Khi bạn cố khởi động lại, AWS phải tìm phần cứng mới — và đôi khi không còn trong AZ đó nữa.

Ba lựa chọn, theo thứ tự từ ít đến nhiều gián đoạn:

  • Chờ và thử lại: Capacity thay đổi liên tục. Tình trạng thiếu hụt ở các AZ phổ biến như us-east-1a thường được giải quyết trong vòng 15–60 phút.
  • Tạm thời đổi loại instance: Dừng → thay đổi loại instance → khởi động. Loại khác có thể còn capacity trống.
  • Tạo AMI và khởi chạy lại ở AZ khác: Tốn công hơn, nhưng cho phép bạn di chuyển đến nơi còn capacity.
# Snapshot instance đã dừng
aws ec2 create-image \
  --instance-id i-0123456789abcdef0 \
  --name "my-instance-backup-$(date +%Y%m%d)" \
  --no-reboot

# Khởi chạy từ AMI đó ở AZ khác
aws ec2 run-instances \
  --image-id ami- \
  --instance-type m5.xlarge \
  --subnet-id subnet-in-different-az \
  --count 1

Xác nhận đã khắc phục

Khởi chạy thành công sẽ trả về InstanceId. Kiểm tra xem instance có thực sự đạt trạng thái running không:

aws ec2 describe-instances \
  --instance-ids i-0123456789abcdef0 \
  --query 'Reservations[].Instances[].{ID:InstanceId,State:State.Name,AZ:Placement.AvailabilityZone}' \
  --output table

Kết quả mong đợi:

--------------------------------------------------
|             DescribeInstances                  |
+----------------------+----------+--------------+
|          AZ          |    ID    |    State     |
+----------------------+----------+--------------+
|  us-east-1b          | i-0abc.. |  running     |
+----------------------+----------+--------------+

Trước lần khởi chạy tiếp theo, hãy kiểm tra AZ nào thực sự hỗ trợ loại instance bạn cần:

aws ec2 describe-instance-type-offerings \
  --location-type availability-zone \
  --filters Name=instance-type,Values=m5.xlarge \
  --query 'InstanceTypeOfferings[].Location' \
  --output table

Tài liệu tham khảo

  • Tài liệu AWS: On-Demand Capacity Reservations — đảm bảo capacity trong các AZ cụ thể
  • Tài liệu AWS: EC2 Capacity Blocks for ML — đặt trước instance GPU theo khung thời gian
  • Tài liệu AWS: Auto Scaling mixed instances policy — xây dựng fleet có khả năng phục hồi

Related Error Notes