【アップデート】EC2のリザーブドインスタンスが日時指定で購入予約が可能になりました
大栗です。
皆様リザーブドインスタンスでコスト最適化を図っているでしょうか?リザーブドインスタンス(以下RI)は利用を先にコミットすることで利用費を大幅に割り引く支払いオプションです。長期的にAWSを利用している環境では切れ目なくRIを適用したいものですが、購入操作をした瞬間(正確には数分時間がかかります)から有効になるため切れ目なく、重複なくRIを購入するのは難しいものでした。また、RIの購入忘れにより割引が適用されないということもあります。
今回アップデートによりEC2のRIで購入予約が可能になり上記の問題を解決できそうになったので、レポートします。
- Queuing Purchases of EC2 RIs
- AWS Documentation » Amazon EC2 » User Guide for Linux Instances » Amazon EC2 Instances » Instance Purchasing Options » Reserved Instances » Buying Reserved Instances » Queuing Your Purchase
EC2リザーブドインスタンス購入のキューイング
通常のRIは購入するとすぐに有効化されますが、購入をキューイングして未来日時に有効化することができるようになりました。そのためRIの有効期限が切れるタイミングに有効化することで切れ目なくRIを適用することができます。
マネージメントコンソールから購入する場合は日付のみで時刻を指定できない模様ですが、AWS CLIを使用して購入する場合は秒まで指定可能です。また、有効化する時刻より以前であればキャンセルが可能です。
注意点
- 購入できるRIのスコープはリージョン指定のみです。キャパシティを確保できるAZ指定は対象外となります。
- 指定できる購入日時は3年後までです。
やってみた
実際に購入予約を実施してみます。(本当に買うと上司に怒られそうなので予約のみで最期にキャンセルします。。。)
マネージメントコンソールとAWS CLIの両方で実施してみます。
マネージメントコンソールで購入予約してみる
内容は実施するリージョンに依存しませんが北カリフォルニアリージョンで実施してみます。
EC2のリザーブドインスタンスのコンソールを表示します。ここでリザーブドインスタンスの購入をクリックします。
購入したいRIの詳細を指定します。購入予約はリージョン指定なのでキャパシティ予約のある提供タイプのみ表示のチェックは外します。そして検索をクリックします。
購入するRIの希望個数を指定してカートに入れるをクリックします。クリック後にカートを見るが有効化するのでクリックします。
Nowとなっている箇所をクリックします。
カレンダーが表示されるので、希望する購入日付を指定します。時刻は指定できません。時刻まで指定する場合には後述のAWS CLIにより購入が必要となります。
なお、指定ができない3年より先は無効化されています。
注文をクリックします。
注文後は数分待ちます。注文直後は以下のように注文内容が表示されません。
しばらくすると、以下のようにステータスがqueuedのRIが表示されます。開始と有効期限を確認するとタイムゾーンが日本時間の00:00と23:59になっています。クライアントのロケールに合わせてタイムゾーンを調整しているようです。あまり無いかもしれませんが、他のタイムゾーンからマネージメントコンソールを使用してRIの予約購入をする場合には注意して下さい。
今回はそのまま購入は行わないのでキャンセルします。
キャンセルするRIを選択して、アクションメニューのキュー入りリザーブドインスタンスの削除をクリックします。
はい、削除するをクリックします。
ステータスがqueued-deletedとなり予約がキャンセルされました。
AWS CLIで購入予約してみる
次にAWS CLIで購入をしてみます。ここではオハイオリージョンで実施してみます。
まず購入したいRIのIDを確認します。購入したいRIの内容は以下とします。
| 項目 | 内容 | 
|---|---|
| オファークラス | コンバーティブル | 
| テナンシー | デフォルト | 
| 前払い無し | 前払いなし | 
| 期間 | 1年間 | 
| インスタンスタイプ | t3.small | 
| プラットフォーム | Linux/UNIX | 
| スコープ | リージョン指定 | 
describe-reserved-instances-offeringsコマンドを使用して、対象のRIの購入内容のIDを確認します。ここで購入したいRIの内容を指定して実行するとOfferingIdが表示されるのでメモしておきます。
| 1 2 3 4 5 6 7 8 9 | $ aws ec2 describe-reserved-instances-offerings --region us-east-2 \>   --offering-class convertible --instance-tenancy default --offering-type"No Upfront"\>   --filters \>     Name=duration,Values=31536000 \>     Name=instance-type,Values=t3.small \>     Name=product-description,Values="Linux/UNIX"\>     Name=scope,Values=Region \>   --query "ReservedInstancesOfferings[0].ReservedInstancesOfferingId""84b20b69-945d-45af-9c13-4a2a6f2316d4" | 
OfferingIdがRIのスペックの内容を表しているので、個数と有効にする時刻を指定します。時刻は--purchase-timeオプションで指定しますが、ISO 8601形式で記載します。タイムゾーンを指定しないとUTCになるので末尾に日本時間を表す+09:00を付与すると分かりやすいです。
| 1 2 3 4 5 6 7 | $ aws ec2 purchase-reserved-instances-offering --region us-east-2 \>   --reserved-instances-offering-id84b20b69-945d-45af-9c13-4a2a6f2316d4 \>   --instance-count 1 \>   --purchase-time"2019-10-30T12:34:56+09:00"{    "ReservedInstancesId": "a1234b5c-1a2b-12ab-b2a1-1ab2cd34e5fg"} | 
予約した購入をdescribe-reserved-instancesコマンドで確認します。Startが指定した日時のUTC表示となっており、Stateがqueuedになっています。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | $ aws ec2 describe-reserved-instances --region us-east-2{    "ReservedInstances": [        {            "ReservedInstancesId": "a1234b5c-1a2b-12ab-b2a1-1ab2cd34e5fg",            "OfferingType": "No Upfront",            "FixedPrice": 0.0,            "End": "2020-10-29T03:34:55.000Z",            "Scope": "Region",            "UsagePrice": 0.0,            "RecurringCharges": [                {                    "Amount": 0.015,                    "Frequency": "Hourly"                }            ],            "OfferingClass": "convertible",            "Start": "2019-10-30T03:34:56.000Z",            "State": "queued",            "ProductDescription": "Linux/UNIX",            "CurrencyCode": "USD",            "Duration": 31536000,            "InstanceTenancy": "default",            "InstanceType": "t3.small",            "InstanceCount": 1        }    ]} | 
このまま放置すると自動で購入されて上司に怒られるのでキャンセルします。キャンセルはdelete-queued-reserved-instancesコマンドを使用します。
| 1 2 3 4 5 6 7 8 9 10 | $ aws ec2 delete-queued-reserved-instances --region us-east-2 \>   --reserved-instances-ids a1234b5c-1a2b-12ab-b2a1-1ab2cd34e5fg{    "SuccessfulQueuedPurchaseDeletions": [        {            "ReservedInstancesId": "a1234b5c-1a2b-12ab-b2a1-1ab2cd34e5fg"        }    ],    "FailedQueuedPurchaseDeletions": []} | 
キャンセルしたのでStateがqueued-deletedとなりました。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | $ aws ec2 describe-reserved-instances --region us-east-2{    "ReservedInstances": [        {            "ReservedInstancesId": "a1234b5c-1a2b-12ab-b2a1-1ab2cd34e5fg",            "OfferingType": "No Upfront",            "FixedPrice": 0.0,            "End": "2020-10-29T03:34:55.000Z",            "Scope": "Region",            "UsagePrice": 0.0,            "RecurringCharges": [                {                    "Amount": 0.015,                    "Frequency": "Hourly"                }            ],            "OfferingClass": "convertible",            "Start": "2019-10-30T03:34:56.000Z",            "State": "queued-deleted",            "ProductDescription": "Linux/UNIX",            "CurrencyCode": "USD",            "Duration": 31536000,            "InstanceTenancy": "default",            "InstanceType": "t3.small",            "InstanceCount": 1        }    ]} | 
さいごに
EC2をコスト効率よく利用するためにRIの更新を切れ間なくやりたい、という要望はよく伺っていました。その要望を叶えるアップデートが登場しました。3年先まで予約できるので、次回のRI購入をスケジューリングしておくという使い方も可能だと思います。新しいインスタンスタイプが登場した時には予約をキャンセルして、再度予約を行えば問題もありません。
注意点として、予約可能なRIはリージョン指定のみですので、キャパシティの確保が必要な場合は実際の購入後にAZ指定に切り替える必要があります。
コスト効率良くEC2を利用するために活用していきましょう。またEC2以外でも同様の機能が欲しいと思いました。