はじめに
Azure App Serviceの製品である、Azure Web Appについて勉強したので、学んだことを本記事にまとめます。Web Appは豊富な機能を持つPaaSのWebサーバーになります。Webサーバーを用意する際、Azure Virtual Machine上にWebサーバーのソフトウェアをインストールして用意しても当然問題ありませんが、環境のセットアップ、スケーラビリティ、冗長化、継続的インテグレーション、認証、テスト、監視、などを実施するには実装コストもインフラの運用コストも非常に高いです。そこで、本記事で紹介しているWeb Appを用いることで、これらのコストを抑えて堅牢なWebサーバーを簡単に利用することができるため、よりアプリケーションやコンテナの開発に集中的に取り組むことができ、生産的な開発に繋がります。Microsoftの公式ドキュメントを元に、以前App Serviceの基本をまとめた記事があるので、興味のある方はこちらもご覧ください。
Web Appの特徴
- OSとランタイムの管理が不要
- 継続的インテグレーション
- Easy Authによる簡単な認証機能の利用
- 柔軟なスケーラビリティ
- デプロイスロットのスワッピング
- 仮想ネットワークでの占有利用
- App Service Planごとの料金体系
- 補助的なバックグラウンドジョブの実行
- VNet統合
- カスタムドメイン
- SSL証明書
- CMS
- ハイブリッド接続
OSとランタイムの管理が不要
Web Appでは、Windows、Linux、Container、の3種類のアプリケーションと、.NET、Node.js、Java、PHP、Python、Ruby、Go、のランタイムが選択できます。選択したランタイムは、Microsoft側で自動的にパッチ適用をしてくれるため、ユーザーによる管理が不要になります。
2023年10月30日現在にAzureポータルからWeb Appを作成する際に選択できるランタイムを以下の表にまとめました。
| Runtime | Windows | Linux | Container |
|---|---|---|---|
| ASP.NET V4.8, ASP.NET V3.5 | 〇 | × | 〇 |
| .NET 8(LTS)(プレビュー), .NET 7 (STS), .NET 6(LTS) | 〇 | 〇 | 〇 |
| Java 17, Java 11, Java 8 | 〇 | 〇 | 〇 |
| Node 18 LTS, Node 16 LTS | 〇 | 〇 | 〇 |
| PHP 8.2, PHP 8.1, PHP 8.0 | × | 〇 | 〇 |
| Python 3.11, Python 3.10, Python 3.9, Python 3.8 | × | 〇 | 〇 |
Web App for Containersでは、Azure Container RegistryやDocker Hubからコンテナーイメージをデプロイすることが可能です。
AzureポータルでWeb Appを作成する際は、以下の赤い点線の枠内の項目を選択することで、Windows、Linux、Containerを選択することができます。
継続的インテグレーション
Web Appでは、Azure DevOps、GitHub、BitbucketによるCI/CD環境の構築が簡単にできます。
Web Appは手動によるデプロイにも対応しており、Git、Azure CLI、FTP、によるデプロイが可能です。
Azureポータルで継続的インテグレーションを設定するには、「デプロイセンター」をクリックし、「ソース」から使用するプロバイダーを選択してください。下図はGitHubをソースとして選んだ場合の図であり、選択した組織、リポジトリ、ブランチ、を選択して設定ができます。

