AWSでAPIを呼び出した際に `ServiceQuotaExceededException` が発生した。恒久的な解決策として最も適切なものはどれか?
解説
正解と要点正解はService Quotasコンソールから上限引き上げリクエストを申請するです。ServiceQuotaExceededExceptionはアカウントのサービス上限(クォータ)に達したことを示すエラーであり、恒久的に解決するにはAWSに対して上限の引き上げを申請する必要があります。なぜその答えなのかエクスポネンシャルバックオフでリトライは、スロットリング(ThrottlingException)のような一時的なレート制限に対する対策です。「ServiceQuotaExceededException ThrottlingException 違い」は重要なポイントで、前者はリソース数の上限超過、後者はAPI呼び出し頻度の制限です。リトライしてもリソース上限は変わらないため、根本解決にはなりません。IAMポリシーの追加は権限不足(AccessDeniedException)に対する対策です。クォータ超過とは原因がまったく異なります。リージョン変更は一時的な回避策にはなり得ますが、恒久策とは言えません。アーキテクチャの複雑化やデータのレイテンシー問題を招くため、まずは現行リージョンでの上限引き上げが正攻法です。背景・仕組みAWSの各サービスには、アカウントごとにデフォルトのクォータ(旧称:サービスリミット)が設定されています。たとえば、EC2インスタンスのリージョンあたりの起動数、VPCの数、Lambda関数の同時実行数などです。これはAWSがインフラを安定運用するための仕組みであり、意図しない大量リソース作成からアカウントを保護する役割も持ちます。上限引き上げの申請先はService Quotasコンソール、またはAWS CLIのservice-quotasコマンドです。一部のクォータは自動承認され、即時反映されるものもあります。よくあるミスとエラークォータ超過とスロットリングを混同して、リトライロジックだけで対処しようとするケースが多く見られます。# エラー例(AWS CLI) $ aws ec2 run-instances --image-id ami-xxx --count 50 An error occurred (ServiceQuotaExceededException): You have exceeded the limit for the number of vCPUs for this instance type.このエラーに対してリトライを繰り返しても、vCPU数の上限が変わらない限り永遠に失敗します。また、どのクォータに抵触しているか確認せずに闇雲にサポートケースを出すのも非効率です。まず現在の使用量と上限を確認しましょう。# 現在のクォータを確認 $ aws service-quotas get-service-quota \ --service-code ec2 \ --quota-code L-1216C47A # 引き上げをリクエスト $ aws service-quotas request-service-quota-increase \ --service-code ec2 \ --quota-code L-1216C47A \ --desired-value 100実務での活用例本番環境のスケール前に事前申請: ローンチやセール時期の前に、必要なリソース量を見積もってクォータ引き上げを先行申請しておくのがベストプラクティスCloudWatchアラームで監視: AWS/UsageメトリクスとService Quotasを連携させ、使用率が80%を超えたらアラートを出す仕組みを構築しておくと、突然の上限到達を防げるAWS Trusted Advisorの活用: Trusted Advisorのサービス制限チェックを定期的に確認し、上限に近づいているリソースを事前に把握する