😺

Visual Studioで開発したWeb APIをWSL2で実行するための環境設定

2023/04/11に公開

概要

この記事では、ASP.NET CoreでWeb APIを開発するチュートリアルから、Postgresqlへの接続、DBの作成、WSL2での動作確認を行います。
参考になれば幸いです。

開発環境

  • OS: Windows11
  • WSL2: Ubuntu 22.04
  • 開発環境: Visual Studio 2022
  • 開発言語: .NET6 #C
  • フレームワーク: ASP.NET Core
  • RDBMS: Postgresql

全体のながれ

  1. チュートリアルを参考にTodoアプリを作成する。
  2. データベースをInMemoryからPostgreslqに変更する。
  3. EF Core(Entity Framework Core)で、データベースマイグレーションを行い、DBを自動生成する。
  4. Windows環境で動作確認を行う。
  5. WSL2のSSH設定を行い、WSL2でアプリケーションを実行できるようにする。

実装

アプリケーションを作成する。

データベースをInMemoryからPostgreslqに変更する。

Postgresqlに接続するために、接続情報の追加と、DBへの接続設定を追加します。

  • appsettings.jsonにDBの接続情報を追加します。
    • DBのユーザーはDB作成権限を持っているユーザーにする必要があります。
appsettings.json
{
 "Logging": {
   "LogLevel": {
     "Default": "Information",
     "Microsoft.AspNetCore": "Warning"
   }
 },
 "AllowedHosts": "*",
+  // DBの接続情報を追加する。
+  "ConnectionStrings": {
+    "Ef_Postgres_Db": "Server=localhost; Database=todoapp; Port=5432; User Id=postgres; Password=[任意のパスワード];"
+  }
}
  • Program.csにDBの接続設定を変更します。
    • GetConnectionStringに、上記で追加したDBへの接続情報を渡す。
Project.cs
using Microsoft.EntityFrameworkCore;
using System.Runtime.InteropServices;
using TodoApi.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
- builder.Services.AddDbContext<TodoContext>(opt =>
-     opt.UseInMemoryDatabase("TodoList"));
+ builder.Services.AddDbContext<TodoContext>(opt =>
+     opt.UseNpgsql(builder.Configuration.GetConnectionString("Ef_Postgres_Db")));

builder.Services.AddEndpointsApiExplorer();

var app = builder.Build();
if (app.Environment.IsDevelopment())
{
   app.UseDeveloperExceptionPage();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();
  • これで、Postgresqlへ接続できるようになりました。

パッケージマネージャーコンソールで、DBのマイグレーションファイルを作成し、DBを自動生成する。

Visual Studioのパッケージマネージャーコンソールでコマンド実行し、DBを生成します。
ここでは、Windows環境のpostgresqlにDBを生成するため、ローカル環境にpostgresqlがインストールされている必要があります。

  • Add-Migrationでデータベールのマイグレーションファイルを作成する。
Add-Migration InitialCreate
  • Update-Databaseでマイグレーション内容を反映する。
    • オプションの設定が無ければ、ローカル環境にDBが生成されます。
Update-Database
  • 生成されたDBを確認する。
    • Visual Studioの機能などで、DBが生成されModelの内容のテーブルが存在することを確認します。
  • アプリケーションを実行し、Get APIでDBからデータが取得できていることを確認する。
    ※ここまででアプリケーションがWindowsで正常に動作することを確認する。

WSL2でアプリケーションを実行する。

Windowsで実行していたアプリケーションを、WSL2のUbuntuで実行できるよう設定を行い、Linux環境での動作確認を行います。

  • launchSetting.jsonにWSL2での実行設定を追加する。
launchSetting.json
{
  "profiles": {
    "WSL2: Ubuntu": {
      "commandName": "WSL2",    // commandNameにWSL2を設定する。
      "launchBrowser": true,
      "launchUrl": "https://localhost:5270/api/todoitems",    // WSL2の環境へはlocalhostでアクセスできます。
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_URLS": "https://localhost:5270"
      },
      "distributionName": "Ubuntu"
    }
  }
}

WSL2にDBを自動生成する。

WSL2でアプリケーションが実行できるまで、確認できたら、最後にWSL2上のPostgresqlにデータベースを生成し、データベースに接続できることを確認します。設定しない状態だと、WSL2で実行しているアプリケーションが、Windows側のデータベースにアクセスしようとし、エラーになります。

  • Visual StudioからWSL2のpostgresqlにアクセスできるようにする。
    • WSL2でpostgresql.confファイルの"listen_addresses"を、"localhost"から"*"に編集し、どのIPアドレスからもアクセスできるようにする。
    • 実際の運用環境では、アクセスできるIPアドレスは、任意のアドレスに固定することをお勧めします。
    • postgresqlのインストール方法など以下を参考にしてください。
  • アクセスできるようになったら、Update-Databaseでデータベースを自動生成します。
    • ここでは、WSL2のIPアドレスを指定します。
Update-Database -Connection "Server=[WSL2のIPアドレス]; Database=todoapp; Port=5432; User Id=postgres; Password=postgres;"
  • 生成されたDBを確認する。
    • 再度動作確認を行う。
  • APIが動作することを確認する。
    • データベースが存在しないエラーが解消され、Windowsと同様に実行できれば環境構築は完了です。

おわりに

以上で、ASP.NET Core APIのアプリケーションをWSL2で実行できるようになりました。
WSL2で開発することで、WindowsマシンでもLinuxとの環境の差などを考慮しながらVisual Studioで開発できるようになり、効率化できると思います。
分かりにくい点や、間違っている点などあればコメントいただけると幸いです。

Discussion