Visual Studio 2019 for Macで作成した.NET Coreアプリケーションを Azure App Service on Linux へデプロイする

2021.08.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

最近App Serviceを触ることが多くて、VS4M(Visual Studio 2019 for Mac)でアプリケーションを作成するのですが、App Service on Linuxへのリソース操作やアプリケーションデプロイが出来ない現象が起きました。

起きましたというか、VS4MからApp Service on Linuxへの直接のデプロイは2021年8月時点は出来ないようです。
出来ないって具体的にどうなるのかってところと、代替のデプロイ方法をご紹介します。

まずは、VS4Mの「Azureに公開する」機能を試してみる

VS4MからApp ServiceとApp Serviceプランを新規作成する

先程直接のデプロイは出来ないと書きましたが、どうなるのか試してみます。
ASP.NET Coreアプリケーションを作成し、プロジェクトの公開から「Azureに公開する」を選択します。

Azureで新しいApp Service on Linuxを作成してみましょう。
ダイアログ上で新規作成を選択し、情報を入力します。

最後の「作成」が押せませんでした。
エラーメッセージなどが表示されていないので少しわかりにくいですが、作成出来ないように制御されてるようです。

VS4MからApp Serviceを既存プランへ作成する

AzureポータルでApp Serviceプランだけ先に作成しておき、VS4MからはApp Serviceの作成だけを行ってみましょう。
Serviceプランで既存を選択すると、作成したプランが選択出来て、作成ボタンも押せます。

いけそうです!

ビルドに失敗しました。

