🐥note.

小鳥とMicrosoft <3 なエンジニアの技術Blog📚

Azure CLIでAppServiceとWebAppのcreate/deployで色々ハマった話

お勉強のためAzure CLIでAzureのリソースを弄っていたら色々ハマったので記録に残しておきます。

下記お話はWindows環境下のAzure CLI Version 2.0.78のお話です。

目次

Azure CLIWindows側WebAppのRuntimeに.NET Coreがない?

az webapp list-runtimesでRuntimeを確認すると、.NET Core系が表示されません。

> az webapp list-runtimes
[
  "aspnet|V4.7",
  "aspnet|V3.5",
  ...
]

az webapp list-runtimes --linuxだと.NET Core系Runtimeが表示されます。

> az webapp list-runtimes --linux
[
  ...
  "DOTNETCORE|1.0",
  "DOTNETCORE|1.1",
  "DOTNETCORE|2.0",
  "DOTNETCORE|2.1",
  "DOTNETCORE|2.2",
  "DOTNETCORE|3.0",
  "DOTNETCORE|LTS",
  "DOTNETCORE|Latest",
  ...
]

Windowsでは.NET Coreが使用できない?おかしいなぁと思いつつ--is-linuxを指定せずにAppService Planを作成し、WebAppの--runtimeDOTNETCORE|LTSに指定したところ、案の定エラーとなりました。

f:id:piyo_esq:20191229234847p:plain
az webapp createのエラー

Azure PortalではWindowsLinux両方とも.NET Core対応してるのに...。

とりあえず--is-linuxを指定してWebAppを作ることにしました。

--deployment-local-gitで作成した.NET Core 3.1アプリのDeployに失敗する

こちらの記事を参考に--deployment-local-gitオプションを付与して作成したWeebAppにDeployしてみました。

docs.microsoft.com

下記コマンドでAppService, WebAppを作成します。
WebAppは--deployment-local-gitオプションを付与して作成します。

az appservice plan create  --resource-group <GroupName> --name <PlanName> --location japaneast --sku FREE --is-linux
az webapp create --resource-group <GroupName> --name <WebAppName> --plan <PlanName> --runtime "DOTNETCORE|LTS" --deployment-local-git

Commit先のRepositoryを調べます

az webapp deployment source config-local-git -g <GroupName> -n <WebAppName>

適当なASP.NET Coreプロジェクトを作成しComitすることでDeployします。

mkdir SampleMVC
cd SampleMVC
dotnet new sln
dotnet new mvc -o SampleMVC.App
dotnet sln add .\SampleMVC.App
git remote add azure <RepositoryURL>
git add *
git commit -m "First Commit"
git push azure master

Deployに失敗します。

remote: Deploy Async
remote: Updating branch 'master'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'hoge'.
remote: Repository path is /home/site/repository
remote: Running oryx build...
remote: Build orchestrated by Microsoft Oryx, https://github.com/Microsoft/Oryx    
remote: You can report issues at https://github.com/Microsoft/Oryx/issues
remote:
remote: Oryx Version      : 0.2.20191105.2, Commit: hogehoge, ReleaseTagName: 20191105.2
remote: Build Operation ID: |mC+o15dPjG8=.a6cd1293_
remote: Repository Commit : hogehoge
remote:
remote: Error: Platform 'dotnet' version 'lts' is unsupported. Supported versions: 
1.0.16, 1.1.14, 2.0.9, 2.1.13, 2.2.7, 3.0.0
remote: Deployment Logs : 'https://foobar.scm.azurewebsites.net/newui/jsonviewer?view_url=/api/deployments/hogehoge/log'  
To https://foobar.scm.azurewebsites.net:443/SampleMVC.git
 * [new branch]      master -> master

なんでや…と思ってぐぐったところ、こんなissueが。

github.com

github.com

ほーん。

ちょっと動かしてみたいだけなのになぁ…。じゃあローカルでビルドしてFTP転送するか、とFTP転送を試してみる。

ZIP Deploy時にKuduがコケる

以下のコマンドでAppServiceとWebAppを作ったとします。
前途の通り、AppServiceは--is-linuxで作成しています。

az appservice plan create  --resource-group <GroupName> --name <PlanName> --location japaneast --sku FREE --is-linux
az webapp create --resource-group <GroupName> --name <WebAppName> --plan <PlanName> --runtime "DOTNETCORE|LTS"

Deploy Userを適当に作ります。

az webapp deployment user set --user-name <UserName> --password <Password>

先程作成したコードをRuntimeIdentifier=linux-x64を指定してpublishします。
publishしたオブジェクトをZIP固めてDeployします。
※参考:ZIP または WAR ファイルを使用した Azure App Service へのアプリのデプロイ

cd SampleMVC
dotnet publish -c Release -r linux-x64 -o out
compress-archive -path ./out -destinationpath build.zip
az webapp deployment source config-zip --resource-group <GroupName> --name <WebAppName> --src build.zip

結果、Deployに失敗します。

PS C:\Users\piyoe\work\dotnet\SampleMVC> compress-archive -path ./out -destinationpath build.zip
>> az webapp deployment source config-zip --resource-group <GroupName> --name <WebAppName> --src build.zip
Getting scm site credentials for zip deployment
Starting zip deployment. This operation can take a while to complete ...
Deployment endpoint responded with status code 202
Configuring default logging for the app, if not already enabled
Zip deployment failed. {'id': 'hogehoge', 'status': 3, 'status_text': '', 'author_email': 'N/A', 'author': 'N/A', 'deployer': 'Push-Deployer', 'message': 'Created via a push deployment', 'progress': '', 'received_time': '2019-12-29T12:30:20.0796419Z', 'start_time': '2019-12-29T12:30:20.2406707Z', 'end_time': '2019-12-29T12:30:23.0381806Z', 'last_success_end_time': None, 'complete': True, 'active': False, 'is_temp': False, 'is_readonly': True, 'url': 'https://hogefugapiyo.scm.azurewebsites.net/api/deployments/latest', 'log_url': 'https://WebAppNameHogehoge.scm.azurewebsites.net/api/deployments/latest/log', 'site_name': 'WebAppNameHogehoge'}. Please run the command az webapp log tail -n <WebAppName> -g <GroupName>

ググったら同じことで困ってる人がいました。

https://github.com/projectkudu/kudu/issues/2982

対処法

本当の原因は分かりませんが、以下の手順で回避することが出来ました。

PowerShellcompress-archiveせずにpublishしたフォルダを右クリックして送る(N) -> 圧縮(zip形式)フォルダーで作成したZIPをaz webapp deployment source config-zipコマンドでUpするとDeployすることができました。

f:id:piyo_esq:20191229235023p:plain
送る(N) -> 圧縮(zip形式)フォルダー

結局、わざわざ手動で圧縮するのは面倒なのでVisual Studio CodeAzure App Serviceを使うようにしました。

おわり

実際の開発ではCI/CD環境を構築し、そこからDeployするのがセオリーです。
なので、こういった手動でのDeployはすることは殆どないとは思いますが…もやもやしますね。

まだ色々罠がありそうなので、さっさとARM書けるようになった方が良いのでは感ありますね