はじめに
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
を使おうと思いました。