Azure App Service on Linux (.NET 5)でアプリのデプロイをせずに静的HTMLファイルを変更したい

2021.09.25

いわさです。

Azure App Service on Linuxのランタイムが.NET5の場合に静的HTMLコンテンツを直接FTPアップロードしたい場合シーンがありました。
結論を先に書くと、FTPで静的コンテンツをアップロードする場合にランタイムに.NET5を選択するのは適していません。

dotnetコマンドでWebホストが実行されますが、その中で静的コンテンツが包括されているからです。
静的コンテンツだけだとしてもできれば、dotnetモジュールを作成しデプロイしたほうが良いでしょう。

もし、そもそも.NET5を選択する必要がなければ、ミドルウェアレイヤーでWebホストが動作しているPHPなどのランタイムを選択したほうがおそらく楽です。

今日は.NET5ランタイムを選択した場合に無理やり静的コンテンツを変更してみました。

まず、どういう動作になるのかを確認

Azure App Service on Linuxを.NET5で構築しています。
スタートアップコマンドは無しです。

FTP接続し、コンテンツ index.htmlをアップロードし、デフォルトで格納されている、hostingstart.htmlは削除しました。

再起動してページを確認してみましょう。

index.htmlが表示されて欲しいところですが、デフォルトのまま(hostingstart.html)ですね。

中身の解析

前回の記事で、Azure App Service on LinuxはSSHでアクセスして、どういう構成で何がホストされていてどういう初期化されているのかを追うのが一番解決の近道かなぁなんて思ってます。

今回も同じように見ていってみましょう。

  _____
  /  _  \ __________ _________   ____
 /  /_\  \___   /  |  \_  __ \_/ __ \
/    |    \/    /|  |  /|  | \/\  ___/
\____|__  /_____ \____/ |__|    \___  >
        \/      \/                  \/
A P P   S E R V I C E   O N   L I N U X

Documentation: http://aka.ms/webapp-linux
Dotnet quickstart: https://aka.ms/dotnet-qs
ASP .NETCore Version: 5.0.6
Note: Any data outside '/home' is not persisted
root@31d9210fcbab:~/site/wwwroot# ps -x
  PID TTY      STAT   TIME COMMAND
    1 ?        SNs    0:00 /bin/bash /opt/startup/startup.sh
   20 ?        SNs    0:00 /usr/sbin/sshd
   28 ?        SNLl   0:01 dotnet /defaulthome/hostingstart/hostingstart.dll
   41 ?        SNs    0:00 sshd: root@pts/0
   45 pts/0    SNs    0:00 -bash
   49 pts/0    RN+    0:00 ps -x
root@31d9210fcbab:~/site/wwwroot# cat /opt/startup/startup.sh
#!/bin/bash
set -e

export PORT=8080

export ASPNETCORE_URLS=http://*:$PORT

echo Trying to find the startup DLL name...
echo 'Running the default app using command: dotnet "/defaulthome/hostingstart/hostingstart.dll"'
cd "/defaulthome/hostingstart"
dotnet "/defaulthome/hostingstart/hostingstart.dll"
root@31d9210fcbab:~/site/wwwroot# cd /defaulthome/hostingstart/
root@31d9210fcbab:/defaulthome/hostingstart# ls
hostingstart            hostingstart.pdb                 wwwroot
hostingstart.deps.json  hostingstart.runtimeconfig.json
hostingstart.dll        web.config
root@31d9210fcbab:/defaulthome/hostingstart# cd wwwroot/
root@31d9210fcbab:/defaulthome/hostingstart/wwwroot# ls
hostingstart.html
root@31d9210fcbab:/defaulthome/hostingstart/wwwroot#

NginxやApacheは起動されてないですね。
dotnetコマンドが実行されています。
ブラックボックスでわかりませんがおそらくこの中でWebホストが起動されて/defaulthome/hostingstart/wwwrootがコンテンツルートになっていそうです。

というわけで、おそらく永続ストレージである /home/site/wwwrootはデフォルトだと使われていないですね。

やってみる

独自で静的コンテンツごとdotnetデプロイするのが正攻法だと思いますが、FTPで静的コンテンツだけでどうにかやってみます。
ただし、冒頭にも記載しましたが、他のランタイムやStatic Web Apps を選択することをお薦めします。

要するにコンテンツを/home/site/wwwrootから/defaulthome/hostingstart/wwwrootにコピーできればとりあえず単純には実現できそうです。
コンテナが破棄されうることを考えると割り込みできそうなところはスタートアップコマンドになるのですが、ここに記述するとデフォルトで実行されるdotnetコマンドが実行されなくなるので、それも記述するのを忘れないようにしましょう。

最終的には以下のようになります。(スクリプトファイルをwwwrootに格納して実行するとかでも良いです)
今回はとりあえずhtmlファイルをコピーしましたが、コンテンツの参照方法もやり方はある気がします。今回はとりあえずということで。

cp /home/site/wwwroot/index.html /defaulthome/hostingstart/wwwroot/index.html;dotnet "/defaulthome/hostingstart/hostingstart.dll"

スタートアップコマンドに設定したら再起動してもう一度アクセスしてみましょう。

表示されましたね。

最後にSSHでアクセスしてコンテンツの状況を確認してみましょう。

  _____
  /  _  \ __________ _________   ____
 /  /_\  \___   /  |  \_  __ \_/ __ \
/    |    \/    /|  |  /|  | \/\  ___/
\____|__  /_____ \____/ |__|    \___  >
        \/      \/                  \/
A P P   S E R V I C E   O N   L I N U X

Documentation: http://aka.ms/webapp-linux
Dotnet quickstart: https://aka.ms/dotnet-qs
ASP .NETCore Version: 5.0.6
Note: Any data outside '/home' is not persisted
root@51eb69472115:~/site/wwwroot# cd /defaulthome/hostingstart/wwwroot/
root@51eb69472115:/defaulthome/hostingstart/wwwroot# ls
hostingstart.html  index.html
root@51eb69472115:/defaulthome/hostingstart/wwwroot#

期待どおり、/defaulthome/hostingstart/wwwrootindex.htmlが格納されていました。

まとめ

どうにか.NET5ランタイム環境での静的コンテンツの差し替えをやってみました。
繰り返しますが、PHPであればNginxかApacheが稼働していて、FTPで差し替えるだけで済みます。
また、最近Static Web Appsも登場したので静的Webサイトをホストしたいのであればそちらの利用をお薦めします。

以下も参考にしてください。