AWS EC2 オンデマンドキャパシティー予約を詳しく知る

記事タイトルとURLをコピーする

SRE部 佐竹です。
今回は EC2 の機能の1つである「オンデマンドキャパシティー予約」について詳しく説明します。

はじめに

以下のブログで、Savings Plans と Reserved Instances に絡めたキャパシティー予約の詳細を解説しました。

blog.serverworks.co.jp

ですが、オンデマンドキャパシティー予約そのものの詳しい説明は、上記ブログでできておりません。今回はこのオンデマンドキャパシティー予約のみにフォーカスした記事となります。

キャパシティー予約とは何か

キャパシティー予約とは、該当するインスタンスタイプの EC2 Instance を任意の時間に「起動可能」であるというキャパシティーを予約する権利のことです。

例えば、現在 m5.large の Windows OS である EC2 Instance を、東京リージョンの Availability Zone 1a で2台利用しているとします。また月に1度該当のサーバは静止点を取るために停止し、再度「Start=起動」する運用中とします。月に1度の停止を終えた次の営業日の朝、会社に来て EC2 Instance の状態を確認すると、サーバが1台起動できていません。調べてみると「InsufficientInstanceCapacity」エラーが発生していたことがわかりました。

このような場合、以下の条件で「キャパシティー予約」の権利を購入していれば「InsufficientInstanceCapacity」は回避できていました。

  • インスタンスタイプ : m5.large
  • プラットフォーム : Windows
  • Availability Zone : ap-northeast-1a
  • 数量 : 2

このように「確実な EC2 Instance の起動を確保する」、つまり AWS 側にあるキャパシティーを予約しておくことが「オンデマンドで」可能となる機能、それがオンデマンドキャパシティー予約です。

オンデマンド?

なおこの機能に「オンデマンド」という名前が付与されている理由は「ディスカウント効果がなく、利用料がOnDemand(定価)で請求される」という意味からきています。というのも、もともとこの「キャパシティー予約」という機能は、リザーブドインスタンスの「Zonal RI(AZ指定のRI)」にのみ実装されていた機能だからです。

ディスカウント効果とキャパシティー予約の両方を提供する Zonal RI は契約期間が1年もしくは3年となっており、気軽に使えるものではありませんでした。そこでディスカウント効果はないものの、特定の期間を任意に指定して「キャパシティー予約」ができる機能がオンデマンドキャパシティー予約という名称で提供されるようになったのです。

なお、EC2 のマネジメントコンソールでは「キャパシティーの予約」とだけ記載があります。表記は「キャパシティーの予約」ですが、「オンデマンドキャパシティー予約」が正しい機能名となっています。

docs.aws.amazon.com

キャパシティー予約を利用する

実際にキャパシティー予約を使いながら機能について説明します。

EC2のマネジメントコンソールのメニューから「キャパシティーの予約」を選択して開始します。

「キャパシティー予約の作成」を押下してキャパシティー予約を作成していきます。

最初の設定値ですが、キャパシティー予約が必要な組み合わせを選択してください。今回は、以下の設定としています。

  1. t4g.micro
  2. Linux/UNIX
  3. ap-northeast-1a
  4. Default
  5. 1

予約の詳細

「予約終了」はキャパシティー予約がいつまで必要なのか決定する項目です。手動でキャンセルすることも可能であり、予め指定した時間に期限切れとすることも可能です。

「インスタンスの利用資格」はキャパシティー予約の独自仕様なため、詳しく説明します。

インスタンスの利用資格(Instance eligibility)

本件は、後述するテーブル(機能対応表)にて特徴をまとめます。なお、都合日本語の表記と英語を併記します。日本語との対応は以下の通りです。

  • Instance eligibility:インスタンスの利用資格
    • Any instance with matching details:一致する詳細を持つ任意のインスタンス
    • Only instances that specify this reservation:この予約を指定するインスタンスのみを受け入れます。

今回、パラメータは同じで、「インスタンスの利用資格」を変えたキャパシティー予約をそれぞれ1つ作成します。

一致する詳細を持つ任意のインスタンス

cr-09d9c9729f7b7c1bb が作成されました。

この予約を指定するインスタンスのみを受け入れます。

cr-046e127760fa7e8e9 が作成されました。

以下がIDごとの設定対応表です。

