御成門プログラマーの技術日記

Microsoft AzureやAngularなどの技術情報を発信します

Azure App Service で Reserved Instance を使用してリソースコストを節約しよう【Reservations・予約割引】

Azure の Reservations(予約割引) とは。

Azure の Reservations(予約割引) とは、Azureのリソースに対して1年もしくは3年分の利用を確約することで、その期間のコストの割引を受けることができる機能です。現在、Azure VMやSQL DatabaseにAzure Blob Storage などなど様々なリソースに予約割引が適用可能になっています。割引率はリソースや契約期間によって変わりますが、最大で80%引きの割引を受けることができるリソースもあります
予約で購入したインスタンスのことを Reserved Instance(リザーブドインスタンス) と呼ぶため、この機能自体を Reserved Instance と呼ぶこともありますね。予約割引についての詳細は下記Microsoft公式ページをご覧ください。
Reservations | Microsoft Azure
もちろんメリット、デメリットはありますが、予約対象のリソースでこれからも永続的に使用する予定のリソースがある場合はReservations(予約割引)を適用した方がお得です

Azure App Service の予約割引について

Azure App Service では特定のインスタンスのみ予約割引に対応しています(2022年6月6日現在だと「Premium v3」および「Isolated v2」のみ)。Azure App Service はスケールアウトができますが、インスタンス停止による課金停止やインスタンス数を0にすることができず確実に1つ以上のインスタンスが建つと思うので対象のインスタンスを継続的に使用している方は予約購入おすすめです。
Azure App Service の予約割引 | Microsoft Docs

Azure App Service の予約割引購入条件

上記でも述べたとおり、Azure App Serviceの予約購入は2022年5月23日現在 App Service Plan の SKUが「Premium v3」および「Isolated v2」インスタンスである必要があります。また、購入にあたり、下記のような条件があります。

Premium v3 予約インスタンスの購入には、次の要件が適用されます。
・少なくとも 1 つの EA サブスクリプションまたは従量課金制料金のサブスクリプションの所有者ロールである必要があります。
・EA サブスクリプションの場合、EA ポータルで [予約インスタンスを追加します] を有効にする必要があります。 または、その設定が無効になっている場合は、ユーザーはサブスクリプションの EA 管理者である必要があります。 ダイレクト EA のお客様は、Azure portal で予約インスタンスの設定を更新できるようになりました。 [ポリシー] メニューに移動して、設定を変更します。
・クラウド ソリューション プロバイダー (CSP) プログラムの場合、管理エージェントまたはセールス エージェントのみが予約購入できます。

予約容量を利用して Azure App Service のコストを節約する | Microsoft Docs より引用
今回の環境はダイレクト EA なのでAzure Portalから予約インスタンスの設定が行えました。逆に私の場合、EAポータルには予約インスタンスの設定を行う箇所は見つかりませんでした。

Azure App Service で予約割引を適用する方法/実際に試してみた

さて、実際に予約購入を行う手順を紹介していきます。まず、Azure Portal の画面から「すべてのサービス」に移動し、検索ウィンドウで「予約」と入力します。「予約」というそのままの項目が出てくるのでクリックしましょう。

予約のページでは既存に購入した予約の一覧が表示されています。今回は新規で購入するので「追加」をクリックします。

予約購入できるリソースの種類が表示されます。Azure App Service や Azure VM だけでなく、様々な種類のリソースが対応していることがわかりますね。今回は「App Service」を選択します。

App Serviceを選択したら、「購入する製品の選択」ページへと遷移します。ここで一つ重要な要素に「スコープ」があります。スコープは今回購入した製品を共有する範囲のことで、選択肢は下記4点があります

  • 共有 - 課金コンテキスト内にある有効なサブスクリプションの一致するリソースに予約割引が適用される
  • 管理グループ(プレビュー) - 管理グループと課金スコープの両方の一部であるサブスクリプションの一覧にある一致するリソースに予約割引を適用
  • 単一のサブスクリプション - 選択されたサブスクリプションの一致するリソースに予約割引を適用します
  • 1つのリソースグループ - 選択されたリソース グループ内の一致するリソースにのみ、予約割引を適用

スコープによって予約割引が適用されるリソースの範囲が変わります。スコープは予約の購入後にも変更可能とのことです。
下の画面でスコープと課金サブスクリプションを選択すると、「推奨」のタブでは現状の使用状況に応じた予約割引の製品候補が表示されます。私が使用している環境ではすでにP3V3 App Service Planが動いていますので候補に表示されるようです。1から予約割引を購入したい場合は「すべての製品」タブから選択も可能です。

