📑

余るAzure予約を分割して使用率100%を目指す

2024/11/21に公開

Azureコストの削減方法を見つける為に日々Azureポータルとにらめっこしているイオンスマートテクノロジー株式会社(AST)の 岩崎 です。

Azureの予約を分割できる事を知らず予約購入する時に他のサブスクリプションに適用できるようしていました。
例えばVM数10個の予約を購入するときはVM数5個、VM数5個を予約を2回購入していました。
今後はこんなことをせずに予約が購入できそうです。

早速、予約分割が役に立ったケースが発生したので紹介させて頂きます。

VM予約のスコープを「単一のサブスクリプション」や「一つのリソースグループ」としている場合、Azure予約を購入した後に対象のVMがライトサイジング(スケールダウンやスケールイン)されると購入した予約が余ってしまったりしませんか?
他のサブスクにVMがある場合はスコープを「共有」にすれば予約を余すことなく適用できたりします。※予約を全部購入していない事が前提ですが。

でも「共有」にした場合、どのリソースに予約を適用するか選べないのでVMのインスタンスサイズは変更していないのに予約が適用されたり適用されなかったりされる為、日々のコストが変動してしまい、コスト管理する観点からは不都合が出てきます。(減ったり増えたりする理由を調査するのは困難と言うか大変)
私はできる限り、サブスクリプション毎にコストを管理できるようにスコープは「単一のサブスクリプション」にしています。

今回予約を分割するに至った流れを簡単に紹介したいと思います。
今迄は予約の交換で対応していましたが、今後は予約の分割で対応していけそうです。

予約の交換と分割の違い

「交換」は新しい購入金額が払戻額より大きくなければいけません。
「交換」は指定した数を返却して、指定した数を新規に購入する事をします。
簡単に説明すると
前提:予約のスコープは「単一のサブスクリプション」

  • リソース:VM D4s_v4×3個
  • 予約:VM D4s_v4×3個

があります。

ある日リソースが1個削除されました

  • リソース:VM D4s_v4×2個

すると、D4s_v4×1個分の予約が余ってしまいます。
もったいないので、D4s_v4×1個を「交換」するか「返品」する事ができます。
「交換」はD4s_v4×1個の返金額の合計が10万だとした場合、新規に購入する予約はこの10万を超える必要があります。1個返品して、新規に超えた金額分購入するのが「交換」となります。購入なので終了日が1年後or3年後となります。交換で購入した予約は他のサブスクリプションに適用して、まだ予約を購入していないVMに予約を適用する事ができます。

因みに「返品」は年間の返金額が決まっているので注意する必要があります。

https://learn.microsoft.com/ja-jp/azure/cost-management-billing/reservations/exchange-and-refund-azure-reservations

「分割」は新規で購入する訳ではないので予約の終了日は分割前の終了日のままです。
システムの終了日が決まっている場合は予約はその終了日と一緒にしないと予約が無駄になってしまいますので、そのようなケースでは終了日が変わらないのがうれしい。(伝わるかな?)

Azure予約を分割する準備

インストールしてない場合はインストールします
PowerShellの場合

Install-Module Az.Reservations

分割したい「ReservationOrderId」と「ReservationId」をAzureポータルから取得する。
予約の一覧から対象の予約を選択し「概要」の画面から「予約ID」、「予約注文ID」が確認できます
「予約ID」=「ReservationId」
「予約注文ID」=「ReservationOrderId」

Azure予約を分割

「-Quantity」の後に予約数を2つ指定するのだが、ドキュメントから読み取る事が難しく、わかり次第アップデートします。

実行

私の分割した予約のVMの数量が2つでしたので、実際のコマンドは以下のように「1,1」を入力しました。
予約の数量により変動する数値となります。

Split-AzReservation -ReservationOrderId [予約注文ID] -ReservationId [予約ID] -Quantity 1,1

実行結果

1,2行目が分割後の予約で3行目が分割前の予約が表示されているようです。「State」から推測。

Location  ReservationOrderId/ReservationId State     BenefitStartTime   ExpiryDate LastUpdatedDateTime SkuDescription
--------  -------------------------------- -----     ----------------   ---------- ------------------- --------------
japaneast 2                                Succeeded 2024/08/20 7:35:16            2024/11/15 2:22:37  Reserved VM Instance, Standard_D4s_v4, JA East, 3 ...
japaneast 2                                Succeeded 2024/08/20 7:35:16            2024/11/15 2:22:37  Reserved VM Instance, Standard_D4s_v4, JA East, 3 ...
japaneast 12                               Cancelled 2024/08/20 7:35:16            2024/11/15 2:22:37  Reserved VM Instance, Standard_D4s_v4, JA East, 3 ...

確かにAzureポータルの予約一覧をみると、予約が2つに分かれています。
予約注文IDは同じで新たに予約IDが発番されてました。
イメージは
■分割前
予約注文ID:A 予約ID:a
■分割後
予約注文ID:A 予約ID:b
予約注文ID:A 予約ID:c

まとめ

  • 予約の購入は計画的に
  • なのですが、不測の事態には分割する事で使用率を100%に近づける事ができます

参考ページ

予約分割のドキュメントに例があるのですが、うーん、理解できなかった。
https://learn.microsoft.com/ja-jp/azure/cost-management-billing/reservations/manage-reserved-vm-instance#split-a-single-reservation-into-two-reservations

こちらはコマンドリファレンス
https://learn.microsoft.com/en-us/powershell/module/az.reservations/split-azreservation?view=azps-12.5.0

イオングループで、一緒に働きませんか?

イオングループでは、エンジニアを積極採用中です。少しでもご興味もった方は、キャリア登録やカジュアル面談登録などもしていただけると嬉しいです。
皆さまとお話できるのを楽しみにしています!

https://engineer-recuruiting.aeon.info/

AEON TECH HUB

Discussion