※この記事は Microsoft Azure Tech Advent Calendar 2019 の 5 日目の記事です。
Azure App Service で時々耳にする質問を少しピックアップしてまとめましたので、ご参考にしていただければ。
その 1: 「PremiumV2 にスケールアップできない!」
# あまり最近は聞かないですが。
マルチテナント(ASE 以外) のApp Service のスケールにはいくつかスペックのグレードが存在し、その最上位のスペックは PremiumV2 プランです。
PremiumV2 プランが選択可能かどうかで、利用できる機能に差があります。
その一つが、App Service の新しい VNet 統合(「リージョン VNet 統合」と呼ばれます)です。
リージョン VNet 統合を使うために、その App Service が PremiumV2 で動作している必要はありません。
ですが、PremiumV2 プランをサポートしたスケール ユニット上にデプロイされている必要があります (Azure ポータルの [スケール アップ] のブレードにて、PremiumV2 へのスケール アップが可能かどうか)。
- リージョン VNet 統合 - アプリと Azure 仮想ネットワークを統合する - Azure App Service | Microsoft Docs
https://docs.microsoft.com/ja-jp/azure/app-service/web-sites-integrate-with-vnet#regional-vnet-integration
この機能は、PremiumV2 の App Service プランをサポートする新しい App Service スケール ユニットからのみ使用できます。
スケール ユニットについては、こちらに説明があるので、参考にしていただきたいのですが、実は、PremiumV2 プランが利用できるかどうかは、App Service がデプロイされたスケール ユニットに関係しており、そして そのスケール ユニットは最初のデプロイ時に決定します。
ですので、後から PremiumV2 (もしくはそれに関連した機能) が必要になりそうであれば、最初のデプロイ時に PremiumV2 プランを選びましょう。
確実に PremiumV2 が利用可能なスケール ユニットにデプロイされます。
# デプロイに失敗したら、慌てずリトライしてください。
なおデプロイが完了後、PremiumV2 を維持する理由は特にないのであれば、サクっと Standard などにスケール ダウンしておきましょう。
その 2: 「Linux 版の App Service で Web ジョブを使いたい!」
Windows 版の App Service には、Web ジョブという機能があり、バックグラウンドで定期的な処理を実行することができます。
ログ ファイルの移動とかで使われている方がいるかと思います。
一方で、App Service には Linux 版 (App Service on Linux) もありますが、残念ながらこちらには Web ジョブのような仕組みは用意していません。
ですが、App Service on Linux では Docker コンテナー 1 上でスタートアップ スクリプトを介して Web アプリケーションを起動することができるので、ちょっとした追加であれば、スタート アップ スクリプトを工夫することで、前処理の処理が可能です。
- appsvc's Profile - Docker Hub
https://hub.docker.com/u/appsvc - Azure App Service - GitHub
https://github.com/Azure-App-Service
このスタート アップ スクリプトの仕組みを使って、Web アプリケーションの起動のタイミングで cron をインストールし、適当なジョブを設定してみます。
cron の追加インストール&起動手順
-
既定のスタートアップ スクリプト
/opt/startup/startup.sh
をコピーする。cp /opt/startup/startup.sh /home/start.sh
-
多くの場合コピーしたスクリプト
/home/start.sh
の最後の行が Web アプリケーションの起動コマンドになるので、最後の行を残して削除し、その直前に追加の処理 (cron のインストールや追加設定など) を記載する。/home/start.shapt update && apt install cron -y # cron のインストール service cron start # cron の起動 echo "*/5 * * * * sh /home/job.sh" | crontab # cron のスケジュール設定 npm start # Web アプリケーションの起動 (node.js の場合)
※`/home/job.sh` は実行させたい処理を記載したシェル スクリプト
正常に動作すると、以下のようなプロセス ツリーになります。
/home# pstree -a
bash /opt/startup/init_container.sh sh /home/start.sh
|-cron
|-sshd
(snipped)
|
`-startup.sh /opt/startup/startup.sh
`-sh /home/start.sh
`-npm
(snipped)
cron のプロセスや、既定の /opt/startup/startup.sh
の下にカスタムのスタートアップ スクリプト /home/start.sh
、さらにその下に、Web アプリケーション起動コマンド (npm
) が確認できます。
上記の例は、cron を入れて Web ジョブもどき実現する方法ですが、同じようにスタートアップ スクリプトでその他にも Web アプリケーションの起動前に各種の設定値を編集することもできます。
例えば、下記のブログには、PHP の Docker イメージをベースとして、X-Powered-By ヘッダーを表示しないように、起動前に設定ファイルを編集する方法が記載されています。
- Custom Startup script for PHP – Azure App Service Linux – HTTP Stack and other fun things I support
http://jsandersblog.azurewebsites.net/2019/08/06/custom-startup-script-for-php-azure-app-service-linux/
前処理として、外部からソースをダウンロードしてコンパイル、みたいなこともやろうと思えばできるかもしれませんが、あまり重たい前処理を入れると、初回リクエストの起動処理に時間がかかってしまいますので、お勧めはしません。
その場合は、カスタム コンテナーと Web App for Containers の利用も検討してください。
以上、Azure App Service の小ネタでした。
-
App Service on Linux は、マイクロソフトから提供される各ランタイム言語向けの Docker イメージ (Blessed Images) をベースとした Docker コンテナーを起動しています ↩