上記の製品一覧は名前は同じですが、大事な設定箇所が3か所「製品名」、「契約期間」、「請求頻度」があります。 これらの設定はコストに関わる大事な部分なので設定値をよく確認しておきます。

  • 製品名 - 予約割引が適用されるSKUです。こちらで選択したSKU以外を使用しているプランには割引が適用されません
  • 契約期間 - 契約期間です。一度購入した場合、基本的に契約期間分のコストを払う必要があります。契約期間が長くなると割引率が高くなります。
  • 請求頻度 - 請求頻度の違いです。App Service Planの場合、購入時に全額支払う「前払い」、毎月支払う「毎月」払いがあります。

また、↑の画像「推奨される数量」を確認する列にある「1 - 詳細を確認する」をクリックすると、対象 App Service Plan の現状のインスタンス使用率とコストと比較した予約割引を購入した場合の節約額のシミュレーションを行うことができます。

「数量による節約」タブでは予約購入数量ごとによる予想節約額が表示されます。今回の環境ではインスタンス数が1から3の間でスケールしていて、インスタンス数1だと効率的に節約できますが、それ以上を購入すると、無駄な予約インスタンスが発生してしまうため、節約額が減っていくということがわかります。

購入する「製品」が決まったら該当の製品を選択して「レビューと購入」タブに移動します。「請求頻度」と「数量」を入力すると初回の請求金額である「本日の請求金額」と「総額」が計算されます。

「全額支払スケジュールの表示」ボタンを押すと、支払スケジュールを確認できます。今回は1年分の毎月払いなので毎月の支払金額が表示されていますね。

すべてを確認して購入します。「今すぐ購入」から確認画面で「はい」を押下。

ついに購入できました!!購入が完了すると購入処理がしばらくかかります。しばらくすると予約が完了します。

これでApp Service Plan の予約購入が完了です。 予約が完了すると、購入完了メールが届きます。ちなみにこちらのメールは購入者以外にもなんらかの強い権限(課金の系の権限かな?)を持っている方全員に飛んでいくようなのでご注意ください。

予約購入後にできること(予約使用率の確認、設定変更、払戻しと交換)

予約購入後にできることを紹介していきます。
予約が完了すると、予約の一覧に作った予約があるのでクリックすると予約の概要ページに移動します。こちらの予約の概要画面から予約の使用状況や設定変更、そして「払戻」や「交換」を行うことができます。

そして購入後しばらくすると概要欄に予約の使用率が表示されるようになります。予約購入したインスタンスがちゃんと使われているかを確認することができるため、かなり重要です。こちらの使用率が低い場合は購入した予約が無駄になっているため、一度適用される条件を確認した方がよいかと思います。ちなみに使用率の反映は毎日若干遅れるようなので、こちらの画面のように使用率が100%に達していないと表示される可能性もあるのでご注意ください。だいたい反映されるのに2日、3日かかるのかな?

「設定」→「構成」画面では購入後のスコープ変更が可能なようです。

「設定」→「更新」の画面からは予約購入の自動更新の設定を行うことが可能です。

予約購入後のAzureコスト管理やEAポータル上での反映のされ方について

予約購入後に Azure Cost Management や Azure EA Portal 上でどのようにコストが反映されるかを紹介していこうと思います。わかりづらいですが、具体的な金額は隠させていただきます。
まずこちらが全体的なコストです。6/2に予約1か月分の費用が発生しています。先ほど支払いスケジュールにもあったように今回は購入日が2日のため、これから毎月2日に一か月分のコストが計上されるようです。それに伴い、予約購入以降のコストからは1インスタンス分の費用が発生していません。この画面からですとどれだけお得になったのかはわかりづらいですね。
予約割引が適用された App Service Plan の属するリソースグループも同様に予約適用された1インスタンス分の費用が計上されなくなります。

どれだけお得になったかは予約の使用率から自分で計算するか、課金スコープの全体的なコストで比較するしかなさそうです。予約の使用率が100%ならば得はしているはずです。
そこで気になるのが、予約購入自体のコストはどちらにかかっているかということです。これは予想ですが、予約購入時に「課金サブスクリプション」は指定しているため、サブスクリプションには紐づいているが各リソースには紐づいていない課金になっていると思われます。サブスクリプションのコストを確認したところ、サービス名が「Azure App Service」、リソースグループが「Other Azure purchases」という名前で課金されていることからもリソースグループにも紐づいていないようです。
また、EAポータル側ですと使用状況の明細には予約購入の金額が反映されていませんでした(購入から1週間後の現在)。どちらにコストが発生しているかが不明な状態になっているので現在調べています。判明次第、こちらのブログに追記しようと思います。
(追記)どうやら予約購入した使用状況の明細はEAポータルには反映されないようです。この現象については下記記事で詳しく紹介しているのでそちらをご参照ください。
onarimon.jp

