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ặcinf2— 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-1etrong 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ử:
m5→m5a/m6i/m6ac5→c5a/c6ir5→r5a/r6ip3→p3dn/p4dnế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-1athườ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

