Azure で初めて Web アプリを動かしたいと思ったときにざっくりとサービスの概要を知ることができるまとめ記事

##この記事に書いてあること
AzureはAWSと比べて情報が少ないし、公式ドキュメントはちょっとわかりにくいという声を聞くことがあります。わかる。
Webアプリってどのサービスで動かせるんだ？って思ったときに最初に知っておくとよさそうなサービスをいくつか紹介、そして独断と偏見で比較をしてみたいと思います。
あとは参考になるドキュメントもペタペタと貼っています。


##どんなサービスがあるのか
####Virtual Machines - IaaS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320008/97e4b239-e73b-8be4-df16-2f4479eef840.png)
VM や仮想マシンとも呼ばれます。IaaS に分類されるサービスなのでオンプレと同じくらい自由度は高いですが、その分運用の手間がかかります。
Linux や Windows のサーバーを立てるところまでは自動ですが、ミドルウェアやアプリケーションは自分で入れる必要があります。ウイルス対策ソフトなど会社のITポリシーで決まったソフトを入れないといけない場合にも対応できます。OS やミドルウェアの更新などは運用作業で。。

公式ドキュメント
https://docs.microsoft.com/ja-jp/azure/virtual-machines/

#### Web Apps (App Service) - PaaS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320008/91ec8710-3ab4-4c5d-72f8-393b485e0215.png)
用語がわかりにくいのですが、Web Apps と呼ばれたり App Service と呼ばれたりします。
PaaS に分類されるのですが、アプリを動かすためにやることは App Service のリソース作成とアプリのデプロイだけです。
Visual Studio を使うと[リソース作成からデプロイまで](https://docs.microsoft.com/ja-jp/azure/app-service/quickstart-dotnetcore?pivots=platform-windows)最短 5 分くらいだと思います。

公式ドキュメント
https://docs.microsoft.com/ja-jp/azure/app-service/

以下の画像のように設定画面で簡単に設定変更できるのですが、基本的には .NET、.NET Core、PHP、Python、Java、あとは Node.js のアプリに対応しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320008/753076d2-b8bf-991c-85b5-381feecd9208.png)

PaaS といっても内部的には VM (Cloud Services or VMSS) が使われていて、ベースの OS は Windows または Linux を選択することができます。また、Docker コンテナを動作させることもできるので、先の説明で記載していなかった Ruby や Rust などの任意のアプリも動きます。
例えば、Ruby の場合には[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/app-service/quickstart-ruby)や [Azure-App-Service という GitHub リポジトリ](https://github.com/Azure-App-Service/ruby/blob/master/tutorials/hello-world/README.md
)にイメージやデプロイの手順が転がっています。