/usr/local/share/dotnet/sdk/5.0.400/Sdks/Microsoft.NET.Sdk.Publish/targets/PublishTargets/Microsoft.NET.Sdk.Publish.MSDeploy.targets(140,5): error : Web 配置タスクが失敗しました。(Could not connect to the remote computer ("iwasa-hogehoge2.scm.azurewebsites.net"). On the remote computer, make sure that Web Deploy is installed and that the required process ("Web Management Service") is started.  Learn more at: https://go.microsoft.com/fwlink/?LinkId=221672#ERROR_DESTINATION_NOT_REACHABLE.)
/usr/local/share/dotnet/sdk/5.0.400/Sdks/Microsoft.NET.Sdk.Publish/targets/PublishTargets/Microsoft.NET.Sdk.Publish.MSDeploy.targets(140,5): error : 要求されたリソースが存在しないか、要求された URL が正しくありません。
/usr/local/share/dotnet/sdk/5.0.400/Sdks/Microsoft.NET.Sdk.Publish/targets/PublishTargets/Microsoft.NET.Sdk.Publish.MSDeploy.targets(140,5): error : エラーの詳細:
/usr/local/share/dotnet/sdk/5.0.400/Sdks/Microsoft.NET.Sdk.Publish/targets/PublishTargets/Microsoft.NET.Sdk.Publish.MSDeploy.targets(140,5): error : Could not connect to the remote computer ("iwasa-hogehoge2.scm.azurewebsites.net"). On the remote computer, make sure that Web Deploy is installed and that the required process ("Web Management Service") is started.  Learn more at: https://go.microsoft.com/fwlink/?LinkId=221672#ERROR_DESTINATION_NOT_REACHABLE.
/usr/local/share/dotnet/sdk/5.0.400/Sdks/Microsoft.NET.Sdk.Publish/targets/PublishTargets/Microsoft.NET.Sdk.Publish.MSDeploy.targets(140,5): error : The remote server returned an error: (404) Not Found.
    0 個の警告
    1 エラー

経過時間 00:00:24.00

公開処理が動き出しましたが、エラーで終了しました。

App Serviceまで作成し、VS4Mからは既存リソースへのデプロイのみ行う

アプリまで含めて事前にAzureポータルで作成し、モジュールのデプロイだけをVS4Mから行ってみましょう。

てみるが、今度は既存リソースの選択肢に出てきませんでした。

どうして・・・

どうやらVisual Studio 2019 for Macの「Azureに公開する」機能からApp Service on Linuxへのデプロイは無理っぽい

「Azureに公開する」機能自体がVS4Mで使えないわけではないようで、App Service on Windowsだと既存リソースの選択肢に出てきて、デプロイまで行うことが出来ました。

また、VS4Mではなく Visual Studio(Windows)からの場合であれば、App Serice on Linuxの新規作成もデプロイも可能でした。
なのでApp Service on LinuxとしてIDEからのデプロイ機能に対応していないというわけでもないようです。

VS4M → App Service on Linux のリソース作成やデプロイが現状出来ないようです。

代替デプロイ方法

Zipファイルをデプロイする

ひとつは、公開モジュールをZip圧縮してデプロイする方法が用意されています。

ZipDeployUIを使う方法と AzureCLIを使う方法がありますが、前者はApp Service on Linuxでは利用出来ないようです。

The above endpoint does not work for Linux App Services at this time. Consider using FTP or the ZIP deploy API instead.

後者であれば出来るようなのですが、実行時にエラーが発生しました。
これは私の環境の問題の可能性もあるのですが、本日は別の方法を使いました。

なお、pip install vsts_cd_managerしても解決はしませんでした。

iwasa.takahito@hoge publish % az webapp deployment source config-zip --resource-group myResourceGroup --name iwasa-hogehoge --src ./hoge-hige.zip
The command failed with an unexpected error. Here is the traceback:
No module named 'vsts_cd_manager'
Traceback (most recent call last):
  File "/usr/local/Cellar/azure-cli/2.26.1/libexec/lib/python3.8/site-packages/knack/cli.py", line 231, in invoke
    cmd_result = self.invocation.execute(args)
  File "/usr/local/Cellar/azure-cli/2.26.1/libexec/lib/python3.8/site-packages/azure/cli/core/commands/__init__.py", line 556, in execute
    self.commands_loader.load_arguments(command)
  File "/usr/local/Cellar/azure-cli/2.26.1/libexec/lib/python3.8/site-packages/azure/cli/core/__init__.py", line 517, in load_arguments
    self.command_table[command].load_arguments()  # this loads the arguments via reflection
  File "/usr/local/Cellar/azure-cli/2.26.1/libexec/lib/python3.8/site-packages/azure/cli/core/commands/__init__.py", line 313, in load_arguments
    super(AzCliCommand, self).load_arguments()
  File "/usr/local/Cellar/azure-cli/2.26.1/libexec/lib/python3.8/site-packages/knack/commands.py", line 104, in load_arguments
    cmd_args = self.arguments_loader()
  File "/usr/local/Cellar/azure-cli/2.26.1/libexec/lib/python3.8/site-packages/azure/cli/core/commands/command_operation.py", line 125, in arguments_loader
    op = self.get_op_handler(self.op_path)
  File "/usr/local/Cellar/azure-cli/2.26.1/libexec/lib/python3.8/site-packages/azure/cli/core/commands/command_operation.py", line 59, in get_op_handler
    handler = import_module(mod_to_import)
  File "/usr/local/Cellar/python@3.8/3.8.11/Frameworks/Python.framework/Versions/3.8/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 843, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/Users/iwasa.takahito/.azure/cliextensions/appservice-kube/azext_appservice_kube/custom.py", line 90, in <module>
    from .vsts_cd_provider import VstsContinuousDeliveryProvider
  File "/Users/iwasa.takahito/.azure/cliextensions/appservice-kube/azext_appservice_kube/vsts_cd_provider.py", line 8, in <module>
    from vsts_cd_manager.continuous_delivery_manager import ContinuousDeliveryManager
ModuleNotFoundError: No module named 'vsts_cd_manager'
To open an issue, please run: 'az feedback'

この方法については後日もう一度トライして、うまく解決できればブログ化したいと思います。

手動でFTPアップロードしてみる

App Service on Linuxにもデプロイ設定のFTP接続情報を使って、FTPでアクセスすることが出来ます。
VS4Mの公開機能で「フォルダーに公開」を選択して出力されたモジュールを、FTPクライアントを使って、wwwroot直下に配置しました。
デフォルトでは、hostingstart.htmlのみ存在している状態です。

FTPアップロード後は以下のようになります。

さて、ここでApp Serviceへアクセスしてみましょう。

デフォルトのHTMLファイルが表示されました。

.NET CoreやNode.jsのようにランタイムでWebホストする必要がある場合はスタートアップコマンドを使うことが出来ます。

スタートアップコマンドを以下のように指定します。

dotnet <アプリ名>.dll

もう一度確認してみましょう。

今度は期待どおり、VS4Mで作成したアプリケーションが実行されて、確認することが出来ました。

おまけ:dotnetコマンドで何をしているのか

アプリケーションを実行するには、アプリケーション .dll ファイルへのパスを指定します。 アプリケーションを実行するということは、エントリ ポイントを見つけて実行することを意味します。コンソール アプリの場合、これは Main メソッドです。 たとえば、dotnet myapp.dll を使うと、myapp アプリケーションが実行されます。

dotnetコマンドを実行しないと、エントリポイントが実行されていないためにホストされていない状態になっていました。

まとめ

  • VS4MからApp Service on Linuxへの直接デプロイは出来ない。
  • VS(Windows)を使うか、FTPでアップロードする

参考