CR-ID インスタンスの利用資格
cr-09d9c9729f7b7c1bb Any instance with matching details
一致する詳細を持つ任意のインスタンス
cr-046e127760fa7e8e9 Only instances that specify this reservation
この予約を指定するインスタンスのみを受け入れます。

EC2 インスタンスのキャパシティー予約の設定

本設定に対応して動作する EC2 Instance 側の設定項目は以下の通りです。EC2 Instance の Launch 画面と編集画面で表記ゆれがあります。

  • Capacity Reservation:キャパシティーの予約の設定
    • None:なし
    • Open:開く ※デフォルト値
    • Target by ID(Specify Capacity Reservation):キャパシティーの予約の指定
    • Target by group(Specify Capacity Reservation resource group):キャパシティー予約リソースグループの指定

EC2 Instance では構築時 Open がデフォルトで設定されます。

オンデマンドキャパシティー予約機能対応表

左端の [EC2] キャパシティーの予約の設定 に対してインスタンスの利用資格が [CR1] Any instance with matching details[CR2] Only instances that specify this reservation それぞれと掛け合わせて利用した場合にどのような挙動となるのか一覧にしました。以下の一覧では「オンデマンドキャパシティー予約」を「CR」と表記しています。

[EC2] キャパシティーの予約の設定 [CR1] Any instance with matching details [CR2] Only instances that specify this reservation
None [×] 常に CR なしに起動が可能であれば起動する(※) [×] 常に CR なしに起動が可能であれば起動する(※)
Open [〇] 起動時、条件に一致する CR があれば利用される [×] 起動時、一致する CR が存在しても利用されない
Open
CR 不足時の挙動
CR なしに起動が可能であれば起動する(※) 起動時一致する CR が存在しても利用されない
Target by ID [〇] 起動時、指定された CR を利用する [〇] 起動時、指定された CR を利用する
Target by ID
CR 不足時の挙動
指定された CR が利用できない場合起動に失敗する 指定された CR が利用できない場合起動に失敗する
Target by group [〇] 起動時、指定されたグループ内の CR を利用する [〇] 起動時、指定されたグループ内の CR を利用する
Target by group
CR 不足時の挙動
CR なしに起動が可能であれば起動する(※) CR なしに起動が可能であれば起動する(※)

※「起動が可能であれば起動する」とは、AWS側にキャパシティーの不足がある場合に「InsufficientInstanceCapacity」が発生する可能性があることを示しています
※ここで記載する「起動」とは EC2 Instance の起動における「Launch」と「Start」両方を包括した意味合いで記載しています

以下でそれぞれの項目についての補足を実施します。

None:なし

EC2 Instance 側の設定が「 None:なし」の場合、EC2 Instance はオンデマンドキャパシティー予約の有無に関わらず(つまりオンデマンドキャパシティー予約を無視して)起動を試みます。

つまり None という設定は、明示的にオンデマンドキャパシティー予約の機能を「この EC2 Instance には使わせたくない」としたい場合に利用するオプションです。設定が None となっている限り該当の EC2 Instance はオンデマンドキャパシティ―予約は利用できないため注意してください。

Open:開く

EC2 Instance 側の設定が「Open:開く」の場合、[CR1] Any instance with matching detailsで作成したオンデマンドキャパシティー予約を起動時に参照し、条件に一致するキャパシティー予約があればそれを利用して起動します。[CR2] Only instances that specify this reservation で作成されたキャパシティー予約は参照しません。

このことからわかる通り、[CR2] Only instances that specify this reservation で作成するキャパシティー予約は、特定の EC2 Instance に紐づけない限り(基本的には)利用されません。

動作確認

実際に挙動を確認します。

上画像の通り、「Open:開く」で EC2 Instance を構築します。現在先ほど作成したキャパシティー予約 cr-09d9c9729f7b7c1bb があるため、これが適用される想定です。

想定通り、 cr-09d9c9729f7b7c1bb が EC2 Instance (OnDemand Capacity [Open]) へ自動的に割り当たり起動されました。

この状況でもう1台「Open:開く」で EC2 Instance を構築するとどうなるでしょうか?

上画像の通り、キャパシティー予約が割り当たらないまま2台目の EC2 Instance (OnDemand Capacity [Open] 2nd) が起動されました。cr-046e127760fa7e8e9Open の設定では参照されないためです。