App Service にあって VM にはない便利機能はいろいろありますが、中でもアプリのダウンや遅延など問題が発生したとき、原因や対処方法を簡単に調べることができるツールはとても便利です。
詳細は[こちらの記事](https://qiita.com/TsuyoshiUshio@github/items/f5be552cc9e01771567d?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items)がとても参考になります。あとは[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/app-service/overview-diagnostics)にもちょっと。

App Service は簡単、便利ではあるのですが、Windows のレジストリや Linux の /etc 配下の設定など OS レベルの設定変更やチューニングは制限されているのでできません。このような App Service の制限は[こちら](https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox) に情報があります。


####その他いろいろ
Cloud Services や Service Fabric、Azure Kubernetes Service (AKS) などがありますが、「AzureでWebアプリを構築したいが何やらいろんなサービスがあってよくわからない」というときに選択肢にいれるとますます迷うので一言二言でまとめます。（詳細に語れないだけ）

######Cloud Services
Windows + IIS の VM がベースの PaaS です。ASP.NET のアプリを運用する場合には適していますが、それ以外は不向きだと思います。Visual Studio で事前にアプリの開発と IIS などの構成を行っておいて、あとはデプロイ！そうすると VM 作成、IIS の構成、アプリの配置が自動で行われます。VM はデプロイするたびに再作成されるので、RDP して GUI で構築したものはすべて消えます。
https://docs.microsoft.com/ja-jp/azure/cloud-services/cloud-services-choose-me

######Service Fabric
MS 製のコンテナオーケストレーションサービスです。以下のように信頼性の高いサービスの運用に向いているのですが、その反面構築難易度は高いです。（よく知らない）

>現在、Service Fabric は、Azure SQL Database、Azure Cosmos DB、Cortana、Microsoft Power BI、Microsoft Intune、Azure Event Hubs、Azure IoT Hub、Dynamics 365、Skype for Business、などの Azure の核となる多くのサービスを含む、さまざまな Microsoft サービスで使用されています。
https://docs.microsoft.com/ja-jp/azure/service-fabric/service-fabric-containers-overview

######Azure Kubernetes Service (AKS) 
Azure のマネージド Kubernetes です。以上。
https://docs.microsoft.com/ja-jp/azure/aks/intro-kubernetes

######Functions
いわゆるサーバーレスとか FaaS (Function sa a Service) と呼ばれるものです。Functions の SDK を元に専用のアプリの開発を行う必要がありますが、用途が Web API やバッチ処理の場合には便利です。
例えば、決まった時間に何かをファイル処理をするとか、URL を叩けば DB からデータを取ってきて JSON で返すとか。あとは、ストレージにデータが作成/更新されたことをきっかけにそのデータをどこかに送りたい、メッセージキューにメッセージが入ったときにそれを処理したいとかも比較的簡単にできます。
App Service がベースになっているので、それと同様に簡単に構築や監視などができます。


##比較
#####構築、運用のしやすさ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320008/b0d05e59-1e1c-d4da-e310-ca66281511b1.png)
App Service は OS やミドルウェアの構築や管理を自分でしなくてよいので楽です。(MS が好きなときにやってしまうとも言える) 
一方、VM の場合は必要なミドルウェアのインストールや設定などの構築に手間がかかるだけではなく、運用でバックアップやその管理をしないと、いざというときに切り戻しができない、構築しなおしとなってしまうので、運用の手間はオンプレと変わらないです。


#####可用性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320008/cd6d8da6-3247-4a65-193c-2146fa125cb8.png)

VM は構成次第で SLA 99.99% 以上、App Service は SLA 99.5% です。

>すべての仮想マシンに、同じ Azure リージョン内の 2 つ以上の可用性ゾーンにまたがりデプロイした 2 つ以上のインスタンスがある場合、マイクロソフトは、99.99% 以上の時間において少なくとも 1 つのインスタンスに対する仮想マシン接続が確保されることを保証します。
https://azure.microsoft.com/ja-jp/support/legal/sla/virtual-machines/v1_9/

どのサービスにも共通して言えますが、定期 or 不定期でメンテナンスが発生します。(どのサービスにもというのは後述の Cloud Service や App Service も VM を元に作られているためです)
そのため、複数のインスタンスを構成したり、別のリージョン (地域) に同じアプリを配置して地理的に分散することで可用性を高めます。
VM は通常共有の物理サーバーが使用されますが、Dedicated Host というサービスを使うことで自分専用の物理サーバーを使うことができるため、メンテナンスも多少の融通が利くようになります。高い可用性が求められる場合はこれが良いでしょう。

>メンテナンス管理により、お客様は、専用ホストでスケジュールされた通常のプラットフォーム更新をスキップし、35 日のローリングウィンドウ内で選択した時点で適用することができます。
https://docs.microsoft.com/ja-jp/azure/virtual-machines/dedicated-hosts#maintenance-control

App Service はアプリを動かすサーバーの他に L7 のロードバランサーやファイルサーバーなど複数のサーバーによって構成されています。詳しくは[こちら](https://docs.microsoft.com/en-us/archive/msdn-magazine/2017/february/azure-inside-the-azure-app-service-architecture
)
各サーバーでもメンテナンスはありますが、以下に記載のようにそもそもクラウドというものはそういうものだと理解して使うことが大切です。特に PaaS はサーバー運用を任せてしまっているので。
とはいえ、何もせず諦めるのではなく App Service で用意されている機能や設定、さらにはアプリで DB やWeb API などの外部接続時のリトライやセッション情報の外部保持を行うなどの工夫を行い、ユーザー影響を抑えるようにできると良いと思います。

>Modern-day data centers are extremely complex and have many moving parts. VMs can restart or move, systems are upgraded, and file servers are scaled up and down. All these events are to be expected in a cloud environment.
https://azure.github.io/AppService/2020/05/15/Robust-Apps-for-the-cloud.html

App Service の設定については上記のドキュメントよりも [後悔しないための Azure App Service 設計パターン (2020 年版)](https://blog.shibayan.jp/entry/20200113/1578920798) にかなり詳しく情報がまとまっています。
アプリの設計という点では[自己復旧の設計](https://docs.microsoft.com/ja-jp/azure/architecture/guide/design-principles/self-healing)というドキュメントが役立ちそうです。


#####費用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320008/57ece98a-0bb9-a67c-77f0-d15a9fa98f61.png)

VM も App Service もマシンの性能によって価格が変わりますが、同レベルの CPU、メモリで比較すると App Service の方が安いです。
価格の一覧表的なのは以下のページにあります。

VM
https://azure.microsoft.com/ja-jp/pricing/details/virtual-machines/windows/

App Service 
https://azure.microsoft.com/ja-jp/pricing/details/app-service/windows/

VM や App Service を複数使いたいときやそれ以外にもいろいろ組み合わせて使う場合には、計算ツールで合計を見積もることができます。

計算ツール
https://azure.microsoft.com/ja-jp/pricing/calculator/

VM 1 つの見積の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320008/a347eda6-5239-76d7-2162-bbe851543d49.png)

App Service 1 つの見積の例
https://docs.microsoft.com/ja-jp/azure/virtual-machines/dedicated-hosts#maintenance-control
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320008/3f9b2072-c4cb-e3bf-d041-2234368813c1.png)



##まとめ
運用の手間や費用を抑えたい場合には App Service、高い可用性が求められるシステムでは VM が良いのではないかと思います。知らんけど。