AKS で asp.net core アプリケーション : ローカルで開発する

[前回](https://qiita.com/kenakamu/items/20194ace476d873b2949)は ACR、AKS および SQL を構築しました。今回は Visual Studio 2019 と dotnet core 3.0 の asp.net アプリを作成して SQL とつなげていきます。

# ASP.NET アプリの作成

まずはアプリを用意します。

1\. Visual Studio 2019 を起動して「新しいプロジェクトの作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/17feff8a-7d7f-b0c8-4488-03fc75eb90f8.png)

2\.「ASP.NET Core Web アプリケーション」を選択して「次へ」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/1064c95f-af87-d298-2c36-b027cfad3193.png)

3\. プロジェクト名を「core3webapp」をして「作成」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/9a80bbc2-0f33-6618-d2c0-7bbd46d57839.png)

4\.「Web アプリケーション (モデル ビュー コントローラー)」を選択し、以下オプションに変更してから「作成」。

- 認証: 個別のユーザー アカウント
- Docker サポートを有効にする: チェックして Linux を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/8c930c1f-37b5-26db-a4aa-f16870c8fa89.png)

# 作成したアプリの確認

テンプレートから作成したアプリの動作を確認します。

##　Docker

テンプレートで Docker 対応を指定したため、Dockerfile が作成され、ビルドすると Docker イメージが作成されます。

### csproj ファイル

プロジェクトファイルでは、以下のように DockerDefaultTargetOS が指定されます。

```xml
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UserSecretsId>aspnet-core3webapp-01C60103-98E3-4CEB-874B-1FCA99BB1DE6</UserSecretsId>
    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
  </PropertyGroup>
...
```

### Dockerfile

Docker イメージの作成定義ファイルで、複数のステップで構成されています。既定で作成される Dockerfile の中身に解説のコメントをつけてみました。

```dockerfile
# aspnet 3.0-buster-slim イメージを使う。別名 base と指定
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
# ワーキングディレクトリとして /app を指定
WORKDIR /app 
# ポート 80 をオープン
EXPOSE 80 
# ポート 443 をオープン
EXPOSE 443 

# dotnet core 3.0 SDK イメージを使う。別名 build と指定
FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
# ワーキングディレクトリとして /src を指定
WORKDIR /src 
# core3webapp.csproj だけコピー
COPY ["core3webapp/core3webapp.csproj", "core3webapp/"] 
# 依存関係をリストア
RUN dotnet restore "core3webapp/core3webapp.csproj" 
# 全てのフォルダとファイルをコピー
COPY . . 
# ワーキングディレクトリを /src/core3webapp に変更
WORKDIR "/src/core3webapp" 
# リリースビルドを実行
RUN dotnet build "core3webapp.csproj" -c Release -o /app/build 

# 上記の build 環境の別名を publish と指定
FROM build AS publish 
# publish コマンドで公開用フォルダ作成
RUN dotnet publish "core3webapp.csproj" -c Release -o /app/publish 

# base 環境の別名を final と指定
FROM base AS final 
# ワーキングディレクトリとして /app を指定
WORKDIR /app 
# publish 環境の /app/publish をすべてコピー
COPY --from=publish /app/publish . 
# コンテナ開始時に dotnet.exe で core3webapp.dll を起動
ENTRYPOINT ["dotnet", "core3webapp.dll"] 
```

### Docker イメージ

プロジェクトをビルドすると以下の Docker イメージがローカルにキャッシュされます。
ビルド中に取得したイメージや最終イメージが表示されます。

```shell
> docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
core3webapp                            latest              2f23df6191c3        9 minutes ago       226MB
<none>                                 <none>              6591813430b3        9 minutes ago       923MB
mcr.microsoft.com/dotnet/core/sdk      3.0-buster          170a7f2ec51a        6 hours ago         689MB
mcr.microsoft.com/dotnet/core/aspnet   3.0-buster-slim     930743cb4e19        14 hours ago        207MB
```

## データベース接続と初期 DB 作成

1\. applications.json のデータベース接続文字列を変更。

- IP アドレス: ```kubectl get svc``` の結果
- データベース名: Users に変更
- 認証: sa 認証
- パスワード: yaml 作成時に指定した MyC0m9l&xP@ssw0rd

```json
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=52.243.63.3;Database=Users;User Id=sa;Password=MyC0m9l&xP@ssw0rd;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}
```

2\. ツール | Nuget パッケージ マネージャー | パッケージ マネージャーコンソールを起動して、以下コマンドを実行。Done のメッセージが出るまで待機。

```shell
PM> Update-Database
```

## デバッグ実行

最後に動作を確認します。

1\. F5 キーを押下してアプリケーションをデバッグ実行。ブラウザが開いたら「Register」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/3b17ace9-6abf-b6ab-4418-9f2b97ac2c0a.png)

2\. メールをパスワードを入力して「Register」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a9ebfbed-921a-f953-0204-05666c53783d.png)

3\.「Click here to confirm your account」をクリックして登録を完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/b3339989-905a-1aa3-f44d-afd10669d618.png)

4\.「Login」より登録した情報でログイン。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/35a84662-e428-f303-2c49-3b9dfc931941.png)

5\. Azure Data Studio でデータベースの状況を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/329008cb-1aea-f90c-97e7-a7873c6df4d6.png)

6\. コマンドプロンプトやシェルより実行中の docker コンテナを ```docker ps``` で確認。

- dreamy_napier はランダムでつく名前

```shell
>docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                                           NAMES
46edafe475b7        core3webapp:dev     "tail -f /dev/null"   12 seconds ago      Up 11 seconds       0.0.0.0:58637->80/tcp, 0.0.0.0:44396->443/tcp   dreamy_napier
```

7\. コンテナにアタッチしてフォルダ構造を確認。

```shell
>docker exec -it 46eda /bin/bash
root@46edafe475b7:/app# ls
Areas        Dockerfile  Properties  appsettings.Development.json  core3webapp.csproj       wwwroot
Controllers  Models      Startup.cs  appsettings.json              core3webapp.csproj.user
Data         Program.cs  Views       bin                           obj
```
8\. dotnet の情報から dotnet core 3.0 ランタイムだけであることを確認。

```shell
root@46edafe475b7:/app# dotnet --info
  It was not possible to find any installed .NET Core SDKs
  Did you mean to run .NET Core SDK commands? Install a .NET Core SDK from:
      https://aka.ms/dotnet-download

Host (useful for support):
  Version: 3.0.0
  Commit:  95a0a61858

.NET Core SDKs installed:
  No SDKs were found.

.NET Core runtimes installed:
  Microsoft.AspNetCore.App 3.0.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.0.0 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download
```
# まとめ

今回は Visual Studio のテンプレートから作成した asp.net core 3.0 アプリが AKS 上の SQL と繋げることができました。次回は AKS 上にアプリをデプロイします。

[次の記事へ](https://qiita.com/kenakamu/items/c1ff282992bfc778000d)
[目次へ戻る](https://qiita.com/kenakamu/items/e155740aa60c85a3d867)