そこで cr-046e127760fa7e8e9 を利用するため、2台目の EC2 Instance (OnDemand Capacity [Open] 2nd) の設定を変更します。

キャパシティー予約の設定を変更する

オンデマンドキャパシティー予約は、Launch 時に指定可能となっており、かつ停止している EC2 Instance においても設定変更が可能です。

停止している EC2 Instance を選択後「キャパシティー予約設定を変更」を押下することで変更します。

停止していない EC2 Instance ではメニューがグレーアウトしており設定変更が不可能となっています。

EC2 Instance (OnDemand Capacity [Open] 2nd) における「キャパシティーの予約の設定」を「Target by ID(Specify Capacity Reservation):キャパシティーの予約の指定」へと変更し、cr-046e127760fa7e8e9 を明示的に指定します。

cr-046e127760fa7e8e9 を明示的に指定した後、EC2 Instance を Start するとキャパシティー予約が割り当たった状態で起動されました。

Open:開く 停止後の挙動

EC2 Instance (OnDemand Capacity [Open]) を停止すると、オンデマンドキャパシティー予約のIDが表記から消えます。これにより、Open で利用されていたキャパシティー予約が開放され再利用可能となったことがわかります。

Open:開く CR 不足時の挙動

先ほど動作確認したため重ねての表記になるのですが、「キャパシティー予約設定」が Open となっている EC2 Instance が起動するタイミングで、条件に一致するオンデマンドキャパシティー予約の在庫が0の場合は、「オンデマンドキャパシティー予約の利用なしに、起動が可能であれば起動する」動作となります。

Target by ID:キャパシティーの予約の指定

キャパシティー予約のIDを直接指定することで、EC2 Instance と オンデマンドキャパシティー予約を 1:1 で紐づけすることが可能です。これは[CR1] Any instance with matching detailsであっても[CR2] Only instances that specify this reservation であっても全く同じ動作になります。

動作確認

先ほど、設定変更を試みた段階で、[CR2] Only instances that specify this reservation の動作は確認がとれています。

少々特殊ですが cr-09d9c9729f7b7c1bb が起動中の EC2 Instance (OnDemand Capacity [Open]) へ(Open 設定のため)自動に割り当たっている状態で、さらに停止中の EC2 Instance (OnDemand Capacity [Open] 2nd) 側にも cr-09d9c9729f7b7c1bb を指定可能か試みてみます。

上画像の通り、cr-09d9c9729f7b7c1bb を指定することが可能でした。cr-09d9c9729f7b7c1bb は「Any instance with matching details:一致する詳細を持つ任意のインスタンス」という設定で構築されたキャパシティー予約ですが、このようにID指定で固定する使い方も可能です。

つまり「Only instances that specify this reservation:この予約を指定するインスタンスのみを受け入れます。」の設定で作成されたキャパシティー予約は「単独で利用する場合に Open の EC2 Instance には利用されない」という特徴のみを持っており、それ以外は同様の使われ方となります。

Target by ID:キャパシティーの予約の指定 停止後の挙動

停止中の EC2 Instance にキャパシティー予約を指定して紐づけることからわかるように、この場合は EC2 Instance を停止した後もオンデマンドキャパシティー予約のIDとの紐づけは解除されません。

Target by ID:キャパシティーの予約の指定 不足時の挙動

キャパシティーの予約の指定を実施し、加えて「指定されたオンデマンドキャパシティー予約」が起動するタイミングで利用ができない場合、その EC2 Instance は起動に失敗してしまいます。

上画像は cr-09d9c9729f7b7c1bb が EC2 Instance (OnDemand Capacity [Open]) へ既に割り当たって利用されている状態で、EC2 Instance (OnDemand Capacity [Open] 2nd) にも cr-09d9c9729f7b7c1bb を指定し起動を試みた場合に発生したエラーです。「利用可能なキャパシティー予約がない」というエラーが表示されます。

このように EC2 Instance と オンデマンドキャパシティー予約を 1:1 で紐づけすることは可能ですが、重複した場合に起動できないリスクがあります。

そのため、運用を考えますと「Any instance with matching details:一致する詳細を持つ任意のインスタンス」設定で構築されたキャパシティー予約をID指定で活用することは控え、「Only instances that specify this reservation:この予約を指定するインスタンスのみを受け入れます。」の設定で作成されたキャパシティー予約のみをID指定で活用するほうが良いでしょう。

