LoginSignup
15
3

More than 3 years have passed since last update.

※この記事は Microsoft Azure Tech Advent Calendar 2019 の 5 日目の記事です。

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

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

# あまり最近は聞かないですが。

マルチテナント(ASE 以外) のApp Service のスケールにはいくつかスペックのグレードが存在し、その最上位のスペックは PremiumV2 プランです。
image.png

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

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

この機能は、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 アプリケーションを起動することができるので、ちょっとした追加であれば、スタート アップ スクリプトを工夫することで、前処理の処理が可能です。

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

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

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

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

    /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 は実行させたい処理を記載したシェル スクリプト

  3. Azure ポータルより、1. で作成した /home/start.sh を "スタートアップ コマンド" として設定して、再起動する

    image.png

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

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 ヘッダーを表示しないように、起動前に設定ファイルを編集する方法が記載されています。

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

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


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

15
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
3