InsufficientInstanceCapacityとは
EC2やRDSで発生する事象で、特定のAZの特定のインスタンスタイプを起動するために必要な容量がAWSの物理ホスト上で確保できないため発生するエラーです。例えばap-northeast-1aのm4.largeインスタンスが非常に多く利用されていた場合、在庫がないため1aのm4.largeを起動することができなくなります。
対処法としては
・少し時間をおいて起動する(容量が空くまで待つ)
・インスタンスタイプを変更して起動する
・AZを変更して起動する
・キャパシティの予約
・リザーブドインスタンスの購入
などがあります。
状況
システムのAWS移行プロジェクトにおいてEC2を複数台使用しており、開発期間中はコスト抑制のためEC2を自動停止・自動起動するLambdaを設定していました。
時期としては環境構築が終わり、インフラのテストを実施し始めた‥というところでした。
EC2が全然起動しない!
ある朝出社すると、既に起動しているはずのEC2(ap-northeast-1cのt3.xlarge)が停止したままでした。
Lambdaのログを確認してInsufficientInstanceCapacityが原因だと分かったため、EC2管理画面から「インスタンスの開始」ボタンを押し、起動を試見ましたが、何度ボタンを押しても返ってくるのは「InsufficientInstanceCapacityにより起動できませんでした」のエラ〜メッセージのみでした。
テスト期間だったのでインスタンスタイプやAZを変更して起動することはできず、時間をおいてボタンを押すことしか出来ませんでした。Excelが開くのを待っている最中にボタンを押す‥、お昼ご飯を食べている最中にボタンを押す‥と、暇さえあればボタンを押していましたが一向に起動できませんでした。
結局
起動できたのは18:00を回ってからでした。
おそらく多くの会社で定時を過ぎたことにより使用されていたインスタンスが解放されたのでしょう。
起動できなかったインスタンスに関わるテストは実施できなかったため、もうテスト期間中はEC2を停止しないことに決めました。
感想
過去にもInsufficientInstanceCapacityに遭遇したことはありましたが数分時間を置けば起動できていたため、まさか1日中起動できないことがあるとは思っていませんでした。甘く見ていました。
今回は開発期間中だったから良かったものの、本番環境で起きたらと思うと恐ろしくなりました。EC2の場合、キャパシティ予約をせずに停止時間を取ることは避けるべきでしょう。
(RDSの場合は下記の記事内容から、そもそも停止時間をとること自体がよくないとのことです。
https://blog.serverworks.co.jp/tech/2019/06/26/stopdbinstance/
)
開発期間は開発期間で進捗遅れにも繋がったりするため、「テスト期間に入ったら1日中稼働させる」などのルールを決めても良いかもしれないです。そのため、開発期間中にかかるAWS利用料は24時間フル稼働すること前提で多めに見積もっておきましょう。