キャンセル済のキャパシティー予約を指定した場合

cr-007de413aaf4f845f は以前キャンセル済のオンデマンドキャパシティー予約です。マネジメントコンソールでは、(何故か)キャンセル済のキャパシティー予約を紐づけできてしまいます。このような設定をしてしまった場合、EC2 Instance の起動が必ず失敗するため注意してください。

Target by group:キャパシティー予約リソースグループの指定

以下のリリースの通りですが、2020年7月末、オンデマンドキャパシティー予約がリソースグループに対応しました。

aws.amazon.com

これは EC2 Auto Scaling などを活用する場合に、動的に増減する EC2 Instance にキャパシティー予約を割り当てることが可能となるアップデートとなっています。

今回はリソースグループを作成して、それを手動で EC2 Instance に紐づける設定を確認します。

キャパシティー予約でリソースグループを作成する

最初に記載しますと、2020年12月11日現在、AWS リソースグループのマネジメントコンソールから作成した「キャパシティー予約のグループ」は参照できないことが判明しています。そのため、CLIを利用してリソースグループを作成します。公式ドキュメントのリンクは以下の通りです。

docs.aws.amazon.com

aws resource-groups create-group

まずは構築のために json で定義ファイルを作成します。以下がそのまま利用できますので、コピーし CRGroupConfig.json というファイル名で保存してください。

[
    {
        "Type": "AWS::EC2::CapacityReservationPool"
    },
    {
        "Type": "AWS::ResourceGroups::Generic",
        "Parameters": [
            {
                "Values": [
                    "AWS::EC2::CapacityReservation"
                ],
                "Name": "allowed-resource-types"
            }
        ]
    }
]

その後、以下のコマンドを参考にキャパシティー予約のグループを作成してください。実行時はファイルを保存したディレクトリに移動してください。CRGroupName は任意の名前に変更ください。

aws resource-groups create-group --name CRGroupName --configuration file://CRGroupConfig.json

成功すると、以下の結果が返ります。

>aws resource-groups create-group --name ap-northeast-1a_t4g.micro_LinuxUNIX_CLI --configuration file://CRGroupConfig.json
GROUP   arn:aws:resource-groups:ap-northeast-1:123456789012:group/ap-northeast-1a_t4g.micro_LinuxUNIX_CLI       ap-northeast-1a_t4g.micro_LinuxUNIX_CLI
GROUPCONFIGURATION      UPDATE_COMPLETE
CONFIGURATION   AWS::EC2::CapacityReservationPool
CONFIGURATION   AWS::ResourceGroups::Generic
PARAMETERS      allowed-resource-types
VALUES  AWS::EC2::CapacityReservation
aws resource-groups group-resources

次に、作成されたグループ(今回は ap-northeast-1a_t4g.micro_LinuxUNIX_CLI )にオンデマンドキャパシティー予約を登録します。ARNが必要ですがキャパシティー予約はマネジメントコンソールからARNが取得できないため以下のコマンドの引数を参考に生成ください。

aws resource-groups group-resources --group ap-northeast-1a_t4g.micro_LinuxUNIX_CLI --resource-arns arn:aws:ec2:ap-northeast-1:123456789012:capacity-reservation/cr-046e127760fa7e8e9 arn:aws:ec2:ap-northeast-1:123456789012:capacity-reservation/cr-09d9c9729f7b7c1bb

本コマンドが成功すれば、AWS リソースグループのマネジメントコンソールに以下の通りリソースグループが表示されます。

これでリソースグループの作成は完了です。

動作確認

「キャパシティーの予約の設定」を変更し「キャパシティー予約リソースグループの指定」とします。リソースグループには先ほど作成したグループを指定します。

設定が完了すると、上画像の通り「キャパシティーの予約の設定」の箇所にリソースグループの ARN が表示されるようになります。

この状況で EC2 Instance の起動を行うとリソースグループの中から自動的にオンデマンドキャパシティー予約が選択され、割り当てされます。

ここで割り当てされている cr-046e127760fa7e8e9 は「Only instances that specify this reservation:この予約を指定するインスタンスのみを受け入れます。」の設定ですが、リソースグループでグループ化されている場合「リソースグループの中で Open のように動く」ようになります。

Target by group:キャパシティー予約リソースグループの指定 停止後の挙動

