クラウドコスト最適化の取組

#この記事は
NTTドコモテクニカルジャーナルVol.29No.1[クラウドコスト最適化の取組み](https://www.nttdocomo.co.jp/corporate/technology/rd/technical_journal/bn/vol29_1/005.html)の筆者による解説記事です。

#概要
現在、国内外の企業においてパブリッククラウドが非常に多く活用されていますが、主要なパブリッククラウドの課金体系は従量制であり、仮想サーバなどのリソース管理が疎かだと無駄にリソースを起動させてしまい、想定外のコストが発生します。そのため、初期の設計段階からリソース管理や、コストの最適化について検討しておく必要があります。本稿では、ドコモがこれまで培ってきたクラウドコスト最適化のノウハウ・取組みについて解説します。

#クラウドコスト最適化の検討プロセス
コストの最適化には、まずコストの可視化を行い、コスト管理の効果を見えるようにし、コスト削減施策と効果検証を繰り返していくことが重要です。可視化できていないものは改善できないためまずは可視化を行い、継続して利用状況を定期的にチェックし、状況に応じて構成変更、利用しているサーバーの能力（AWSではEC2のインスタンスタイプなど）を見直し、料金プラン活用等の検討を行うことが必要になります。

![スクリーンショット 2021-11-18 17.27.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266701/11e717a1-fef3-3903-e2c6-aec6eb06b175.png)


コストの最適化は以下の優先度で検討をします。

【STEP①】構築したアーキテクチャの見直し
　コスト削減に最も有効なのは、アーキテクチャ全体を見直し極力マネージド・サービス（自分で構築するのではなく、既にクラウド事業者が提供しているサービス）の活用を考慮することです。運用中のシステムの変更は難しいため、初期設計時やシステム更改時にしっかりとコスト観点での設計を行う必要があります。

【STEP②】不要なリソースの削除、利用リソースの最適化
　運用期間が長くなっているアカウントでは、使われていくなったリソースが残っているケースや、本来であれば必要のない過剰なリソースを利用しているケースが散見されます。無駄が無いよう定期的にリソースを見直すことを運用の中で取り入れることで、コスト削減につなげることができます。

【STEP③】各種料金プランの活用
　各クラウドプロバイダは、リソース利用のコミット（事前に予め定められた期間の利用量を宣言）をすることで利用料を削減することができる料金プランを用意していることが多くあります。AWSではReserved Instance、Saving Plansといった、１年もしくは３年の利用をコミットした上で料金を下げることができる料金プランがあり、Google Cloudでは確定利用割引、Microsoft AzureでもReserved VM Instancesという形で同様の料金プランがあります。リソースを最適化した上でどうしても一定期間継続的に必要となるリソースに対してはこのような料金プランを活用することで費用を削減することができます。ただし、費用のコミットをする場合は、コミット以降のシステム構成の大幅な変更や、利用リソースの見直しの実施が難しくなるため、前述の検討を行った上で活用を考えるべきです。

![スクリーンショット 2021-11-18 17.28.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266701/b6510689-9a69-f97c-7665-3e3db6724eff.png)

#コストの可視化
　上記のポイントを考慮した上で、クラウド上でのサービスを構築したら、次にその構築したサービスで、どの部分にコストがかかっているのか、現状のコストを可視化して継続的にコスト構造を把握することが重要です。各クラウドサービスでは請求書以外に、コストの可視化ツールを提供しています。ここでは、AWSのCost Explorer及びドコモで内製開発をしたCost Visualizerについて紹介します。


###Cost Explorerによる利用状況の把握
　Cost ExplorerはAWS標準のツールで、請求金額をグラフで表示することができます。サービス別、Linkedアカウント別等、様々な切り口でコストの細分化が可能です。
　また、デフォルトでReserved InstanceやSaving Plansの利用率、カバー率など複数のレポートを出力することができます。
　注意点として、Cost Explorerをルートアカウント（アカウントの親、最も強い権限を持つ）でアクセスしてしまうと、権限が強すぎて常用することは危険なため、必要最低限の権限のみ（例えばコストの閲覧権限のみ）を付与したIAMユーザを作成し、アクセスに利用するべきです。

###![スクリーンショット 2021-11-18 17.36.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266701/e304e5fc-64b7-8b7d-a408-41e6bb2e689a.png)

###Cost Visualizerによる利用状況の把握
　Cost VisualizerはNTTドコモが開発・提供をしているコスト分析ツールであり、ドコモが大規模にAWSを使い始めた2012年時点では上述のCost Explorerが提供されておらず、コスト管理上必要と思われたために内製開発したAWS専用のコスト分析ツールです。
　AWSの権限設定とは分離しており、アカウント管理が別になっているため、AWSのサポートレベルや請求閲覧権限によらず利用することが可能で、Cost Explorerよりも細かい権限管理や、グルーピング表示、円グラフ等、Cost Explorerと異なる分析が可能になります。

![スクリーンショット 2021-11-18 17.38.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266701/ce0cefa7-f38c-e716-f140-a97a9111e7e6.png)

###予算管理
  各クラウドプロバイダは予算管理のためのサービスを持ち、コストまたは使用量が設定値を超過したり、超過する可能性を検知するとメールなどで通知することができます。AWS Budgetsは、コストだけではなくAWSリソースの利用量やRIの使用率なども設定することができ、コスト可視化ツールと合わせて利用することで普段のコスト意識を高めることができます。

#コスト削減方針の立案と実施
コスト削減方針として、一番効果が高いのはアーキテクチャの見直しですが、既に運用を開始したシステムのアーキテクチャを変更することは容易ではないので、初期設計の段階からコストも考慮した構成にするべきです。コストを最低限にできる構成を取った上で、運用の中で無駄・過剰なリソースが無いか確認をすること、最低限発生するコストに対して料金プランを活用することでさらにコストを削減することができないか検討するべきです。

###マネージドサービスの利用
　各クラウドサービスでは、仮想サーバのようなコンピューティングリソースだけではなく、処理の特性に合わせたマネージドサービスを提供しています。こういったマネージドサービスはリソースを活用して処理を行った時間分の課金であるケースが多く、プロビジョニングしているだけで費用がかかる仮想サーバでシステムを構築するよりもコストを削減することができます。
　例えば、AWSであれば長時間稼働させるサービスでリクエストが少ないものについてはEC2からLambdaの置き換えます。バッチ処理を流したい場合はEC2ではなく、AWS Batchの利用を検討します。AWS Batchを使用すると、バッチジョブのボリュームと必要なリソースに応じて、コンピューティングリソースが動的にスケーリングされるため費用を削減できます。さらに、全体をCognito,API Gateway,Lambda,DynamoDB等によるサーバーレスアーキテクチャに変更することができると、大幅なコスト削減を見込むことができます。

###無駄なリソースの確認
　クラウドのリソースは一度プロビジョニングすると実際に利用をしなくてもコストが発生してしまうため、定期的に無駄なリソースが無いか、過剰なリソースが無いかチェックする必要があります。例えば、アタッチされていないブロック・ストレージ、タグも付けられていない古いSnapshotなどが考えられます。
　これらの無駄なリソースはクラウドサービスのコンソールから確認することができますが、多くのリソースを扱う場合、確認が難しくなってしまいます。こういった無駄なリソースの確認の手段として、AWS Trusted Advisor等を活用することが効率的です。Trusted Advisorでは以下の項目を確認することができます。

![スクリーンショット 2021-11-18 17.44.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266701/852200f2-744c-df19-f79a-22a5311f44a0.png)


実際にコスト削減に繋がった例として、あるプロジェクトでTrusted Advisorを確認したところ42個のブロック・ストレージの内、22個がアタッチされておらず、これらを削除することでコンピューティング費用を約１割削減しました。

また、他のプロジェクトではタグが付いていない1000を超えるSnapshotがあり、これらを削除することでコスト削減に繋がりました。

###アプリケーションの動きの把握
　アプリケーションをデプロイする際、当初の見込みよりも実際はトラフィックが無く、過剰なプロビジョニングをしているケースがあります。オンプレミスではリソースを縮退することは難しいが、クラウドであれば適切なリソースに縮退や拡張をすることができます。リソースの仕様状況については、AWSであればCloudwatch, Google CloudはCloud Monitoring, Microsoft AzureはAzure Monitorというったサービスで確認が可能です。クラウドプロバイダ提供のサービス以外にも、New RelicやDatadogなどの監視サービスもあり、そういったサービスを活用することで適切なリソースへの変更が可能です。AWSではCompute Optimizerという機能があり、 アイドル状態のインスタンスや使用率の低いインスタンスを特定しコストを削減できるレコメンドを行います。
　また、インスタンスタイプは最新のものが価格が安くなるので、最新のインスタンスタイプへの変更を常に意識する必要があります。

![スクリーンショット 2021-11-18 17.45.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266701/f040c22b-3f99-778f-43af-e277670abe51.png)

###自動化の検討
　常時起動の必要がない検証環境については、深夜・休日を停止することでかなりコストを抑えることができます。例えば、平日深夜5時間停止に加えて土日に停止をさせることでコストは約６割以下に削減することができます。ここまで停止することができれば、1年程度のコミット利用による価格低減よりも安くなる可能性が高くなります。また、バックアップのライフタイムサイクルを設定し古いバージョンについては自動的に削除する世代管理をすることでコストを低減することができます。

###料金モデルの検討
　これまでに記載したコスト削減の取り組みを行った上で、どうしても必要になるリソースに対して、料金プランを活用することで更に費用を削減することができます。AWSでは、コンピューティングリソースに対しては、Reserved InstanceやSavings Plansという仕組みがあります。Reserved InstanceはOSの種別、リージョン単位かAZ単位、インスタンスファミリーなどを指定して利用期間をコミットすることで料金を安くできる仕組みです。これに対して、Savings Plansは条件の指定を緩めて純粋に利用料金のコミットをするため、柔軟に購入ができる分割引率は低くなります。しかし、新しいインスタンスファミリーが随時発表されることを考えるとSavings Plansをベースにコミットを行うことで柔軟な運用が可能になります。

#あとがき
　本稿では、クラウドが従量課金であること、そのため管理を適切に行うことがコスト最適化の観点で重要となり、管理のためには可視化と効果検証を繰り返す必要があると述べました。コスト最適化には初期のシステム構成からコスト対効果を意識した設計が必要であり、運用フェーズでも継続して利用状況を定期的にチェックし、状況に応じて構成変更、インスタンスタイプの見直し、料金プラン活用等の検討を行うことが必要です。