App Service の Web App for Container で .Net 6 Preview を試してみた

## 背景と目的

2021年4月現在、.NET 6 Preview は App Service でサポートされていませんが、Web App for Container なら .NET 6 Preview を動かすことが可能なのではないかと思い、試してみました。

## 前提条件

.NET 6 環境は、[.Net 6.0.0 Preview 2 を Visual Studio Code から Docker 利用してみた](https://qiita.com/mnrst/items/453a3204a9542086252b) で作成した環境を使用します。

その他コマンドの実施環境は、Mac + Azure CLI です。

```zsh:zsh
% sw_vers
ProductName:    macOS
ProductVersion: 11.2.3
BuildVersion:   20D91

% az version                            
{
  "azure-cli": "2.21.0",
  "azure-cli-core": "2.21.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}
```

## 実施内容

VSCode の .NET 6 環境で MVC アプリを作成して動作確認を行います。

```bash:bash
$ dotnet new mvc -n mvcapp

$ cd mvcapp

$ cat << EOF > Views/Home/Index.cshtml
@using System.Runtime.InteropServices
@{
    ViewData["Title"] = "Home";
}
<div class="text-center">
    <h5>Environment</h5>
    <p>@RuntimeInformation.FrameworkDescription (@RuntimeInformation.ProcessArchitecture)</p>
    <p>@RuntimeInformation.OSDescription</p>
</div>
EOF

$ dotnet run

# http://localhost:5000 をブラウザで確認します。
# 問題なkれば、Ctrl+C で終了します。

$ dotnet publish -c Release

$ ls -l bin/Release/net6.0/publish/
```

VSCode の Docker 環境から抜けて、上で作成した mvcapp ディレクトリまで移動して Mac 上で作業します。

```zsh:zsh
% cat <<EOF > Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0
COPY bin/Release/net6.0/publish/ App/
WORKDIR /App
ENTRYPOINT ["dotnet", "mvcapp.dll"]
EOF

% az group create \
  --name AppSvc-DockerTutorial-rg \
  --location japaneast

% az acr create \
  --name mnrappsvc \
  --resource-group AppSvc-DockerTutorial-rg \
  --sku Basic \
  --admin-enabled true

# いつもなら下記コマンドで ACR へイメージをプッシュしますが、今回はもっと簡単に az acr build を使用します。
# docker login mnrappsvc.azurecr.io \
#   --username mnrappsvc \
#   --password $(az acr credential show \
#     --resource-group AppSvc-DockerTutorial-rg \
#     --name mnrappsvc \
#     --query "passwords[0].value" \
#     --output tsv)
# docker build --tag mvcapp .
# docker tag mvcapp mnrappsvc.azurecr.io/mvcapp:latest
# docker push mnrappsvc.azurecr.io/mvcapp:latest

% az acr build \
  --file Dockerfile \
  --registry mnrappsvc \
  --image mvcapp .

% az appservice plan create \
  --name AppSvc-DockerTutorial-plan \
  --resource-group AppSvc-DockerTutorial-rg \
  --is-linux

% az webapp create \
  --resource-group AppSvc-DockerTutorial-rg \
  --plan AppSvc-DockerTutorial-plan \
  --name mnrappsvc \
  --deployment-container-image-name mnrappsvc.azurecr.io/mvcapp:latest

% az webapp identity assign \
  --resource-group AppSvc-DockerTutorial-rg \
  --name mnrappsvc

% az role assignment create \
  --assignee $(az webapp identity show \
    --resource-group AppSvc-DockerTutorial-rg \
    --name mnrappsvc \
    --query principalId \
    --output tsv) \
  --scope $(az acr show \
    --name mnrappsvc \
    --resource-group AppSvc-DockerTutorial-rg \
    --query id \
    --output tsv) \
  --role "AcrPull"

% curl $(az webapp show \
  --name mnrappsvc \
  --resource-group AppSvc-DockerTutorial-rg \
  --query defaultHostName \
  --output tsv)

# リソースをクリーンアップする
% az group delete \
  --name AppSvc-DockerTutorial-rg
```

## 実施結果

.NET 6 Preview を App Service で動かすことが出来ました！

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/f5710d57-bc5d-d05f-217d-7eb5c2630ddb.png)


## 参考

[Running .NET 6 (Preview) on App Service](https://azure.github.io/AppService/2021/04/15/Running-dotnet-6-Preview-on-App-Service.html)

[カスタム コンテナーを使用してカスタム ソフトウェアを Azure App Service に移行する](https://docs.microsoft.com/ja-jp/azure/app-service/tutorial-custom-container?pivots=container-linux)

[チュートリアル: NET Core アプリのコンテナー化](https://docs.microsoft.com/ja-jp/dotnet/core/docker/build-container?tabs=linux)

[ASP.NET Core 向けの Docker イメージ](https://docs.microsoft.com/ja-jp/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-5.0)