AWS(Amazon Web Services)は、その柔軟性、スケーラビリティ、多様なサービスによって、世界中の企業や開発者から選ばれています。AWSの利用機会が多ければ多いほど、コスト効率の良い利用方法の理解が不可欠です。本記事では具体的なコスト最適化の手法について解説し、AWSのコストを10%以上、多い場合には50%程度のコストを最適化することを目指します。
こんな方におすすめ
- AWSのコストを最適化する方法を知りたい
- AWSのコストが高くて困っているため可能な範囲で削減したい
ネクストはこれまで、500社を超えるお客様に技術で支援してきました。お客様の課題として多いのが、AWSを導入したいが社内にクラウド人材がいない、ITコストを抑えたいがノウハウがない、という声です。
むやみにAWSを導入する前に、まずはクラウドやAWSについての基礎を学習し、正しい知識を得ることが大切です。これからAWS導入をはじめたいと考えている方は、ぜひご一読ください。 →AWS導入支援はこちら
1. AWSコスト最適化とは何か
AWSのコストの特長は利用した分だけ課金される従量課金制であることでしょう。コスト算出の仕組みについては当サイトの「AWSの料金体系」で詳解しましたので、こちらも参考にしてみてください。
従量課金制のAWSですが、円安の影響や使用するサービスによって、思いのほかコストが高いと感じることがあるようです。しかし、それぞれのサービスの設定や特性・使用方法によってコストを最適化することが可能です。
ほとんどのAWSサービスは、Elastic Compute Cloud(EC2)によって提供されるコンピュートリソースに基づいているため、EC2インスタンスのコストはAWSコストの中心的な要因です。例えば、EC2インスタンスをオンデマンド価格から低コストのスポットインスタンスやリザーブドインスタンスに切り替えたり、AWSアカウント全体のコストを削減できる節約プランを利用したりすることが、コスト最適化の王道です。
※インスタンス = インスタンスとは、AWSの仮想サーバーのことを指し、仮想サーバーの単位としても使われます。1インスタンス=仮想サーバー1台。
AWSはなぜ高いのか?
AWSのクラウドのリソースは動的であり、コストの正確な予測は難しいでしょう。ここでAWSが思わず高コストになりうる主な原因を挙げてみます。
- EC2インスタンスが十分に利用されていない。
- 未使用のEBSボリューム、スナップショット、ロードバランサーなどのリソースが使用されていないにもかかわらず、コストが発生している。
- スポットインスタンスやリザーブドインスタンスが適用可能な場合でも使用されていない。これらのタイプのインスタンスは50~90%の割引を提供できます。
- Savings Planが使用されていない。AWSでの総使用量を最低限に設定することで、コンピュートコストを節約することができます。
- 自動スケーリングが実装されていない、または最適化されていない。例えば、需要が増加するにつれてスケールアップしすぎる(冗長化リソースを追加する)。
などがあります。
この5つの原因が示すコスト最適化の大きな要素をご紹介します。
2. AWSコスト最適化の5大要素
その1 適切なサイジング
プロビジョニング(=必要なリソースを予測し、準備しておくこと)するリソースは、要件とニーズを整理・把握し、それにフィットしていなければなりません。例えば、コンピューティングに必要なCPU、ストレージ、ネットワーク、メモリをできる限り正確にプロビジョニングしましょう。
その2 適切なスケジューリングと状態管理
従来のオンプレ環境ではひんぱんにハードウェアの電源を切ることはほとんどありませんでした。なぜなら物理的なスイッチの切り替えを必要としたからです。しかしクラウドでは、動的にマシンを開始/再開/停止することができます。リソースを適切にスケジューリングし、不要になったらリソースをオフにすることができます。例えばベンダーやエンジニアチームが日中帯に使用している非本番環境(ステージング環境や開発環境など)は夜間帯は停止することでコストを抑えられます。
その3 適切な価格モデルを活用する
AWSは、オンデマンドインスタンス、スポットインスタンス、リザーブドインスタンスなど、さまざまな価格モデルを提供しています。使用シーンとニーズに応じた価格モデルを選択することで、コストを最適化できます。
- オンデマンドインスタンス
- リザーブドインスタンス
- スポットインスタンス
- Savings Plans
上記の4モデルをそれぞれご紹介します。
オンデマンドインスタンス
オンデマンドインスタンスは、事前の予約なしに、必要に応じてリソースを使用し、使用した分だけを支払うモデルです。通常、AWSのEC2インスタンスと言うとオンデマンドインスタンスを指します。短期間のプロジェクトや予測不能なワークロードに最適で、拡張性と柔軟性が求められる場合に利用されます。オンデマンドインスタンスは、予約やスポットインスタンスに比べ高い傾向にありますが、即座にリソースを確保できるメリットがあります。
リザーブドインスタンス
リザーブドインスタンスは、1年または3年の契約期間でコンピューティング容量を予約し、その期間にわたって最大75%割引で利用することができるモデルです。一定の使用量が見込まれる場合、大幅なコスト削減が可能となります。リザーブドインスタンスは、特定のインスタンスタイプに対して適用され、長期間にわたって安定したワークロードがある場合に最適です。
スポットインスタンス
スポットインスタンスは、AWSの余剰コンピューティング容量を市場価格で購入できるモデルで、オンデマンド価格の最大90%割引で利用することができます。価格は需要と供給によって変動し、事前に終了される可能性があるため、中断可能なタスクやバッチ処理に適しています。コストを大幅に削減できる反面、使用できるリソースが保証されない点には注意が必要です。
Savings Plans
Savings Plansは、1年または3年のコミットメントで特定の使用量($/時)に対して割引を受けられる料金モデルです。EC2インスタンス、Fargate、Lambdaなど、複数のAWSサービスに適用できます。リザーブドインスタンスに比べて柔軟性が高く、使用するサービスやリージョンを選ばずに割引が適用されるため、多様なワークロードを持つユーザーに適しています。
上に挙げたそれぞれの価格モデルの活用シーンと具体例はもうすこし後でご紹介します。
その4 ストレージの最適化
AWSの料金体系の一つであるデータの保存量に関連するトピック。AWSは複数のストレージを提供しており、それぞれが異なるコストで異なるパフォーマンスを提供します。データの種類に適した保存先を選定することで、ストレージを最適化し、必要なパフォーマンスと可用性を維持することができます。例えば、低パフォーマンスの要件には、汎用SSD(gp2)よりもコストの低いAmazon EBS Throughput Optimized HDD(st1)を使用することでコストを抑えることが可能です。
その5 コストの測定・監視・改善
クラウド環境は動的であるため、コストの可視化と継続的な測定と監視が必要です。コスト配分のタグを定義することで実現可能です。メトリクスを定義し、具体的な目標を設定し、定期的に情報を見直す必要があります。エンジニアチームやベンダーにトレーニングを受けてもらい、コストを可視化し、コストとアーキテクチャを最適化できるようにしましょう。
3. コスト管理ツールの活用
AWSには、コスト管理・予算管理・価格計算が備わっており、これらを通じてコストを最適化するための予測・測定・監視を行うことができます。
- コスト管理: AWS Cost Explorer(AWSコストエクスプローラー)
- 予算管理: AWS Badgets(AWSバジェット)
- 価格計算ツール: AWS Pricing Calculator(AWSプライシングカルキュレーター)
1つ1つご紹介します。
AWS Cost Explorer
AWS Cost Explorerでは、AWSサービスのコスト、利用状況、投資収益率(ROI)を確認することができます。AWSコストエクスプローラーは過去13ヶ月のデータを表示し、将来の費用を予測するのに役立ちます。画面をカスタマイズして作成することができ、AWSコストを詳細に分析し、改善すべき点を特定するのに役立ちます。さらに、AWS Cost ExplorerはAPIを提供しており、既存の分析ツールからデータにアクセスすることができます。
AWS Budgets
AWS Budgetsは、各AWSサービスの予算を設定し、実施するのに役立ちます。あらかじめ設定した予算のしきい値を超過したり到達したりすると、Simple Notification Service (SNS) からメッセージやメールを受け取ることができます。全体的なコスト予算を定義したり、データ使用量やインスタンス数などの特定のデータポイントに予算を関連付けることができます。このツールは、Billing and Cost Management(請求とコスト管理)の「予算」からアクセス可能です。コスト・エクスプローラーで生成されるものと同様のダッシュボードを提供し、各サービスが予算と比較してどのように使用されているかを表示します。
AWS Pricing Calculator
AWS Pricing Calculatorは、AWSの月額コストの見積もりを作成できます。ワークロードを予測し、見積りの価格設定ポイントや計算方法を調べたり、要件を満たす利用可能なインスタンスタイプや契約期間を見つけることができます。AWS Pricing Calculatorによって提供された価格情報に基づいた意思決定やサービスのセットアップコストの見積もりに役立ちます。
4. AWSコスト最適化の手法10選
具体的にAWSのコストを最適化するためのベストプラクティスをご紹介します。
- 適切なAWSリージョンを選択する
- 未使用のインスタンスをオフにする
- 使用率の低いEC2インスタンスを特定し、停止するかスケールダウンする
- スポットインスタンスの活用
- リザーブドインスタンスの活用
- Savings Plansの活用
- EC2 Auto Scaling Group(ASG)構成の最適化
- ストレージの使用を監視し、未使用のEBSボリュームを削除する
- バックアップのためのスナップショットの削除と設定
- アイドル状態のロードバランサーの削除と帯域幅使用の最適化
手法1. 適切なAWSリージョンを選択する
AWS管理コンソールやCLI、またはSDKを使用するには、まずリージョン(地域)を選択する必要があります。ほとんどの場合、ユーザーは物理的な距離に基づいてこの決定を行います。選択するAWSリージョンはコスト、レイテンシ(通信の遅延時間)、可用性に影響を及ぼします。ここでは、プロジェクトに適したAWSリージョンを選択する際に考慮すべき点を紹介します。
- コスト: AWSはリージョンによって販売価格が異なります。AWSのサイトで公式のオンデマンド価格を見ることができますが、特定リージョンを使用する際のコストを見積もるために、かならずAWS Pricing Calculatorを使用しましょう。
- レイテンシ: レイテンシの小さいリージョンは、アプリケーションをより利用しやすくするのに役立ちます。レイテンシはほとんどの場合、物理的距離と相関します。このため、東京からのアクセスであれば東京、大阪であれば大阪リージョンを選択しましょう。
- サービスの可用性: すべてのAWSサービスがすべてのリージョンで利用できるわけではありません。特定のリージョンを選択する前に、対象のAWSサービスがそのリージョンで利用可能であることを確認してください。
- 可用性: 複数のAWSリージョン(マルチリージョン)を使用することで、可用性を向上させ、AWSの障害時への対策にすることができます。
- データ主権 – 特定の地域にデータを保存する場合、組織はその地域のデータに関する法的要件に準拠する必要があります。これは、機密データを保管する上で重要な考慮事項です。
当たり前といえば当たり前なのですが、意外にも物理的距離を考慮に入れないリージョンを選択しているケースがあるため、こちらを最初に挙げました。
手法2. 未使用のインスタンスをオフにする
AWSのコストを最適化する際には、未使用のインスタンスに注意を払い、それらをシャットダウンする必要があります。想定できるシーンをご紹介します。
- 未使用のインスタンスは終業時や週末、休暇中にシャットダウンする。
- 例えば開発環境やステージング環境など、本番以外のインスタンスを最適化する場合は、オンとオフの時間を事前に計画に組み込みましょう。
- 使用量メトリクスを評価し、インスタンスの使用頻度が高い時間帯を調査しましょう。そうすることで、より正確なインスタンスの稼働スケジュールを把握できます。あるいは、常時停止スケジュールを適用し、これらのインスタンスへのアクセスを提供する際にのみ稼働することでコストを最適化できます。
- インスタンスが使用されていない間、EBSボリュームやその他の関連要素に対して支払いが発生するかどうかを把握し、削除するか適切に判断します。
手法3. 使用率の低いEC2インスタンスを特定し、停止するかスケールダウンする
ご紹介した通り、AWS Cost Explorerは、リソース最適化レポートを提供し、アイドリング状態または使用率の低いEC2インスタンスを表示することができます。こうしたインスタンスを停止するか、またはスケールダウンすることで、コストを下げることが可能です。
利用率の低いEC2インスタンスで無駄なコストを発生させないようにするための3つのツールをご紹介します。
- AWS Instance Scheduler: 事前に設定したスケジュール(営業時間外など)でインスタンスを自動的に停止できます。
- AWS Operations Conductor: AWS Cost Explorerの推奨に基づいて、EC2インスタンスのサイズを自動的に変更できます。
- AWS Compute Optimizer – 各ワークロードに最適なインスタンスタイプを提案してくれます。これは、インスタンスグループ内でのスケールダウンにとどまらず、グループ全体のインスタンスのダウンサイジングの推奨、パフォーマンスのボトルネックを解消するためのアップサイジングの推奨、Auto Scalingグループ内のEC2インスタンスの推奨など、コスト最適化の意思決定に役立つ情報を提供してくれます。
手法4. スポットインスタンスの活用
EC2のスポットインスタンスは、AWSのコストを削減するためのとても重要なオプションです。スポットインスタンスは、通常のオンデマンド価格と比較して最大90%のコスト削減が可能です。
スポットインスタンスは、Amazonが予備のEC2リソースを販売するため、こうした割引を受けることができます。オンデマンドとスポットを比較した時に、スポットインスタンスは性能が同じEC2インスタンスでもAWS全体の需要が少ないときに、大幅に割引された価格で利用できるため、EC2コストを大幅に削減することができます。
コスト面ではメリットのあるスポットインスタンスですが、デメリットは信頼性が低いことです。AWSがオンデマンドやリザーブドのために容量を取り戻す必要がある場合、2分間の警告でインスタンスを終了します。信頼性を向上させるもう一つの選択肢は、通常のオンデマンドインスタンスと一緒にAuto Scaling Group(ASG)でスポットインスタンスを実行することです。こうすることで、グループ内の容量の少なくとも一部が利用可能な状態を維持することが保証され、その一方で割安なインスタンスのメリットを享受することができます。
可能な限りスポットインスタンスを使いましょう。
手法5. リザーブドインスタンスの活用と再販
リザーブドインスタンス(通称: RI)は、1年ないし3年間のインスタンスの使用を約束することで最大72%の割引受けられるものです。基幹システムなどの長期的な使用にはぜひとも使いたいところですが、リザーブドインスタンスを使用する場合は、いくつかの選択肢があります。
- スタンダードまたはコンバーチブル: スタンダードは、リザーブドインスタンス不要になった場合、AWS Reserved Instance Marketplaceで再販することができますが、インスタンスグループのタイプを変更することはできません。コンバーチブルは再販できませんが、任意のインスタンスタイプやファミリーに変更が可能です。計画時にこの点を考慮に入れましょう。
- リージョナルまたはゾーン: リージョナルRIは、インスタンスを別のゾーンに移動することができ、また同じファミリー内(t2など)で同等のインスタンス・サイズに変更することができますが、キャパシティは保証されません。ゾーンRIは、ゾーンやインスタンス・タイプを変更することなく、キャパシティを保証します。
- 支払いオプション: コミットメント期間分を前払いするか、金額の一部を前払いするか、すべてを継続的に支払うかを決めることができます。前払いには、より大きな割引が適用されます。
- サービスサポート: リザーブドインスタンスを利用できるサービスはEC2、RDS、Redshift、ElastiCache、DynamoDBのみです。
RIは長期的な使用の約束を意味するため、計画に組み込んでいたとしても使用しなくなってしまう場合があります。これを踏まえると
- コミットメント期間中にRIのキャパシティが必要になることが確実な場合は、コンバーチブル・インスタンスを選択し、必要に応じて他のワークロードにインスタンスを再利用できるようにします。
- コミットメント期間中、一部のRIを必要としない可能性がある場合は、スタンダード・インスタンスを選択し、必要に応じてマーケットプレイスで再販します。
手法6. Saving Plansの活用
Savings Plansは、EC2、Lambda、Fargateにおいて、1年または3年の継続利用を約束するとより安価に利用できる価格設定モデルです。例えば、前払いのない1年間のSavings Plansでは、最大54%の割引が適用されます。
Savings Plansは、サイズ、Auto Scaling Group、アベイラビリティゾーン(Availability Zone=AZ)、リージョンに関係なく、インスタンスに適用されます。AWS Cost Explorerを使用すると、最近の利用状況の分析に基づいて、プランに適したオプションを選択することができます。
手法7. EC2 Auto Scaling Group(ASG)構成の最適化
ASGはある目的のために使用されるAmazon EC2インスタンスの集合です。ASGは、アプリケーションメトリクスやスケジュールに基づいてヘルスチェックやカスタムスケーリングポリシーなどのEC2の自動スケーリング機能を提供します。事前に設定したルールとアプリケーションの負荷に応じて、ASGから動的にEC2インスタンスを追加・削除することができます。
ASGを使用すると、必要に応じてEC2 fleetが増減し、コストを節約できます。スケーリングアクティビティを表示するには、CLIのdescribe-scaling-activity
コマンドか、またはコンソールを使用します。スケーリングポリシーを最適化することで、スケールアップ時とスケールダウン時の両方でコストを削減できるので利用しない手はありません。
- スケーリングアップ時: より積極的なインスタンスの追加を行わず、アプリケーションのパフォーマンスに影響がないことを監視します。
- スケールダウン時: 現在のアプリケーションの負荷を維持するために、必要最小限のインスタンス数までインスタンスを減らします。
手法8. ストレージの使用を監視し、未使用のEBSボリュームを削除する
AWSでは、S3分析ツールを使ってS3の使用状況を監視することができます。S3分析は、ストレージ内の特定のデータセットに対するアクセスのパターンを確認することができます。
S3分析ツールは、コスト削減のためにAWS内のさまざまなストレージサービス(S3 Infrequently Accessed、AWS Glacier、またはAWS Glacier Deep Archiveなど)の選定に役立つことを教えてくれます。レコメンド内容をもとに、最適なストレージを選びましょう。
S3分析ツールは、ライフサイクルポリシーを通じて、より低コストなストレージへのオブジェクト転送を自動化することができます。また、S3 Intelligent-Tieringを使用して、使用期間が不明なオブジェクトや動的なオブジェクトを自動的に分析し、関連するストレージに転送してくれます。
さらに、ストレージを節約したい場合は、未使用のEBS(Elastic Block Storage)ボリューム(EC2インスタンスにアタッチできるマネージドディスクドライブ)を削除することを検討しましょう。EC2インスタンスを停止した後でも、EBSボリュームは稼働し続け、コストが発生する可能性があります。また、EBSのタイプを変更することでコストを最適化することもできます。
もっとも間違いのない選択肢は、「EBSボリュームを使用する際は、終了時に削除するオプション」を選べるということを、チームに周知・徹底させましょう。これにより、EC2インスタンスの終了時にEBSボリュームが確実に削除されます。もしそれが行われていない場合は、Amazon CloudWatchまたはAWS Trusted Advisorを使用して、利用可能としてマークされているEBSボリュームを探し、Lambdaを使用して自動的にクリーンアップすることもできるので、これもおすすめです。
手法9. バックアップのためのスナップショットの削除と設定
EC2インスタンスを終了すると、関連するEBSボリュームも削除する方法をご紹介しましたが、EBSボリュームのバックアップとして作成したスナップショットを忘れてはいけません。スナップショットをS3に保存している場合は、これにもコストが発生しています。
スナップショットを追加するたびにストレージ容量を食います。1つのスナップショットは大きくないかもしれませんが、ひんぱんにスナップショットを行い、その保持期間が長い場合、時間の経過とチリツモになります。
バックアップ方法を学習することはコスト最適化のために重要な要素です。そのためEBSバックアップの種類を見てみましょう。
- フルバックアップ: データに変更が加えられたかどうかに関係なく、データセット全体がコピーされます。このタイプのバックアップは、実用上の理由から一般的にそれほど頻繁には行われません。たとえば、時間がかかり、大量のストレージ容量を占有する可能性があるためです。
- 増分バックアップ: 増分バックアップでは、前回のバックアップ以降に変更されたデータのみがコピーされます。たとえば、日曜日にフルバックアップを行った場合、月曜日の増分バックアップでは、日曜日のバックアップ以降の変更のみがコピーされます。
- 差分バックアップ: 差分バックアップ戦略では、前回のフルバックアップ以降に新しく追加および変更されたデータのみがコピーされます。最後のフルバックアップが日曜日の場合、月曜日のバックアップでは、日曜日以降のすべての変更がコピーされます。火曜日に別のバックアップを取ると、日曜日以降の変更もすべてコピーされます。バックアップファイルのサイズは、次のフルバックアップまで徐々に増加します。
EBSバックアップは通常「増分」なので、スナップショットを追加するたびにある程度限定されたストレージ容量しか消費しません。ただし、スナップショットを頻繁に実行し、保持期間を高く設定している場合は、この小さな増分でさえ、時間の経過とともに増えていくでしょう。
ほとんどのスナップショットはEBSボリューム全体の初期スナップショットのデータを使用するため、初期スナップショットが不要な場合は、それを追跡して削除することが重要です。これにより、多数の増分スナップショットを削除するよりもはるかにストレージ容量を節約できます。
必要以上に長くスナップショットを維持しないように、Amazon Data Lifecycle Managerを通じて、EBSスナップショットの自動ライフサイクル管理を設定するのが最善です。
手法10. アイドル状態のロードバランサーの削除と帯域幅の最適化
Elastic Load Balancing(ELB)の設定をチェックし、未使用のロードバランサーを確認しましょう。ロードバランサーにも継続的なコストはかかります。ロードバランサーに関連するバックエンドインスタンスがない、またはネットワークトラフィックが非常に少ない場合はロードバランサーは効果的に使用されておらず、リソースを浪費しています。
AWS Trusted Advisorを使って、リクエスト数が少ないロードバランサーを特定することができます。直近7日間で100リクエスト以下を目安にしましょう。こうしたアイドル状態のロードバランサーを削除することでコストを削減することができます。
ロードバランサーの代替手段としてのCDN
EC2から外部データ転送コストが高い場合、ELBの代わりにCloudFrontを使用することも検討しましょう。CloudFrontはAWSが提供するコンテンツ配信ネットワーク(CDN)で、世界中の複数のエッジロケーションにウェブコンテンツをキャッシュすることができます。トラフィックの急増に対応するために必要な帯域幅を大幅に削減することもできるでしょう。
まとめ
今回は「AWSのコスト最適化」と題して、AWSのコスト最適化の具体的な実践手法などをご紹介しました。AWSとは.com では、AWSの基礎から実践までの学習を通じて、企業や個人のAWS導入を支援していく予定です。
最後までお読みいただきありがとうございました。