継続的デプロイのソースとして、GitHub以外にもBitbucketやローカルGit、Azure Reposを選択できます。
Easy Authによる簡単な認証機能の利用
Web App組み込みの機能であるEasy Authを有効にすることで、認証認可を簡単に実現できます。認証と認可のミドルウェアはApp Serviceと同じVMで実行され、全てのHTTP要求はWeb Appの前に通過します。
Easy Authにより、ソースコードを変更することなく、様々な認証プロバイダーと連携した認証機能が利用できます。認証プロバイダーとして利用できるのは、Azure Active Directory、Microsoft、Facebook、Google、Twitter、GitHub、が使えるようになっています。
以下は、GitHubを認証プロバイダーとして利用した場合のEasy Authの設定方法です。GitHubにログインし、画面右上のアイコンを選択した後、「Settings」を押します。
次に、「Developer Settings」を押します。
「OAuth Apps」を押します。
「Register a new application」を押します。
Application nameとHomepage URLとAuthorization callback URLを入力して、「Register application」を押します。
Homepage URLはAzureポータルのWeb Appの概要画面の「既定のドメイン」(下図の赤枠で囲われたURL)になります。Authorization callback URLは、Homepage URLに/.auth/login/github/callbackのパスを追加したものになります。
今回の場合のHomepage URLとAuthorization callback URLは以下のようになります。
-
Homepage URL:https://sample-web-app-20231029.azurewebsites.net -
Authorization callback URL:https://sample-web-app-20231029.azurewebsites.net/.auth/login/github/callback
「Client ID」をコピーし、「Generate a new client secret」を押して、表示された「Client secrets」をコピーします。
「IDプロバイダーを追加」します。
「IDプロバイダー」を選択し、「クライアントID」「クライアントシークレット」にコピーした情報を貼り付けます。その後「追加」を押します。
プロバイダー一覧に、GitHubが表示されました。
https://sample-web-app-20231029.azurewebsites.netにアクセスすると、GitHubのサインイン画面が表示され、認証機能が実装されていることを確認できました。
柔軟なスケーラビリティ
Web Appでは、自動スケーリングの機能が実装されており、スケールアウト、スケールインによるスケーリングを行うことができます。Web Appでは、自動スケーリングと、スケーリングルールによる自動スケーリングがあります。
自動スケーリングとは、アプリケーションの負荷に応じてリソースを自動的に追加および削除するために使用できるサービスです。
以下の表に、Web Appで利用できるスケーリングオプションの比較をまとめます。
| 手動 | 自動スケーリング | スケーリングルールによる自動スケーリング | |
|---|---|---|---|
| 利用可能なレベル | Basic以上 | Premium V2, Premium V3 | Standard以上 |
| ルールベース | × | × | 〇 |
| スケジュールベース | × | × | 〇 |
| 常時使用可能なインスタンス | × | 〇(最小1) | × |
| 事前ウォーミングされたインスタンス | × | 〇(既定1) | × |
| アプリごとの最大値 | × | 〇 | × |
自動スケーリング
自動スケーリングを有効にするメリットは、メトリックに関する自動スケーリングのルールを設定する必要がないことにあります。Azureポータルの画面で、Web Appを選択してから「スケールアウト」選びます。表示された画面から「Automatic」の項目を選択した後、App Service Planインスタンスの最大数として「Maximum burst」を選びます。Web Appインスタンスの最小値を指定したい場合は、「Always ready instances」で数字を指定し、Web Appインスタンスの最大値を指定したい場合は、「Enforce scale out limit」を選択し、「Maximum scale limit」で数字を指定します。
最大バーストとは、App Service Planで増やすことができるインスタンスの最大数です。
スケーリングルールによる自動スケーリング
スケジューリングルールは、スケジュールとリソースに関するルールを定義することができ、このルールに基づいて自動スケーリングを行います。設定するには、AzureポータルでWeb Appの「スケールアウト」を選択した後表示された画面で、「Rules Based」を押すと表示される「Manage rules based scalinlg」のリンクを押下します。
「カスタム自動スケーリング」を選択します。するとカスタム自動スケーリングの欄が表示されるので、自動作成された既定のスケジュール条件を変更していきます。
「メトリックに基づいてスケーリングする」を選択し、「規則を追加する」のリンクを押下します。するとスケールルールが表示されるので、表示された画面でルールの定義ができます。インスタンスの制限では、インスタンスの最大値を増やしたい場合は「最大値」を変更します。
スケールルールでは、メトリック名は「CPU Percentage」の他にも「Memory Percentage」などがあります。画像ではスケール操作をトリガーするメトリックのしきい値を「70」としているので、10分間の平均CPU使用率が70%を超えたときに、Web Appのインスタンス数を1つ増やすというルールになっています。
デプロイスロットのスワッピング
デプロイスロットを利用すると、運用スロットと検証スロットのスワップを行うことができます。スワップを行うことで、本番環境のダウンタイムが短くなるのと、バグが含まれていた場合のロールバックが容易になります。また、スロットごとの振り分け率を決め、トラフィックを振り分けるカナリアテスト(A/Bテスト)も可能です。
設定するにはAzureポータル画面で、「デプロイスロット」を選択し、表示された画面で「+スロットの追加」を押します。
表示される画面で、スロットの追加を行います。スロット名を入力したら「追加」を押します。
新しいデプロイスロットが追加されたことがわかりました。
新しいデプロイスロットには内容がありません。スロットにはGitを使って、異なるブランチ、リポジトリからデプロイが可能です。
これらのスロットを入れ替えるためには、「スワップ」を押します。
ソースのスロットと、ターゲットのスロットを指定し、「スワップ」を押すことで、スロットの入れ替えができます。
スワッピングにより、一般設定、アプリ設定、接続文字列、の情報はスワップされますが、発行エンドポイント、カスタムドメイン名、IP制限、仮想ネットワーク、などはスワップされません。
仮想ネットワークでの占有利用
ASE(Azure App Service)は、他のユーザーとユニットを共有するマルチテナント型サービスになりますが、App Service Environmentを使うことで、ユーザーの仮想ネットワーク内に直接App Serviceをデプロイすることができ、シングルテナント型サービスとして利用することも可能です。
ASEを使うには、「価格プラン」を「Isolated V2」に選択します。地域はグレーアウトされますが、後ほどのネットワークタブの項目で、デプロイ先の仮想ネットワークとサブネットを指定することになります。
ASEの作成では、ネットワークタブで以下のように「仮想ネットワーク」と「サブネット」の指定が必要になります。
App Service Planごとの料金体系
契約したApp Service Planの中で、いくつWeb AppやFunctionsをデプロイしたとしても、Azureのコストは変わりません。つまり、複数サイトを同居させることでコストメリットの高いサービス運用が可能になります。
App Service Planとは、CPUやメモリーなどのアプリを動かすVMサーバー群のスペックを決める枠組みになります。
補助的なバックグラウンドジョブの実行
補助的なバックグラウンドジョブを実行するための機能として、WebJobsがあります。WebJobsにより、プログラムやスクリプトを実行することができます。WebJobsには、継続的WebJobと、トリガーされるWebJobがあります。
Azureポータルで設定するには、「Webジョブ」を押し、表示された画面で「+追加」を選択します。するとWebジョブの追加が表示されるので、ジョブ名、実行するジョブファイルのアップロード、ジョブの種類、スケーリング有無について選択した後、最後に「Webジョブの作成」を押すとWebジョブが作成されます。
WebJobsはApp Service on Linuxではまだサポートされていません。
VNet統合
Web Appでは、VNet統合を利用することで、簡単にVnet内のAzureリソースにアクセスすることができます。
Azureポータルで設定するには、「ネットワーク」を押した後に表示される画面で、送信トラフィックの「VNET統合」を押下します。
「仮想ネットワーク統合の追加」を押します。
仮想ネットワーク統合の追加画面が表示されるので、統合するサブスクリプション、仮想ネットワーク、サブネットを選択し、「接続」を押せばVNet統合完了です。
カスタムドメイン
カスタムドメインの設定は、Web Appの標準機能として提供されています。
Azureポータル画面でカスタムドメインを設定するには、「カスタムドメイン」を選択します。表示される画面で「+カスタムドメインの追加」を押し、「ドメインプロバイダー」「TLSまたはSSL証明書」「TLS/SSLの種類」「App Serviceドメイン」の項目を選択して「検証」を押します。
カスタムドメインを設定するには、App Service PlanがFree(F1)ではなく、有料レベルであることが必要です。
SSL証明書
SSL証明書のバインドも、Web Appの標準機能として提供されています。
Azureポータル上で、無料のマネージド証明書を作成&バインドする設定をしていくには、まず「証明書」を押し、表示された画面で「+証明書の追加」を選択します。するとApp Serviceマネージド証明書の追加画面が表示されるので、所有しているカスタムドメインを選択し、「検証」ボタンを押して検証したのち、「追加」ボタンを押すことで無料のマネージド証明書を作成することができます。
App Serviceのカスタムドメインを保護するだけなら、無料のプライベート証明書で十分です。
CMS
Web Appでは、Wordpress、Drupal、といったCMS(コンテンツマネジメントシステム)を簡単にデプロイすることができます。
ここではWeb App上で動くWordpressを作成します。Azureポータル画面の検索ポータルで「wordpress」と入力し、Marketplaceの「WordPress on App Service」を選択します。
App ServiceでWordpresを作成する画面が表示されますので、必要項目を全て入力してから「確認および作成」ボタンを押すとWordpressが作成されます。
ハイブリッド接続
ハイブリッド接続によって、アプリからTCPエンドポイントへのアクセスができるようになります。
Azureポータルで設定するには、「ネットワーク」を押して表示された画面で、送信トラフィックの「ハイブリッド接続」を押します。
「+ハイブリッド接続の追加」を押します。
「ハイブリッド接続の新規作成」を押すと、ハイブリッド接続の新規作成画面が、画面右側に表示されるので、必要情報を入力してから「OK」ボタンを押すとハイブリッド接続ができます。
おわりに
本記事では、Web Appの主な機能とAzureポータルでの設定方法をまとめました。今まではWeb Appを使ったWebアプリ開発をしたことがなく、VM上でWebサーバーのソフトウェアをインストールしておりましたが、Web AppにはWebサーバーとして運用するために便利な機能が豊富にあり、簡単に利用することができること知ってとても驚きました。Web Appを上手に利用することで、VM上にサーバーを用意する方法と比較して開発運用コストを大幅に削減できることができるため、今後Webアプリを作るときは、次は必ずWeb Appを使おうと思いました。













































