EC2 インスタンスタイプ変更時の Insufficient Instance Capacity エラーをオンデマンドキャパシティ予約で回避するには

2022.09.01

インスタンスタイプの変更時にオンデマンドキャパシティ予約を適用することができるのか?を調査する機会がありました。確認した結果を共有します。

想定される環境

古い世代の m1, m2 インスタンの EC2 が起動しているとします。メンテナンスや、スペック不足などの理由で古い世代のままでスペックの高いものへ変更したいとしましょう。具体的にはm2.xlargeからm2.4xlargeへ変更する様な場合です。

古のインスタンスタイプですのでキャパシティ不足(Insufficient Instance Capacity)で停止し、インスタンスタイプを変更後、すぐに起動できないことが懸念されます。

新しい世代のインスタンスへ移行できない理由があったり、放置されているわりにはダウンタイムを最小限にしないといけないという厳しい社内事情があったりするかもしれません。

対策として EC2 にはオンデマンドキャパシティ予約があります。起動予定のインスタンスのリソースを予約(確保)できます。詳しくは以下のリンクを参照ください。

インスタンスタイプ変更時にインスタンスの適格性を対象指定で適用できるのかが疑問でした。

確認結果

インスタンスタイプ変更操作にオンデマンドキャパシティ予約を適用させるには

  • インスタンスタイプの適格性はオープン指定でオンデマンドキャパシティ予約を作成する必要がある
    • インスタンスタイプ変更時にキャパシティー予約の ID を指定できないため対象指定ができない
  • オープンで予約する都合、他のインスタンスに予約枠をとられる可能性があるため注意する
    • 目的のインスタンスに予約枠があたるかはわからない
  • aws ec2 modify-instance-attributeのオプションに予約枠を指定するものは用意されていない

やってみる

m2.xlargeap-northeast-1cで起動しています。OS は Amazon Linux 2 です。こちらのインスタンスを停止しm2.4xlargeへ変更する予定です。

オンデマンドキャパシティ予約を作成します。上の赤枠は一致する条件を入力するだけです。

ポイントは下の赤枠です。インスタンスタイプ変更するインスタンスに予約枠を適用するためにはインスタンスの適格性はオープンを指定します。

作成した予約枠の起動済みのインスタンスは0台と表示されています。オープンを指定する都合、作成した予約条件に合致するオンデマンドインスタンスがすでに存在している場合は予約枠が自動的にあたります。

つまり、これからインスタンスタイプを変更するインスタンスに予約枠があたりません。回避するには条件に一致するインスタンス数 +1 の数値を予約する必要がでてきます。古い世代のインスタンスであれば起動している数が限られているか、存在していない可能性もあります。

EC2 を停止しました。インスタンスタイプをm2.4xlageへ変更します。

m2.4xlargeで起動しました。

インスタンスの詳細を確認するとオンデマンドキャパシティーの予約欄に ID が表示されています。

ID をクリックするとさきほどオンデマンドキャパシティ予約に飛びます。起動済みのインスタンスは1台とカウントアップされました。予約枠を利用した安心できるインスタンスタイプ変更に成功しました。

安心したので予約をキャンセルします。

予約をキャンセルをクリックします。

ステータスは cancelled になりました。

オンデマンドキャパシティの予約一覧からみても同様にステータスを確認できます。

インスタンスのキャパシティーの予約は解除されていました。(ID の表示がなくなっています)

予約枠の取り扱いに注意は必要ですが、インスタンスタイプの変更作業にオンデマンドキャパシティ予約を利用できることを確認できました。

AWS CLI からインスタンスタイプ変更する場合は?

aws ec2 modify-instance-attribute のドキュメントを確認しました。aws ec2 modify-instance-attributeのオプションにオンデマンドキャパシティの予約 ID を指定するオプションは見当たりませんでした。

modify-instance-attribute — AWS CLI 2.7.28 Command Reference

オンデマンドキャパシティ予約のインスタンスの適格性は対象を指定で作成しても、インスタンスタイプ変更時に指定する方法がないため、オープン指定しか予約枠を適用させる方法がないようです。

予約ができない場合もある

オンデマンドキャパシティの予約でm2.2xlargeの予約を試みたとき、予約の段階でキャパシティ不足とエラーになりました。このタイミングではm2.xkargeからm2.2xlargeへインスタンスタイプ変更しようとしていたらキャパシティ不足で起動できないという自体になっていたことでしょう。

在庫復活しないかなと確認ボタン連打した結果、大量のエラーが生成されてしまいました。

まとめ

インスタンスタイプ変更操作にオンデマンドキャパシティ予約を適用させるには

  • インスタンスタイプの適格性はオープン指定でオンデマンドキャパシティ予約を作成する必要がある
    • インスタンスタイプ変更時にキャパシティー予約の ID を指定できないため対象指定ができない
  • オープンで予約する都合、他のインスタンスに予約枠をとられる可能性があるため注意する
    • 目的のインスタンスに予約枠があたるかはわからない
  • aws ec2 modify-instance-attributeのオプションに予約枠を指定するものは用意されていない

おわりに

予約には気をつける必要がありますが、念のためにリソースを確保するのもありなのではないでしょうか。

新しい世代へ移行を検討していただくのが一番安心できるかと思います。ただ、ブラックボックスになっており、なにが動いているのか、なぜ動いているのかよくわからないパンドラの箱を開けることになるかもしれません。

参考