Microsoft Azure は、Amazon Web Service や Google Cloud Platform などのようなクラウドサービスです。
この度お仕事でAzureを使うことになりそうなので、勉強がてら触り始めたのですが、ちょっとこれはマズいな…というくらい自分自身が内容を飲み込めてないので(たぶん私が目的を達成しようと横着して関係ありそうなところだけで理解しようとしているから起きている問題だと思いますが)、アウトプットすることで頭の整理をしたいと思い「私のための」入門記事を書いてみることにします。
それはそれとしてちょっとだけ愚痴を言うと、Azureのドキュメントがなんとも言えず読みにくく(どこがどのように読みにくいのか上手く言語化できないのですが)、本当に頭に入ってこないんですよ。目的
Azureを使用してRDBMSを用いたWebアプリ(SPA + REST API)を作成したい。
リージョンは特に問題なければ、 東日本(Japan East)を選択する。
DB
https://azure.microsoft.com/ja-jp/product-categories/databases/
AzureはMicrosoftのクラウドサービスですから、SQL Serverが優遇されているようです。
Azure SQL Database、Azure SQL Managed Instance、Azure Virtual Machines における SQL ServerあたりはどれもSQL Serverのお話です。仮に別のRDB製品を選択したい場合は、
- Azure Database for PostgreSQL
- Azure Database for MySQL
- Azure Database for MariaDB
が選択肢になりそうです。
ひとまず Azure Database for PostgreSQL について見てみると、Azure Database for PostgreSQL とはフルマネージドな PostgreSQL を提供するサービスであり、単一サーバー、フレキシブルサーバー、Hyperscale (Citus) の3つのデプロイモード?があるようです。
一般的なHA構成を求めているのであればフレキシブルサーバーを選択するべきなのでしょう。おそらく。
フレキシブルサーバーのゾーン冗長 HA は、東日本(Japan East)リージョンで利用可能です。フレキシブルサーバーにおけるPostgreSQLのバージョンは11、12、13が選択できます。(ちなみに現時点のPostgreSQLの最新バージョンは14.2)
接続数の上限は SKU 毎に設定されています。たとえば B1ms では最大接続数は 100 です。その他の制限については以下を参照ください。
https://docs.microsoft.com/ja-jp/azure/postgresql/flexible-server/concepts-limits
Webアプリ(SPA + REST API)
Webアプリの選択肢になりそうなのは、
- Virtual Machines
- App Service
- Azure Functions
- Static Web Apps
あたりかなと思います。他に Azure Kubernetes Service もありますが、私が Kubernetes に詳しくないので除外しました。
まず、 Virtual Machines は普通に仮想マシンを立ててアプリを載せるアレです。(AWS EC2相当)
そして、App Service が PaaS(AWS Beanstalk相当)、Azure Functions が FaaS(AWS Lambda相当)という理解です。
最後の、Static Web Appsは、API(Azure Functions)、SPAのホスティング、CDN、CI/CDを一まとめにしたようなサービスのようです。たぶんこれが一番、私が求めているものに近い気がします。
Static Web Apps
目的に近いと思われる、Static Web Apps について追加で調査します。料金プランやDBとの経路はどうなるのでしょう。
https://docs.microsoft.com/ja-jp/azure/static-web-apps/
- アプリは指定したgitリポジトリにpushするとCI/CDが動き、SSGのビルドをして成果物をデプロイする
- 同じドメインでAPIも提供するため、CORSの設定が不要
- プライベート エンドポイント構成にすると、VNet(仮想ネットワーク)内からのアクセスしかできない
私が期待する挙動としては、プライベートネットワークに置いたDBにAPIだけがセキュアに接続したいところなのですが、これだと静的サイト自体もプライベートネットワークに配置することになりそうですね。
Azure Functions + API Management
Static Web AppsだとプライベートネットワークにあるDBへ接続が難しそうだ、ということが分かったので、気を取り直して Azure Functions で実現できるのか調査します。

やりたいことはこんな感じ。
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-vnet
Functions は 専用 (App Service) プランまたはPremiumプランであれば プライベート エンドポイント を利用することができるようです。 Premiumプランの場合、実行環境が常時起動しているため、月額料金となります。 Japan Eastリージョンでは$178/mo〜というコスト感。(+スケールアウトユニット)
API Management は Developer プランで VNetサポートがあるとのこと。Deeloperプランは $48/mo ですね。
Functions の Premiumプランを使用し、VNet統合をした上でプライベートエンドポイントを有効にしない場合は、直接Functionsにパブリックアクセスできるという理解で良いんですかね?
Function Apps をVNet統合するARMテンプレート
https://github.com/Azure-Samples/function-app-arm-templates/tree/main/function-app-vnet-integration
Azure Resource Manager(ARM)は、AWS Cloudformation のように、定義ファイルでリソースを作成できるサービス。
App Service
App ServiceでVNet統合を使用する場合は、Standardプランを選択する必要があります。Standardプランは$86.14/moとのこと。

図にするとたぶんこう。
こうやって調べてみると、コストメリット的には(VNetと連携したい場合は) Azure Functions よりも App Service が良さそう?
ネットワーク
仮想ネットワーク(VNet)
AWSのVPC相当。VNet内にサブネットを作れる。
Private Link サービス、サービス エンドポイント、プライベート エンドポイント
Azure プライベート エンドポイント : Azure プライベート エンドポイントは、Azure Private Link を使用するサービスにプライベートかつ安全に接続するネットワーク インターフェイスです。 プライベート エンドポイントを使用すると、Private Link をサポートする Azure PaaS サービスや、独自の Private Link サービスに接続できます。
Azure Private Link サービス : Azure Private Link サービスは、サービス プロバイダーによって作成されるサービスです。 現時点では、Private Link サービスは、Standard Load Balancer のフロントエンド IP 構成に接続できます。
プライベート エンドポイントでは、詳細なセグメンテーションを提供する特定のサービスの背後にある特定のリソースへのネットワーク アクセスが許可されます。 トラフィックは、パブリック エンドポイントを使用せずにオンプレミスからサービス リソースに到達できます。 サービス エンドポイントは、公的にルーティング可能な IP アドレスのままです。 プライベート エンドポイントは、プライベート エンドポイントが構成されている仮想ネットワークのアドレス空間にあるプライベート IP です。
Application Gateway
L7ロードバランサー+WAF WAF機能を使うか使わないかで金額が違うようです。
Appendix
料金計算ツール
https://azure.microsoft.com/ja-jp/pricing/calculator/
共有のURLが表示できない問題は下記参照
https://zenn.dev/shisyu_gaku/articles/63ed7211d32963
https://azure.microsoft.com/ja-jp/pricing/calculator/?shared-estimate={id}