「AzureはAWSより安い」は本当か

4 min read読了の目安(約3800字

私が、アプリケーションを開発するときに使うクラウドは主にAWSです。
それなりには使っているので、AWSでシステムを構築する場合どのくらいAWS費用がかかるのかというのは、なんとなく感覚的に大雑把には想像がつきます。
(もちろん、正式な見積もりを出すときは、AWS料金見積りツールを使いますが)

一方で、仕事ではAzureを使う必要もしばしば発生します。
最初は「まぁ、似たようなものだろ」と思って使っていたのですが、AWSとはサービスごとの費用感が結構違うので戸惑いました。
この記事は、そんな愚痴が半分、みんなも気をつけようという趣旨が半分で書きます。

AzureはAWSより安いのか。。。?

Azureのホームページによるとこう書いてあります。

Windows Server と SQL Server 向けでは、AWS は Azure と比べて 5 倍のコストがかかります。どちらを選ぶべきかは一目瞭然です。

https://azure.microsoft.com/ja-jp/overview/azure-vs-aws/cost-savings/

果たして本当に一目瞭然でしょうか。

Windows Server と SQL Server 向けでは、AWS は Azure と比べて 5 倍のコストがかかります。 の部分。これは事実です。Azureは仮想マシンとDBは安いです。

しかし、それだけでどちらを選ぶか一目瞭然というのは、ちょっと待ったほうがよいです。
はっきりいって、AzureはAWSと比べて他の部分が高いです。
たとえば、ネットワーク機能ですとかセキュリティ機能、運用系の機能など、そういう目立たないけど本格的なシステム構築には必要な機能です。全てのサービスを試したわけではないですが、こういったものは基本的にはAWSのほうが安いです。

非機能要件の見積もりとクラウド費用の話

少し話が逸れますが、システム開発をする上で機能要件と非機能要件があり、非機能要件が重要というのはよく言われていることです。機能要件は、「実装する機能」に関する要件。つまりそのシステムで何をやりたいです。分かりやすいです。非機能要件は、機能以外の要件。セキュリティや性能、保守性などが挙げられます。ちょっと分かりにくいです。

日本では(日本以外のことは知りませんが)システムを開発をする際、要件定義より前に「運用含めた概算を見積もってくれ」といわれるパターンが多いです。
大体の場合、この時点で機能要件は大雑把には決まっています。決まってなくても見積もりの為に適当に条件を付けて大体のあたりを付けることができます。
一方で非機能要件が決まっていることは稀ですし、もはや何も考えられていないことも多いです。そして大抵の場合、初期の段階ではユーザーと開発会社の間に認識齟齬があります。そんな状況で、開発会社は見積もりをすることを強いられます。

さきほど、Azureは仮想マシンとDBは安いと書きました。これは、言ってしまえば機能要件を実現するためのサービスが安いということになります。一方で、その他の部分はAWSのほうが安いです。つまりこうなります。

  • Azure --- 機能要件を実装する部分がAWSより安い
  • AWS --- 非機能要件を実装する部分がAzureより安い

さて、機能要件はある程度わかっているけど、非機能要件は全く分からん 状況で、AWSとAzureで見積もりをするとどうなるでしょうか?

  • Azure --- めちゃくちゃ安い見積もりができる。そして、非機能要件次第で金額がブレまくる。(もしくはリスクを盛りまくって、とても高い見積もりができる。)
  • AWS --- それなりに運用コストがかかる見積もりができるが、非機能要件が変わっても金額がブレにくい。

個人的には多少金額が高くてもブレが少ないほうがありがたいです。
安くできると思っていたのに、いざ作ってみたら「運用コストが高い」とか「性能がでない」とか「セキュリティが確保できない」とかそういう事態は、誰にとっても嬉しくない事態だと思います。

クラウドは従量課金なので、使用したリソースに比例して費用が発生する。。。?

基本的にクラウドは従量課金です。例えば、CPUのコア数が2倍になれば費用が2倍になりますし、メモリが2倍になれば費用が2倍になります。Azureを使う前はそれが当然だと思っていました。

Azureの多くのサービスは、段階的な課金体系

Azureの費用は、純粋な従量課金ではないです。

例えば、Container Registryの価格表を見てみましょう

https://azure.microsoft.com/ja-jp/pricing/details/container-registry/#pricing

Basic、Standard、Premiumの3段階に分かれています。
それぞれで、ストレージとWebhookとレプリケーションの能力に差があります。

「ストレージは5GBしか使わないけどwebhookは3個欲しい」という場合は、Basicは使えないのでStandardを使う必要があります。値段が4倍に跳ね上がり、ストレージの95%が無駄になります。

これって「従量課金」って言うんですかね?

「(ストレージ1GBあたりxx円 + Webhook1個あたりxx円) × リージョン数」で料金を計算するのが、従量課金なのではないでしょうか?

Container Registryを例にあげましたが、Azureは殆ど全てのサービスが3段階の料金になっています。そして、安いプランだと機能が制限されます。
セキュリティ系の機能が使えないのでリソースに無駄になるけど高いプランにしなくてはならないといったこともよくあります。具体的には、、、

  • Azure Functionの従量課金プランはVNet統合が使えない
    • 追加課金しないとFunctionsと仮想ネットワークで安全な通信ができない
  • DBが安いプランだと、VNetサービスエンドポイントが使えない
    • 追加課金しないとDBと仮想ネットワークで安全な通信ができない

基本的にどのサービスも3段階の内一番安いプランは運用に耐えられる機能がついていないので、真ん中より上のプランを選択するのが無難というのが個人的な感想です。

Azureではスモールスタートはやりにくい

各クラウドベンダーがどういう考えで料金を設定しているかは分かりませんが、
私が使った感覚だと、こんな感じになっているイメージです。

  • AWS --- リソースに課金
  • Azure --- 機能に課金

最近のいわゆるDX案件は、最初から仕様が明確になって無くPoCとか技術検証とかでとりあえずやってみようってケースが増えているかと思います。
そういった場合、PoCといえどもインフラの機能はフルに近く欲しいことが多いです。初期はセキュリティは不要ですといったことはあまり聞いたことが無いですし、ネットワーク構成は何も考えませんというのも少ないです。
一方で、リソースは最初は大幅に制限できるケースが多いです。最終形は1万人が使うけど最初は10人で試すといったパターンは結構あるかと思います。

リソースより機能にお金がかかるAzureはスモールスタートしようとしてもPoCの時点でお値段が安くならない傾向にあり、「とりあえずやってみる」がなかなか出来ない印象です。

つまり、Azureは高いってこと。。。?

はい、高いです。

と言いたいところですが、最初に書いたとおりWindows Server と SQL Server 向けでは、AWS は Azure と比べて 5 倍のコストがかかりますは事実です。オンプレの Windows Server + SQL Serverのシステムをそのままクラウドに移行したい時とかはAzureのほうが圧倒的に安いのではないでしょうか。そのような開発には関わったこと無いので明言はできないですけど。
また、DB系は全般的に安いので、セキュリティ等の非機能要件には気をつける必要があるという前提はありますが、CosmosDBとかもうまく使えば便利そうです。(AWSのDynamoDBと違ってGSIやLSI等の概念も無いので、比較的とっつきやすいです)
他には、ComputerVisionみたいなSaaS系のリソースも使い勝手がよい印象はあります。無料枠もそれなりにありますし!

まだまだ、私の勉強が足りていない部分も多々ありますが、AWSからAzureに行くと考え方が違うところが多すぎて扱いづらいと感じてしまいます。
もっと分かりやすて使いやすくなれば、利用者も増えるでしょうし、技術者も苦しまなくなってみんなハッピーになるんじゃないのかなと思います。