Azure App Service を予約割引を実際に購入してみた感想

ずっと気になっていた Reserved Instance ですが、予約購入自体はとても簡単で導入もお手軽にできると思います。予約割引のメリットを多く享受できるのは、実際にAzureにアプリケーションを載せて運用し続けているエンタープライズよりの方々かなと思いますそういった長く同じAzureリソースを使い続ける予定のある方におすすめのサービスだなと思います。私自身も仕事ではエンタープライズよりの仕事が多いので予約割引を使えるところはどんどん使っていきたいなと思います。前述しましたが、Azure App Service を確実に1年以上運用することが決まっている場合は1インスタンス分の予約購入はお得だと思います。ぜひ、ご検討ください。
以下は予約購入をするにあたり疑問に思った部分で調べたり、サポートの方に聞いた内容などをまとめた部分です。

よくある疑問点について

Q. Reserved Instance は前払いで購入する必要があるか?月額払いは可能か?

Azure App Service の 予約購入は初月に契約分の金額全額を支払う「前払い」と、総額を月数で割って毎月支払う「毎月払い」の2択で購入可能です。 さらっと確認してみましたが、App Service 以外のリソースも大体「毎月払い」はできそうでした。

Q. 月額払いは日割り計算されるのか?

月額の料金は契約金額の総額を月数で割ったもの(1年契約なら12か月)を月額として、日割り計算されずに請求されるそうです。そのため、契約初回や最後では月でフルに使っていなくても1か月分まるまる金額が課金されるようです。

Q. 新規に予約購入する際、既存の App Service Plan とは別に新規に App Service Plan を作る必要があるか?

App Service Planのリザーブドインスタンスは予約購入したスコープ内でSKUが一致しているApp Service Planがあれば自動でそのリソースに割引が適用されます。既存のリソースにそのまま予約を適用されるため、新規で作る必要はありません。

Q. Reserved Instance はApp Service Plan ごとに予約を購入する必要があるか?購入した予約インスタンスを共有で適用することができるのか?

上記でも説明したとおり、App Service Planのリザーブドインスタンスは予約購入したスコープ内でSKUが一致しているApp Service Planがあれば自動でそのリソースに割引が適用されます。例えば予約割引がかかっているApp Service Planが削除もしくはスケールインしてて予約購入した分のインスタンスが余っているのであれば同じ条件の別のApp Service Plan に割引が適用されるようです。

Q. Reserved Instance はどの範囲で共有できるのか。サブスクリプション単位?リソースグループ単位?

Reserved Instanceの共有範囲は「Azure App Service で予約割引を適用する方法」の項でも紹介したとおり、「共有」、「管理グループ」、「単一のサブスクリプション」、「1つのリソースグループ」のスコープを選択可能です。

Q. 予約の割引が適用されている App Service Plan をスケールアウトさせることは可能なのか?その場合、予約購入したインスタンス数を超えた場合どうなるのか?

予約割引が適用されている App Service Plan のインスタンス数を超えてスケールアウトすることも可能です。その場合、予約購入した分より超過している分だけ通常課金の価格が発生します。

Q. 予約の割引が適用されている App Service Plan をスケールアップさせることは可能なのか?予約したSKU以外に変更している間はコストがどうなるのか?

予約割引が適用されている App Service Plan のSKUをスケールアップすること自体は可能です。ただし、予約購入したSKU外になってしまうので予約割引は適用されません。予約購入した分はもし他に予約適用可能な App Service Plan がない場合は1時間単位で支払った金額が無駄になってしまいます。

Q. 予約購入したSKU以外のサイズ、バージョンに変更することは可能か?

直接購入した予約を変更することはできませんが、予約には「交換」と「払い戻し」という制度があり、それらを使うことで払い戻した料金を使用して違う予約を新規購入することができます。
Azure の予約のセルフサービスによる交換と払戻 | Microsoft Docs

Q. 予約の「交換」、「払戻」の払い戻し金額の計算方法について

「交換」、「払戻」したタイミングで契約期間の残日数から日割りで残額が計算され、払い戻しされるようです。ちなみに現状のところは予約の払戻に途中解約料は請求されないとのことですが、将来的には請求する可能性があるとのことなのでご注意ください。
Azure の予約のセルフサービスによる交換と払戻 | Microsoft Docs

参考ページ

Azure App Service の Reserved Instance を調べていて参考になったページのURLです。

docs.microsoft.com

docs.microsoft.com

docs.microsoft.com

docs.microsoft.com

docs.microsoft.com

azure.microsoft.com