App Service 小ネタ集

※この記事は [Microsoft Azure Tech Advent Calendar 2019](https://qiita.com/advent-calendar/2019/microsoft-azure-tech) の 5 日目の記事です。

Azure App Service で時々耳にする質問を少しピックアップしてまとめましたので、ご参考にしていただければ。

# その 1: 「PremiumV2 にスケールアップできない！」

<font color="gray"># あまり最近は聞かないですが。</font>

マルチテナント(ASE 以外) のApp Service のスケールにはいくつかスペックのグレードが存在し、その最上位のスペックは PremiumV2 プランです。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90361/4856d719-05f6-4935-96d0-c2df32e11d5a.png)


PremiumV2 プランが選択可能かどうかで、利用できる機能に差があります。
その一つが、App Service の新しい VNet 統合（「リージョン VNet 統合」と呼ばれます）です。

リージョン VNet 統合を使うために、その App Service が PremiumV2 で動作している必要はありません。
ですが、PremiumV2 プランをサポートしたスケール ユニット上にデプロイされている必要があります (Azure ポータルの \[スケール アップ] のブレードにて、PremiumV2 へのスケール アップが可能かどうか)。

- リージョン VNet 統合 - アプリと Azure 仮想ネットワークを統合する - Azure App Service | Microsoft Docs<br>
  https://docs.microsoft.com/ja-jp/azure/app-service/web-sites-integrate-with-vnet#regional-vnet-integration

> この機能は、PremiumV2 の App Service プランをサポートする新しい App Service スケール ユニットからのみ使用できます。

スケール ユニットについては、[こちら](https://blogs.msdn.microsoft.com/jpcie/?p=325)に説明があるので、参考にしていただきたいのですが、実は、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 アプリケーションを起動することができるので、ちょっとした追加であれば、スタート アップ スクリプトを工夫することで、前処理の処理が可能です。

[^1]: App Service on Linux は、マイクロソフトから提供される各ランタイム言語向けの Docker イメージ (Blessed Images) をベースとした Docker コンテナーを起動しています

  - appsvc's Profile - Docker Hub<br>
    https://hub.docker.com/u/appsvc
  - Azure App Service - GitHub<br>
    https://github.com/Azure-App-Service

このスタート アップ スクリプトの仕組みを使って、Web アプリケーションの起動のタイミングで cron をインストールし、適当なジョブを設定してみます。

### cron の追加インストール＆起動手順

  1. 既定のスタートアップ スクリプト `/opt/startup/startup.sh` をコピーする。<br>

     ```sh
     cp /opt/startup/startup.sh /home/start.sh
     ```
  1. 多くの場合コピーしたスクリプト `/home/start.sh` の最後の行が Web アプリケーションの起動コマンドになるので、最後の行を残して削除し、その直前に追加の処理 (cron のインストールや追加設定など) を記載する。

     ```sh:/home/start.sh
     apt 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` は実行させたい処理を記載したシェル スクリプト
  1. Azure ポータルより、1. で作成した `/home/start.sh` を "スタートアップ コマンド" として設定して、再起動する<br>
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90361/d35a4537-caf4-1d98-0836-05a63fafc157.png)

正常に動作すると、以下のようなプロセス ツリーになります。

```sh:ProcessTree
/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<br>
    http://jsandersblog.azurewebsites.net/2019/08/06/custom-startup-script-for-php-azure-app-service-linux/<br>

前処理として、外部からソースをダウンロードしてコンパイル、みたいなこともやろうと思えばできるかもしれませんが、あまり重たい前処理を入れると、初回リクエストの起動処理に時間がかかってしまいますので、お勧めはしません。
その場合は、カスタム コンテナーと Web App for Containers の利用も検討してください。

<!--
# App Service Managed Certificate 注意点
まだ発表されたばかりで、問い合わせもそう多くないですが、App Service Managed Certificate という App Service 専用の無料 SSL 証明書発行サービスが始まります。
-->

以上、Azure App Service の小ネタでした。