このエントリは2022/02/21現在の情報に基づいています。将来の機能追加や変更に伴い記載内容との乖離が発生する可能性があります。
問い合わせ
以下のような問い合わせをもらった。
Angularで作ったアプリケーションをAzure App Service (Node.jsランタイム) にデプロイしようとしたところエラーが出た。どうしたらよいか?
よくわからないのでもう少し尋ねてみた。
- 利用しようとしているApp Serviceはnode.js
- OSはLinux
- 作成したAngularアプリケーションはローカルで動作確認済み
- <App>/dist/<App> 配下のファイルをZipで固めてAzure CLIでデプロイしたところ、エラーが発生
- エラーの内容をチェックしたところ、デプロイ時にビルドしようとしているがビルド対象のソースがない旨のエラーが出ていた
つまり、ビルド成果物をデプロイしているにも関わらず、デプロイ中にさらにビルドしようとしているため、このデプロイ中のビルドを無効にしたい、ということ。
2. 原因
Oryxが動作していたことが原因。Azure使いの方であればすぐに想像できたかもしれない。
3. 背景
App Service(ならびに同一プラットフォームであるFunctions)には、デプロイ時にソースを自動ビルドを実施する仕組み (Oryx) が組み込まれている。
Oryx
https://github.com/Microsoft/Oryx
このOryxを利用する・しないはアプリケーション設定でENABLE_ORYX_BUILD
にてtrue
/false
で指定できるが、デフォルト値はtrue
である。下図はアプリケーション設定のデフォルト値(一部)であるが、しっかりtrue
になっていることがわかる。

通常、以下のアプリケーション設定を構成していれば、Oryxの利用は間接的に無効化される(デプロイ時のビルドをやらない、という設定)。
SCM_DO_BUILD_DURING_DEPLOYMENT=FALSE
なお以下のドキュメントに記述の通り、この設定のデフォルトはfalseなので、通常はこの設定を入れておく必要はない。
展開のカスタマイズ / Deployment customization
https://docs.microsoft.com/azure/azure-functions/deployment-zip-push#deployment-customization
ところが、うっかりこの設定をtrueにしてしまうと、ENABLE_ORYX_BUILD
のデフォルト値はtrue
なので、デプロイ時に自動ビルドが走ってしまう可能性がある。そのため、Oryxを使わないよう
ENABLE_ORYX_BUILD=FALSE
明示的に指定しておけば、デプロイ時のビルドは抑止され、成果物をデプロイできる。
4. リモートビルドを有効化したい場合
リモートビルド(サーバーサイドでのビルド)を有効にするには、明示的に両者をtrue
にする必要がある。
SCM_DO_BUILD_DURING_DEPLOYMENT=true
ENABLE_ORYX_BUILD=true
このあたりは以下のFunctionsのドキュメントにも記載がある。FunctionsのOSをLinuxにした場合、Core Toolsなどを使ってリモートビルドする挙動がデフォルトであるが、この挙動はApp Serviceへのデプロイの場合でも同様である。
Linux でのリモート ビルド / Remote build on Linux
https://docs.microsoft.com/zure/azure-functions/functions-deployment-technologies#remote-build-on-linux
Linux でリモート ビルドを有効にするには、次のアプリケーション設定を行う必要があります。
Linux でのリモート ビルド / Remote build on Linux
To enable remote build on Linux, the following application settings must be set:ENABLE_ORYX_BUILD=true
SCM_DO_BUILD_DURING_DEPLOYMENT=true
で今回のような、ビルド済みの成果物をデプロイする場合は、両方をfalseにしておくのが確実、ということ。
4. 結果
この内容をお伝えしたところ、問題なくデプロイできて稼働した、との連絡をもらった。