EC2 Instance を停止した後も「キャパシティー予約リソースグループのARN」との紐づけは解除されません。

Target by group:キャパシティー予約リソースグループの指定 不足時の挙動

「キャパシティー予約リソースグループ」で全てのオンデマンドキャパシティー予約が使い切られて在庫が0の場合は、Open と同様「オンデマンドキャパシティー予約の利用なしに、起動が可能であれば起動する」動作となります。

オンデマンドキャパシティー予約のキャンセル

オンデマンドキャパシティー予約は、手動もしくは事前に設定した期限によりキャンセルされます。キャンセルはそのキャパシティー予約が EC2 Instance で利用されていても、利用されていなくてもキャンセルが可能です。

そのため EC2 Instance 側の設定が「Target by ID(Specify Capacity Reservation):キャパシティーの予約の指定」となっている場合、キャンセル後の起動時に「キャンセル済のキャパシティー予約を指定した場合」でご紹介した通りのエラーが発生し起動できなくなる点にはご注意ください。

オンデマンドキャパシティー予約の利用料金

以下の点ご留意ください。

  1. キャパシティー予約が利用可能な期間、EC2 Instance が実行されている・されていないに関わらずオンデマンド料金が請求されます
  2. キャパシティー予約を利用しない期間、この利用料は EC2 の項目内に未使用(Unused Reservation)として掲載されます
  3. キャパシティー予約の条件に一致する EC2 Instance を起動する場合、当該 EC2 Instance の利用料を支払うことになります(オンデマンドキャパシティー予約の利用料としては請求されません)

実際に 2. の通り「未使用」の期間は以下の利用料が請求されていました。

$0.0108 per Unused Reservation Linux t4g.micro Instance Hour

また、本明細(Unused Reservation)は Savings Plans によるコスト削減の対象になります。

上画像にある Unused OD Capacity Reservation for t4g.micro Linux instance usage covered by Compute Savings Plans がその明細になります。

そして、オンデマンドキャパシティー予約が EC2 Instance に紐づいて利用されている期間は、通常の EC2 Instance の利用料になるためこれもまた Savings Plans のコスト削減対象になります。

詳しくは、冒頭でもご紹介しました以下ブログを合わせてご覧ください。

blog.serverworks.co.jp

まとめ

今回は EC2 の機能の1つである「オンデマンドキャパシティー予約」について詳しく説明しました。

まとめると以下の「オンデマンドキャパシティー予約機能対応表」の通りになります。改めて掲載させてください。

[EC2] キャパシティーの予約の設定 [CR1] Any instance with matching details [CR2] Only instances that specify this reservation
None [×] 常に CR なしに起動が可能であれば起動する(※) [×] 常に CR なしに起動が可能であれば起動する(※)
Open [〇] 起動時、条件に一致する CR があれば利用される [×] 起動時、一致する CR が存在しても利用されない
Open
CR 不足時の挙動
CR なしに起動が可能であれば起動する(※) 起動時一致する CR が存在しても利用されない
Target by ID [〇] 起動時、指定された CR を利用する [〇] 起動時、指定された CR を利用する
Target by ID
CR 不足時の挙動
指定された CR が利用できない場合起動に失敗する 指定された CR が利用できない場合起動に失敗する
Target by group [〇] 起動時、指定されたグループ内の CR を利用する [〇] 起動時、指定されたグループ内の CR を利用する
Target by group
CR 不足時の挙動
CR なしに起動が可能であれば起動する(※) CR なしに起動が可能であれば起動する(※)

また利用料金についても触れました。Savings Plans を併用することでオンデマンドキャパシティー予約がディスカウント可能なことがご理解頂けたかと存じます。

本ブログがオンデマンドキャパシティー予約について詳しく知りたい方の助力となれば幸いです。

ではまたお会いしましょう。

2023年4月7日 追記

本ブログの続きとも言える内容のブログを記載しましたので、合わせてご覧ください。

blog.serverworks.co.jp

佐竹 陽一 (Yoichi Satake) エンジニアブログの記事一覧はコチラ

マネージドサービス部所属。AWS資格全冠。2010年1月からAWSを利用してきています。2021-2022 AWS Ambassadors/2023 Japan AWS Top Engineers/2020-2023 All Certifications Engineers。AWSのコスト削減、最適化を得意としています。