マネージドサービス部 佐竹です。
オペレーションミスを回避するために、AWS CLI で複数の EC2 Instance Savings Plans を「まとめて買える」ように Excel を使った話の第二弾です。
はじめに
以前、「RDS の RI を AWS CLI でまとめて買う Excel を作成した話」というブログを記載しました。
これは、RDS の Reserved DB Instance(RI)をまとめて買う場合の作業でした。
今回、この作業を EC2 Instance Savings Plans (SP) でも同様に実施しましたので、その作業記録をエンジニアブログでしておこうというものです。
何故 AWS CLI で買うようにしたのか?
今月、東京リージョンの EC2 Instance Savings Plans を都合27種も購入予約する作業が必要となりました。
でもって、この EC2 Instance Savings Plans ですが、この購入作業が少々煩雑になるのです。
Compute SP と異なり EC2 Instance SP は指定すべき項目が増えます。加えて、今回は未来日付の予約が必須であったため、この指定も行わなければなりませんでした。
つまり、毎回以下を指定する必要がありました。
- Savings Plans type で EC2 Instance Savings Plans を選択
- Term で3年を選択
- Region で Asia Pacific (Tokyo) を選択
- Instance family で適切なファミリーを選択
- Hourly commitment に適切なコミットメントを$で入力
- Payment option で All upfront を選択
- Start date に特定の日付と時間を入力
私には、これらを UI から27回もミスせず指定しきる自信がありませんでした。というかは、途中で嫌になる気もしました。
ということで AWS CLI でまとめて買うことにしたのです。AWS CLI を使えばオペレーションミスが発生する可能性を下げられます。
AWS CLI を Excel で作成する
では本題です。
購入に必要な金額を計算する
前回の「RDS の RI を AWS CLI でまとめて買う Excel を作成した話」とは異なり、今回は Savings Plans の推奨(Recommendations)を利用しませんでした。
既に Compute SP を多数購入している場合、多くの EC2 インスタンスは既に SP によるディスカウントが行われてしまっている都合、EC2 Instance SP の推奨は役に立たない状態になってしまっているためです*1。
そこで、既に Compute SP でディスカウントされている EC2 インスタンスの利用料を「ファミリーとリージョン別に独自に分析」を行い、EC2 Instance SP の購入可能金額を計算しています*2。
ということで独自の計算によって購入すると決まったものが上画像の一覧です(コミット金額は仮のもの)。8月、9月、10月に3回に分けて購入するのは為替の変動リスクを三か月間で平均するためです*3。
AWS CLI を利用して offeringId を取得する
RI と同様、Savings Plans も AWS CLI で購入する場合に offeringId
を引数に指定することが必須になります。
これは describe-savings-plans-offerings
を利用することで確認が可能です。
ただしこの describe-savings-plans-offerings
は RI と異なり困った点が1つあります。
RI は Regional サービスです。つまり AWS CLI を実行するリージョンや、--region
の引数によって値を特定のリージョンに絞り込めます。
しかし、Savings Plans は Global サービスであるため、実行するリージョンや、--region
の引数によって値を特定のリージョンに絞り込めません。よってそのまま実行すると、とんでもない数の返り値が返ってきます。
ということで、以下のように plan-types
と durations
及び payment-options
を指定するだけでなく、--filters "name=region,values=ap-northeast-1"
とフィルターを利用してリージョンを絞り込む必要があります。
aws savingsplans describe-savings-plans-offerings --plan-types EC2Instance --durations 94608000 --payment-options "All Upfront" --filters "name=region,values=ap-northeast-1" --output text
--output text
としている理由は前回のブログと同様です。
実行すると上画像の通りの結果が返却されます。これをローカルにテキストファイルとしてダウンロードし、整形した後 Excel に取り込みます*4。
Excel で整形した後は上図の通りです。Family 別の offeringId
が取得できています。なお、この ID は全て「3年×全額前払い×EC2 Instance SP×東京リージョン」のものです。組み合わせが異なる場合別の ID となるので注意してください。
Excel で AWS CLI コマンドを作成する
先に取得しました Family 別の offeringId
を引数に利用し、create-savings-plan
で実際に購入を行うコマンドを作成していきます。
まず今回の購入に必要となる引数をドキュメントから確認します。具体的には、以下の3つがそれらです。
--savings-plan-offering-id
は取得したofferingId
を指定します(必須)--commitment
で購入する金額(1時間当たりの USD)を指定します(必須)--purchase-time
に購入予定日である「未来日付+時間」を指定します(オプション)
この中で特に重要な引数は --purchase-time
です。この指定はオプションとなっていますが、本値の指定がされていない場合は「即時購入」となってしまいます。先に記載しました通り「毎月の定期的な購入」となるよう本指定を忘れないようにします。
なお、ドキュメントに The purchase time of the Savings Plan in UTC format (YYYY-MM-DDTHH:MM:SSZ).
と記載があるように、指定の時刻フォーマット「YYYY-MM-DDTHH:MM:SSZ」に則る必要があります。またタイムゾーンは「UTC」でのみ指定が可能となっています。
というわけで、Excel に引数を設定していきます。
左から順に以下の通り記載しています。
- Family
- savings-plan-offering-id
- commitment
- purchase-time
- AWS CLI
describe-savings-plans-offerings
の結果をまとめたシートに offeringId
がファミリー別に一覧にしてあるため(先の画像の赤枠内)、ファミリーさえわかれば「=VLOOKUP(A2,Describe!B:C,2,FALSE)」等として「savings-plan-offering-id」を取得することが可能です*5。
次に、commitment 列は「購入に必要な金額を計算する」で求めた値から取得します。
「purchase-time」は今回月の半ばとしましたので、「2024-08-15T00:00:00Z」等として指定します。補足ですが、この値は必ず「未来日付」としてください。ブログの都合、今回値が過去日付になっていますが、実際には過去日付とすることはできません。
="aws savingsplans create-savings-plan --savings-plan-offering-id "&[@[savings-plan-offering-id]]&" --commitment "&[@commitment]&" --purchase-time "&[@[purchase-time]]
最後に AWS CLI の列に上記のような関数を書いて AWS CLI を作成します。
AWS CLI を実行し、結果を確認する
完成した AWS CLI の8月分(9回分のみ)が以下です。
aws savingsplans create-savings-plan --savings-plan-offering-id 920602f0-4708-46e5-a28e-c8c5ec41b8ec --commitment 1.4 --purchase-time 2024-08-15T00:00:00Z aws savingsplans create-savings-plan --savings-plan-offering-id 0a248dec-4896-42af-89eb-e821926bad3b --commitment 1.1 --purchase-time 2024-08-15T00:00:00Z aws savingsplans create-savings-plan --savings-plan-offering-id 9c2dc95f-d25a-4b0b-8884-8590a0b00c3c --commitment 1.4 --purchase-time 2024-08-15T00:00:00Z aws savingsplans create-savings-plan --savings-plan-offering-id 85cb6101-4e18-4996-b290-1ff5951ec8ec --commitment 0.9 --purchase-time 2024-08-15T00:00:00Z aws savingsplans create-savings-plan --savings-plan-offering-id 806132f2-bea9-44e2-9351-23f2fe66e9f6 --commitment 1.5 --purchase-time 2024-08-15T00:00:00Z aws savingsplans create-savings-plan --savings-plan-offering-id 525e0c99-1114-424c-a257-168aaf9955c4 --commitment 0.9 --purchase-time 2024-08-15T00:00:00Z aws savingsplans create-savings-plan --savings-plan-offering-id 8b7e1adb-2ff8-4254-85bc-c92307c60f76 --commitment 1.5 --purchase-time 2024-08-15T00:00:00Z aws savingsplans create-savings-plan --savings-plan-offering-id 59bddb62-8bfd-409f-8e06-96e6e587d0db --commitment 0.7 --purchase-time 2024-08-15T00:00:00Z aws savingsplans create-savings-plan --savings-plan-offering-id 3b305ea4-43ed-46cd-a8af-d2d438f17fd1 --commitment 0.6 --purchase-time 2024-08-15T00:00:00Z
あとはこの合計27の AWS CLI を CloudShell から実行します。実行においては購入するアカウントを間違えないよう確認の後、実行します。
実行後は、結果を Savings Plans > Inventory から確認します。
8月15日分は過去日付のため既に「Active」となってしまいましたが、予約された Savings Plans は「Queued」ステータスとなり"待ち"になります。
後はこれを証跡として Excel に転載する、もしくは画面キャプチャとして保存しておきます。
なお、これらの Savings Plans は未来日付の予約にすぎませんので、もし誤っていた場合は、期日まではいつでも削除が可能です。詳しくは以下のブログ内「Delete queued Savings Plans」をご覧ください。
おわりに
以上が EC2 Instance Savings Plans を AWS CLI でまとめて買う Excel を作成した話でした。本記事が AWS CLI で Savings Plans を購入したいと思った方の参考になれば幸いです。
ところで私は AWS CLI を実行するときはワンライナーのシンプルな AWS CLI をそれぞれ順に実行させるのが好きです。
例えばこれは、Where 区を指定しての Update SQL を実行するときに、あえてプライマリキーを指定して複数回実行する、というようなことです。私は、プログラム処理ではなく「何らかの事情で直接データベースを修正する必要が出た」場合に、対象が5つあった時は 1本の SQL で行わず、5本の SQL を実行するようにしていました。
「RDS の RI を AWS CLI でまとめて買う Excel を作成した話」でも、最近投稿した「全リージョンのデフォルト VPC を削除する Script を AWS CloudShell から実行する」においても、そのようにしています。
これは前職でデータベースの値をマニュアル修正することが多かったため、経験則で「何をしているのかが判断しやすい」「可読性を高める」ということを徹底するようになった私なりの癖です。必ずこうすべき、というものではないですが、読みやすいシンプルな AWS CLI を順に流すというのが、単純な作業では明確で良いなと今でも思っています。
では、またお会いしましょう。
*1:推奨の分析は EC2 インスタンスのオンデマンド利用料に対して行われるため
*2:この計算方法については本題ではないため割愛します
*3:これはつまり、ドル・コスト平均法のような買い方ということです
*4:このあたりの作業は前回の「RDS の RI を AWS CLI でまとめて買う Excel を作成した話」と同様のため、割愛します
*5:ここの関数の "Describe!" は Excel が参照しているシートの名称です
佐竹 陽一 (Yoichi Satake) エンジニアブログの記事一覧はコチラ
マネージドサービス部所属。AWS資格全冠。2010年1月からAWSを利用してきています。2021-2022 AWS Ambassadors/2023-2024 Japan AWS Top Engineers/2020-2024 All Certifications Engineers。AWSのコスト削減、最適化を得意としています。