ここ数年でAmazon Web Services(AWS)、Google Cloud Platform、Microsoft Azureのようなパブリッククラウドの存在が身近になってきました。2019年8月にAWSで大規模な障害が発生したときには、多くのシステムやサービスが影響を受けたことは、記憶に新しいと思います。障害によって、IT系に勤めていない人達もAWSという用語を口にするようになったぐらいですから、エンジニア以外の層にも浸透してきていると感じています。
パブリッククラウドの利点は、コンピューティングリソースの確保が簡単になったこと、使った分だけ請求されることです。従来のインフラストラクチャーは、データセンターでサーバーやネットワーク機器を購入して設置・構築する必要がありました。それが、パブリッククラウドの登場で、すばやくそしてリーズナブルにコンピュートリソースを手に入れることができるようになりました。
従量課金、つまり使った分だけというのは、使ってないときはお金がかからないメリットがあります。反面、利用料金の見通しが難しくなる問題を新たに生み出しました。従来のインフラストラクチャーは、サーバー・ネットワーク機器の購入金額とネットワーク回線料金といった予測が比較的しやすく、将来的な見通しが立てやすいです。ですが、パブリッククラウドはその手軽さゆえ、見通しを立てることが難しいのです。1台~10台程度なら管理は容易ですが、百〜千台の単位になると、全体管理もさることながら、請求された金額をひとつずつ紐解いていくのは困難を極めます。パブリッククラウドよって手に入れた利便性と引き換えに、リソースとコストの管理に時間を費やされることになりました。
コスト削減は会社の規模に限らず、どこにでもある課題です。安くなるからとオンプレミスからAWSに移行したのに、なぜかコストが下がらない、といった話は耳にしたことがある方もいるでしょう*1。あるいは、最初はスモールスタートでコストを抑えながら利用していたけれど、気がついたらコストが増えていた、ということが起こりえます。
AWSのコスト削減というと、使っていないEC2インスタンスの停止や、リザーブドインスタンスの購入、といった方法をよく聞きます。間違いではありませんが、止めるべきEC2インスタンスを特定したり、適切なインスタンスタイプを選択するには、常日頃からEC2インスタンスの使用状況を把握しておかなければなりません。リザーブドインスタンスを購入するにしても、RIの知識が足りないと、コスト効果が不十分になる可能性があります。ベストプラクティスとして挙げられているコスト最適化の手法を、そのまま私たちのシステムに適用できるとは限りません。
「Cloud cost optimization is a journey.」*2という言葉があります。コスト最適化は一度やれば終わりではなく、継続的にリソースやビリングの状況を監視、追跡を行い、最適化をしていくプロセスです。AWSコストを最適化するためには「AWSサービスおよび料金への知識」「自分たちのシステムに関する理解」そして「継続的に監視・最適化するための運用」が必要です。これらのひとつでも欠けてはなりません。ひとつ目はいわずもがなですね。ふたつ目は、コスト知識だけがあっても、自分たちのシステムに落とし込んでいかないと意味がなかったり、費用対効果が薄くなるということです。コスト知識と自分たちのシステムにマッチしたコスト最適化の施策を打ち出し、継続的に取り組んでいくことが肝要です。アプリケーションエンジニアやサーバーサイドエンジニア、SRE・インフラエンジニア、セキュリティーエンジニアなどと同様に、クラウドコストを最適化するにも、専門の知識とスキルが必要なのです。
[*1] クラウドの特性を活かさないで、オンプレミス構成のままAWSに移行した、などの原因が考えられますが、本書では触れません。
[*2] 『Mastering AWS Cost Optimization: Real-world technical and operational cost-saving best practices』より引用
AWSの料金やコスト最適化に悩む人のお役に立てたら、という思いから本書を執筆しました。本書は3部構成です。
第一部は、AWSサービスについての概要と料金体系について学びます。取り上げているAWSサービスは、次のとおりです。サービスそのものについての説明はあまりしていないため、さらに知りたい人は、ドキュメントか他書と照らし合わせてください。
料金を構成する要素と、コスト最適化するためのポイントを知ることで、正しくAWSサービスを使うことができます。また、AWS Pricing Calculatorを用いて、AWSの利用料金を見積もる方法も学びます。見積もることで、あとから高額な料金を請求されずに済みます。
第二部は、AWS Cost Explorer、AWS Cost and Usage Reportを用いて、AWSの利用料金の可視化と分析する方法について学びます。また、AWS Budgets、コスト配分タグを活用したリソースや予算管理についても知ることができます。コスト最適化のための策を講じたり、最適化の効果を確認するためには、コストの可視化と分析が必要不可欠です。タグでコストを分類したり、予算を定めて想定以上の出費に気づくといった、日常的な運用をするために必要なことを学べます。
第三部は、AWS Trusted Advisor、AWS Compute Optimizerを活用したコスト最適化方法について学びます。また、AWS Well-Architectedフレームワークの柱のひとつである「コスト最適化」で、ベストプラクティスについて触れます。
本章は、Amazon EC2(以下、EC2)の料金体系について説明します。EC2では、オンデマンドインスタンス、リザーブドインスタンス、Savings Plans、スポットインスタンスの4種類の料金オプションが提供されています。
オンデマンドインスタンスは、デフォルトの料金オプションです。リザーブドインスタンスの購入やスポットインスタンスの指定をしなければ、自動的にオンデマンドインスタンスとなります。オンデマンドインスタンスの利用料金は、次の要素で決定されます。前払いはありません。
EC2インスタンスが起動(マネージメントコンソールでrunning
)状態になると、料金が発生します。インスタンス直後はOSがブートされ、接続できなくても料金が発生しています。ライセンス費が発生しないLinuxなどの無償OSは秒単位(最低60秒)、Windows Server、Red Hat Enterprise Linux、SUSE Linux Enterprise
Serverなどの有償OSは時間単位で請求されます。もし1時間5秒起動した場合、LinuxとWindowsで請求時間は表1.1になります。
OS | 請求時間 |
---|---|
Linux | 65秒分 |
Windows | 2時間分 |
EC2インスタンスが停止(stopping
、stopped
)もしくは削除(shutting-down
、terminated
)になると、課金は停止されます。停止から起動に状態が変わると、再度料金が発生します。起動と停止を繰り返すとその都度、最低時間分の料金が発生するので、注意してください。インスタンスの再起動であれば最低時間分の料金は発生しないので、OSのリブートをしたい場合は、再起動をするようにしましょう。
AWS Marketplaceで提供されているAMIからEC2インスタンスを起動する場合、EC2の料金に加えて、ライセンス費用が別途かかる場合があります。例として、オープンソースで提供されているNginxの機能拡張版であるNGINX Plus*1のAWS Marketplaceページ*2を見てみます。「Pricing Information」の料金詳細を見ると、「Software/hr」という項目があります図1.1。これがNGINX Plusのソフトウェアライセンス費用となり、EC2インスタンスの料金に上乗せされて請求されます。
EC2は用途に合わせて、多くの種類のインスタンス(インスタンスタイプ)が用意されています。インスタンスタイプは、「インスタンスファミリー」「インスタンス世代」「インスタンスサイズ」、そして「追加能力」の4つの要素を組み合わせたものです(図1.2)*3。
[*3] AWS Blackbeltの資料ではc5dの「c」がインスタンスファミリーとありますが、本書は便宜上、インスタンス世代を含めたものをインスタンスファミリーと表記しています。
インスタンスファミリーは汎用、コンピューティング最適化、メモリー最適化、ストレージ最適化、高速コンピューティングの5種類に分けられます(表1.2)。
種類 | インスタンスファミリー | ユースケース |
---|---|---|
汎用 | A1、T3、M5、M6g | Webサーバーなど |
コンピューティング最適化 | C5、C6g | 高性能Webサーバー、バッチ処理など |
メモリー最適化 | R5、R6g、X1、Z1d | データベースなどメモリーを大量に使用する処理 |
ストレージ最適化 | I3、H1、D2 | NoSQL、インメモリーデータベースなど |
高速コンピューティング | G3、P3、G4dn | GPUを活用したコンピュート処理 |
インスタンスファミリーによってサーバー性能や搭載しているCPU、メモリー量が異なります。M5インスタンスを例にすると、m5.large、c5.large、r5.largeのカタログスペックは表1.3のとおりです。アプリケーションの特性や必要なリソース(CPU、メモリー)に合わせて、適切なインスタンスファミリーを選択します。
インスタンスタイプ | vCPU | メモリー(GiB) | 料金 |
---|---|---|---|
m5.large | 2 | 8GiB | 0.124 USD/時間 |
c5.large | 2 | 4GiB | 0.107 USD/時間 |
r5.large | 2 | 16GiB | 0.152 USD/時間 |
インスタンス世代は、数字が大きいほうが最新です。新世代は旧世代と比べて性能が向上されているうえに、料金が安くなる傾向にあります。m3.large、m4.large、m5.largeのカタログスペックを比べると、m5.largeの時間あたりの料金が安いことがわかります(表1.4)。
インスタンスタイプ | vCPU | ECU | メモリー(GiB) | 料金 |
---|---|---|---|---|
m3.large | 2 | 6.5 | 8GiB | 0.193 USD/時間 |
m4.large | 2 | 6.5 | 8GiB | 0.129 USD/時間 |
m5.large | 2 | 10 | 8GiB | 0.124 USD/時間 |
ECUはElastic Compute Unitsの略で、Amazon独自のCPU性能単位を表しています。EC2インスタンスの整数処理能力を、相対的に測定した指標です。ECUによって、異なるインスタンスタイプのCPU性能の比較が容易にできます。たとえば、c5.xlarge、m5.xlarge、r5.xlargeはいずれもvCPUは4ですが、c5.xlargeのECU数がもっとも高いため、CPU性能も高いことがわかります(表1.5)。先ほどの表1.4で、m5.laregeは料金が安いうえに、CPU性能がもっとも高いです。ECUはIntel X86アーキテクチャのインスタンスのみが対象です。ArmアーキテクチャベースのインスタンスタイプにECUの表記はありません。
インスタンスタイプ | ECU |
---|---|
c5.xlarge | 20 |
m5.xlarge | 16 |
r5.xlarge | 19 |
Nitroシステムは、EC2インスタンスの基盤となるプラットフォームです。EC2インスタンスのホストサーバー(物理サーバー)で実行されていたネットワーク、ストレージ、セキュリティーのソフトウェアを、AWSが独自に開発したハードウェアにオフロードする(処理を任せる)ことで、パフォーマンス向上やセキュリティー強化、コスト削減が実現しました。対象となるインスタンスタイプはC5、C5d、C6g、M5、M5d、M6g、P3dn、A1、R5、R5a、R6gなどがあります。最新情報はドキュメントから確認できます*4。基本的に、新世代のインスタンスタイプはNitroシステムです。
従来のEC2インスタンスタイプのパフォーマンスは一定です。いっぽう、バースタブル・インスタンスは、CPUクレジットという機能によって、ベースラインを超えてバースト(CPU性能をフルに活用)することができます。T2、T3インスタンスがバースタブル・インスタンスで、同スペックの他のインスタンスタイプと比較して、時間あたりの料金が安いです(表1.6)。
インスタンスタイプ | vCPU | ECU | メモリー(GiB) | 料金 |
---|---|---|---|---|
t3.large | 2 | 変数 | 8GiB | 0.1088 USD/時間 |
m5.large | 2 | 10 | 8GiB | 0.124 USD/時間 |
CPU性能を必要としない開発環境や、短いピーク時のみCPU性能を発揮するワークロードに向いています。常にCPU性能を必要とするワークロードでは、CPUクレジットが枯渇し性能が落ちてしまいます。そのため、M5かC5などのインスタンスタイプにするか、CloudWatchでCPUクレジットのメトリクスを監視するようにしましょう。
EC2を起動するためのイメージ(AMI)はプロセッサのアーキテクチャに依存されるため、インスタンスタイプに合わせたプロセッサアーキテクチャのAMIを選択する必要があります。従来はx86ベースのAMIが主流でしたが、最近登場したArmベースAMIとの互換性に注意が必要です。
Armアーキテクチャベースのインスタンスタイプ(A1、C6g、M6g、R6g)では、arm64のAMIである必要があります。たとえば、Amazon Linux 2の場合はamzn2-ami-hvm-2.0.20200520.1-arm64-gp2(ami-01e7d6c28d99b213c)
とAMI名にarm64
がつきます。
AMD EPYCプロセッサが搭載されたインスタンスタイプは、x86ベースのAMIで起動ができます。現時点では、T3a、M5a、R5aインスタンスがあります。
32ビットをサポートしているインスタンスファミリーは旧世代のみで、次のとおりです。最近は32ビットOSを起動する機会は少なくなったかと思いますが、インスタンスファミリーが限定されることを頭の片隅に入れておいてください。
t2.nano、t2.micro、t2.small、t2.medium、c3.large、t1.micro、m1.small、m1.medium、c1.medium
機械学習やディープラーニングなどに、GPUインスタンスが使用されます。GPUインスタンスはG2、G3、G4、P2、P3が提供されており、G4(g4dn)が最新です。インスタンスタイプによって、積んでいるGPU数やGPUアクセラレータが異なります。EC2インスタンスの料金表には、GPU数やアクセラレータについての比較がありません。筆者がまとめたスプレッドシート*5がありますので、GPUインスタンスを使用する場合に、参考にしてください。
c5d.xlargeの「d」は追加能力を表しています。「d」は「disk」の意味で、NVMeベースのSSDが、インスタンスストアとしてアタッチされています。他にいくつかありますので、表1.7にまとめました。r5dn.large、g4dn.xlargeのように、複数つくこともあります。
種類 | 例 | 説明 |
---|---|---|
d(disk) | c5d.large | NVMeベースのSSDの追加付与 |
e(extended memory) | x1e.xlarge | 拡張メモリー |
n(network) | r5n.large | 最大100Gbpsネットワーク帯域幅 |
a(amd) | t3a.large | AMD EPYCプロセッサを搭載 |
s(small) | g3s.xlarge | 少量のCPUとメモリー |
g(graviton2) | m6g.large | ArmベースのGraviton2プロセッサを搭載 |
インスタンスサイズが大きくなるにつれて、CPUコア数、メモリー量が増えていきます。M5インスタンスを例にすると、m5.large、m5.xlarge、m5.2xlargeのカタログスペックは表1.8のとおりです。
インスタンスタイプ | vCPU | メモリー(GiB) | 料金 |
---|---|---|---|
m5.large | 2 | 8GiB | 0.124 USD/時間 |
m5.xlarge | 4 | 16GiB | 0.248 USD/時間 |
m5.2xlarge | 8 | 32GiB | 0.496 USD/時間 |
さらに大きいインスタンスサイズになると、ネットワーク帯域幅が大きく活用できます(表1.9)。大容量のネットワーク性能を必要とする場合には、大きいインスタンスサイズか、大規模ネットワーク帯域幅が使えるM5dインスタンスなどを検討します。
インスタンスタイプ | ネットワーク帯域幅 |
---|---|
m5.large〜m5.4xlarge | 最大10Gbps |
m5.8xlarge | 10Gbps |
m5.12xlarge | 10Gbps |
m5.16xlarge | 20Gbps |
m5.24xlarge | 25Gbps |
同じインスタンスタイプでも、無償OSと有償OSで時間あたりの料金が異なります。有償OSはライセンス料金が含まれる分、無償OSより高くなります。表1.10はm5.largeインスタンスの比較ですが、有償OSが無償OSより約1.7倍高くなっています。
OS | インスタンスタイプ | 料金 |
---|---|---|
Linux | m5.large | 0.124 USD/時間 |
Windows | m5.large | 0.216 USD/時間 |
リザーブドインスタンスも同様に、無償OSより有償OSが高くなります。表1.11はm5.largeインスタンスの比較ですが、有償OSが無償OSより約2.2倍高くなっています。
OS | インスタンスタイプ | 料金(1年、全額前払い) |
---|---|---|
Linux | m5.large | 639 USD/年 |
Windows | m5.large | 1,445 USD/年 |