次の方法で共有


.NET と Entity Framework Core を使用して Azure SQL Database に接続してクエリを実行する

適用対象:Azure SQL Database

このクイックスタートでは、.NET と Entity Framework Core を使用して Azure SQL Database 内のデータベースにアプリケーションを接続し、クエリを実行する方法について説明します。 このクイックスタートでは、データベースに接続するための推奨されるパスワードレス アプローチに従います。 パスワードレス接続について詳しくは、パスワードレス ハブに関する記事を参照してください。

前提条件

データベース サーバーを構成する

Azure SQL Database への安全なパスワードレス接続には、特定のデータベース構成が必要です。 Azure の論理サーバーで次の設定を確認し、ローカル環境とホスト環境の両方で Azure SQL Database に適切に接続します。

  1. ローカル開発の接続の場合は、ローカル コンピューターの IP アドレスやその他の Azure サービスで接続できるように論理サーバーが構成されていることを確認します。

    • お使いのサーバーの [ネットワーク] ページに移動します。

    • [選択されたネットワーク] ラジオ ボタンを切り替えて、追加の構成オプションを表示します。

    • [Add your client IPv4 address(xx.xx.xx.xx)] (クライアント IPv4 アドレスの追加 (xx.xx.xx.xx)) を選び、ローカル コンピューターの IPv4 アドレスからの接続を有効にするファイアウォール規則を追加します。 または、[+ Add a firewall rule] (ファイアウォール規則の追加) を選び、選んだ特定の IP アドレスを入力することもできます。

    • [Azure サービスおよびリソースにこのサーバーへのアクセスを許可する] チェックボックスがオンになっていることを確認します。

      ファイアウォール規則を構成する方法を示すスクリーンショット。

      警告

      [Azure サービスおよびリソースにこのサーバーへのアクセスを許可する] 設定を有効にすることは、運用環境のシナリオでは推奨されるセキュリティ プラクティスではありません。 実際のアプリケーションでは、より強力なファイアウォール制限や仮想ネットワーク構成など、より安全なアプローチを実装する必要があります。

      データベース セキュリティの構成について詳しくは、次のリソースを参照してください。

  2. また、サーバーでは Microsoft Entra 認証が有効になっており、Microsoft Entra 管理者アカウントが割り当てられている必要があります。 ローカル開発接続の場合、Microsoft Entra 管理者アカウントは、ローカルで Visual Studio または Azure CLI にログインできるアカウントである必要があります。 論理サーバーの Microsoft Entra ID ページで、サーバーで Microsoft Entra 認証が有効になっているかどうかを確認できます。

    Microsoft Entra 認証を有効にする方法を示すスクリーンショット。

  3. 個人の Azure アカウントを使用している場合は、アカウントをサーバー管理者として割り当てるために、Microsoft Entra がセットアップされ、Azure SQL Database 用に構成されていることを確認してください。企業アカウントを使用している場合は、Microsoft Entra ID がおそらくすでに構成済みになっています。

プロジェクトを作成する

このセクションの手順では、.NET CLI または Visual Studio 2022 のいずれかを使用して、.NET の最小限の Web API を作成します。

  1. Visual Studio のメニュー バーで、[ファイル]>[新規]>[プロジェクト...] の順に移動します。

  2. ダイアログ ウィンドウで、プロジェクト テンプレートの検索ボックスに「ASP.NET」と入力し、ASP.NET Core Web API の結果を選択します。 ダイアログの下部にある [次へ] を選択します。

  3. [プロジェクト名] に「DotNetSQL」と入力します。 残りのフィールドは既定値のままにし、[次へ] を選択します。

  4. フレームワークの場合は、[.NET 9.0] を選択し、[コントローラーの使用] をオフにします。 このクイックスタートでは、最小限の API テンプレートを使用して、エンドポイントの作成と構成を合理化します。

  5. [作成] を選択します。 新しいプロジェクトが Visual Studio 環境内で開きます。

プロジェクトに Entity Framework Core を追加する

.NET と Entity Framework Core を使用して Azure SQL Database に接続するには、次のいずれかの方法を使用して、3 つの NuGet パッケージをプロジェクトに追加する必要があります。

  1. [ソリューション エクスプローラー] ウィンドウで、プロジェクトの [依存関係] ノードを右クリックし、[NuGet パッケージの管理] を選択します。

  2. 表示されたウィンドウで、「EntityFrameworkCore」を検索します。 次のパッケージを見つけてインストールします。

  • Microsoft.EntityFrameworkCore: Entity Framework Core の重要な機能を提供します
  • Microsoft.EntityFrameworkCore.SqlServer: 論理サーバーに接続するための追加コンポーネントを提供します
  • Microsoft.EntityFrameworkCore.Design: Entity Framework の移行を実行するためのサポートを提供します
  • Microsoft.EntityFrameworkCore.Tools: Visual Studio パッケージ マネージャー コンソール ツールのサポートを提供します (PowerShell のみ)
  • Swashbuckle.AspNetCore: 省略可能 - アプリ エンドポイントとの SwaggerUI 操作のサポートを提供します

Azure SQL Database に接続するコードを追加する

Entity Framework Core ライブラリは、Azure SQL Database へのパスワードレス接続を実装するために、Microsoft.Data.SqlClient ライブラリと Azure.Identity ライブラリに依存します。 Azure.Identity ライブラリには、Azure へのパスワードレス認証を処理する、DefaultAzureCredential というクラスが用意されています。

DefaultAzureCredential では複数の認証方法がサポートされており、実行時にどれを使うかが決定されます。 このアプローチを採用すると、環境固有のコードを実装することなく、異なる環境 (ローカルと運用環境) で異なる認証方法をアプリに使用できます。 Azure ID ライブラリの概要に関する記事では、DefaultAzureCredential が資格情報を検索する順序と場所について説明されています。

Entity Framework Core と基になる DefaultAzureCredential クラスを使用して Azure SQL Database に接続するには、次の手順を実行します。

  1. 次のコードと一致するように、ConnectionStrings セクションを appsettings.Development.json ファイルに追加します。 <server>.database.windows.netを、接続先のパスワードなしのデータベース サーバーの名前に置き換え、<database>データベースの名前に置き換えます。

    {
        "Logging": {
            "LogLevel": {
                "Default": "Information",
                "Microsoft.AspNetCore": "Warning"
            }
        },
        "ConnectionStrings": {
            "AZURE_SQL_CONNECTIONSTRING": "Data Source=<server>.database.windows.net;Initial Catalog=<database>;Authentication=Active Directory Default;Encrypt=True;"
        }
    }
    

    データベース接続文字列の <your database-server-name><your-database-name> プレースホルダーを忘れずに更新してください。 パスワードレス接続文字列は、ユーザー名、パスワード、アクセス キーなどのシークレットが含まれていないため、ソース管理にコミットしても安全です。

    パスワードレスの接続文字列には、Authentication=Active Directory Default という構成値が含まれています。これにより、Entity Framework Core で、Azure サービスへの接続に DefaultAzureCredential が使用できるようになります。 アプリをローカルで実行するときは、Visual Studio へのサインインに使用しているユーザーで認証されます。 アプリが Azure にデプロイされると、同じコードが、ホストされているアプリに関連付けられているマネージド ID を検出して適用します。これは後で構成します。

  2. Program.cs ファイルの内容を次のコードに置き換えます。

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.EntityFrameworkCore;
    
    var builder = WebApplication.CreateBuilder();
    
    builder.Services.AddOpenApi();
    
    var connection = String.Empty;
    if (builder.Environment.IsDevelopment())
    {
        builder.Configuration.AddEnvironmentVariables().AddJsonFile("appsettings.Development.json");
        connection = builder.Configuration.GetConnectionString("AZURE_SQL_CONNECTIONSTRING");
    }
    else
    {
        connection = Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING");
    }
    
    builder.Services.AddDbContext<PersonDbContext>(options =>
        options.UseSqlServer(connection));
    
    var app = builder.Build();
    
    if (app.Environment.IsDevelopment())
    {
        app.MapOpenApi();
        app.UseSwaggerUI(options =>
        {
            options.SwaggerEndpoint("/openapi/v1.json", "v1");
        });
    }
    
    app.MapGet("/", () => "Hello world!");
    
    app.MapGet("/Person", (PersonDbContext context) =>
    {
        return context.Person.ToList();
    });
    
    app.MapPost("/Person", (Person person, PersonDbContext context) =>
    {
        context.Add(person);
        context.SaveChanges();
    });
    
    app.Run();
    
    public class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    
    public class PersonDbContext : DbContext
    {
        public PersonDbContext(DbContextOptions<PersonDbContext> options)
            : base(options)
        {
        }
    
        public DbSet<Person> Person { get; set; }
    }
    

    上記のコードは、次の手順を処理します。

    • ローカル開発については appsettings.Development.json ファイルから、ホストされた運用シナリオについては環境変数から、パスワードレス データベース接続文字列を取得します。
    • Entity Framework Core の DbContext クラスを、.NET 依存関係挿入コンテナーに登録します。 DbContext の詳細については、Entity Framework Core の概要ドキュメントを参照してください。
    • SwaggerUI を使用して .NET 9.0 OpenAPI サポートを構成し、アプリ エンドポイントとデータベースとの対話に使用できる UI を提供します。
    • データベース内のエンティティを取得および追加するためのエンドポイントを追加します。
    • Persons データベース テーブル内の 1 つのレコードを表すPerson クラスと、.NET 依存関係挿入コンテナーに登録されたPersonDbContext クラスを定義します。

移行を実行してデータベースを作成する

Entity Framework Core を使用してデータ モデルと一致するようにデータベース スキーマを更新するには、移行を使用する必要があります。 移行により、データベース スキーマを作成して増分更新し、アプリケーションのデータ モデルとの同期を保つことができます。 このパターンの詳細については、「移行の概要」を参照してください。

  1. プロジェクトのルートでターミナル ウィンドウを開きます。

  2. 次のコマンドを実行して、データベースを作成できる初期移行を生成します。

    Add-Migration InitialCreate
    

  1. Migrations フォルダーは、一意の番号が付加された InitialCreate というファイルと共に、プロジェクト ディレクトリに表示されます。 次のコマンドを使用して移行を実行し、データベースを作成します。

    Update-Database
    

Entity Framework Core ツールは、 PersonDbContext クラスによって定義されたデータベース スキーマを Azure に作成します。

アプリをローカルでテストする

アプリをローカルでテストする準備ができました。 データベースの管理者として設定したのと同じアカウントを使って、Visual Studio または Azure CLI にサインインしていることを確認します。

  1. Visual Studio の上部にある実行ボタンを押して、API プロジェクトを起動します。

  2. Swagger UI ページで、POST メソッドを展開し、[テスト] を選択します。

  3. サンプル JSON を変更して、名とファミリ名の値を含めます。 [実行] を選択して、新しいレコードをデータベースに追加します。 API は正常な応答を返します。

    API をテストする方法を示すスクリーンショット。

  4. Swagger UI ページで GET メソッドを展開し、[テスト] を選択します。 [実行] を選択すると、先ほど作成した人物が返されます。

Azure App Service にデプロイする

アプリを Azure にデプロイする準備ができました。 Visual Studio によって、1 つのワークフローで Azure アプリ サービスを作成し、アプリケーションをデプロイできます。

  1. アプリが停止していることと、正常にビルドされていることを確認します。

  2. Visual Studio の [ソリューション エクスプローラー] ウィンドウで、最上位レベルのプロジェクト ノードを右クリックし、[発行] を選択します。

  3. 発行ダイアログで、デプロイ ターゲットとして [Azure] を選んでから、[次へ] を選択します。

  4. 具体的なターゲットとしては、[Azure App Service (Windows)] を選択し、[次へ] を選択します。

  5. 緑色の [+] アイコンを選択して、デプロイ先となる新しいアプリ サービスを作成し、次の値を入力します。

    • 名前: 既定値のままにします。

    • サブスクリプション名: デプロイするサブスクリプションを選択します。

    • [リソース グループ]: [新規] を選択し、msdocs-dotnet-sql という名前の新しいリソース グループを作成します。

    • [ホスティング プラン]: [新規] を選択して、ホスティング プラン ダイアログを開きます。 既定値のままにして [OK] を選択します。

    • [作成] 選択して、元のダイアログを閉じます。 Visual Studio によって、Azure に App Service リソースが作成されます。

      Visual Studio を使用してデプロイする方法を示すスクリーンショット。

  6. リソースが作成されたら、必ずアプリ サービスの一覧で選択し、[ 次へ] を選択します。

  7. [API Management] の手順で、下部にある [この手順をスキップする] チェックボックスをオンにし、[完了] を選択します。

  8. 発行プロファイルの概要の右上にある [発行] を選択して、アプリを Azure にデプロイします。

デプロイが完了すると、Visual Studio によってブラウザーが起動され、ホストされているアプリが表示されます。 既定のエンドポイントからの Hello world メッセージが表示されます。 ただし、この時点では、データベース エンドポイントは Azure では正しく機能しません。 データを取得するために、App Service と SQL データベースの間にセキュリティで保護された接続を構成する必要があります。

App Service を Azure SQL Database に接続する

App Service インスタンスを Azure SQL Database に接続するには、次の手順が必要です。

  1. App Service 用のマネージド ID を作成します。 アプリに含まれる Microsoft.Data.SqlClient ライブラリは、ローカルの Visual Studio ユーザーを検出した場合と同様に、マネージド ID を自動的に検出します。
  2. SQL データベース ユーザーを作成し、App Service のマネージド ID に関連付けます。
  3. 読み取り、書き込み、場合によってはその他のアクセス許可を付与する SQL ロールをデータベース ユーザーに割り当てます。

これらの手順を実施するために使用できるツールは複数あります。

Service Connector は、Azure のさまざまなサービス間の認証された接続を合理化するツールです。 Service Connector では現在、Azure CLI パスワードレス拡張機能を使用した SQL データベースへの App Service の接続がサポートされています。

  1. Service Connector パスワードレス拡張機能をインストールまたはアップグレードします。

    az extension add --name serviceconnector-passwordless --upgrade
    
  2. az webapp connection create sql コマンドを実行して、システム割り当てマネージド ID を使用して Web アプリをデータベースに接続します。 プレースホルダーを適切な値に置き換えます。

    az webapp connection create sql
    -g <your-resource-group>
    -n <your-app-service-name>
    --tg <your-database-server-resource-group>
    --server <your-database-server-name>
    --database <your-database-name>
    --system-identity
    

Service Connector によって行われた変更は、App Service の設定で確認できます。

  1. App Service の [ID] ページに移動します。 [システム割り当て済み] タブで、[状態][オン] に設定されているはずです。 この値は、システム割り当てマネージド ID がアプリに対して有効になっていたことを意味します。

  2. App Service リソースの [構成] ページに移動します。 [ 接続文字列 ] タブに、 AZURE_SQL_CONNECTIONSTRINGという接続文字列が表示されます。 [Click to show value] (クリックして値を表示にする) のテキストを選択すると、生成されたパスワードレスの接続文字列が表示されます。 この接続文字列の名前はアプリで構成した接続文字列と一致するため、Azure で実行すると自動的に検出されます。

重要

このソリューションは、作業を開始するための簡単なアプローチを提供しますが、エンタープライズ運用環境ではベスト プラクティスではありません。 このようなシナリオでは、アプリが単一の昇格された ID を使用してすべての操作を実行するべきではありません。 特定のタスクのための特定のアクセス許可を持つ複数の ID を構成することで、最小限の特権の原則を実装できるようにする必要があります。 データベース ロールとセキュリティの構成の詳細については、以下を参照してください。

デプロイされたアプリケーションをテストする

アプリの URL を参照して、Azure SQL Database への接続が動作していることをテストします。 アプリの URL は、App Service の概要ページで確認できます。 URL の末尾に /person パスを追加して、ローカルでテストしたのと同じエンドポイントを参照します。

ローカルで作成した人物がブラウザーに表示されるはずです。 これで、アプリケーションはローカル環境とホスト環境の両方で Azure SQL Database に接続されました。

リソースのクリーンアップ

Azure SQL Database の操作が完了したら、意図しないコストを回避するためにリソースを削除します。

  1. Azure portal の検索バーで「Azure SQL」を検索し、一致する結果を選択します。

  2. データベースの一覧でデータベースを見つけて選択します。

  3. Azure SQL Database の [概要] ページで、[削除] を選択します。

  4. 開かれる [削除しますか...] ページで、データベースの名前を入力して確認し、[削除] を選択します。

サンプル アプリを Azure にデプロイした場合は、意図しないコストを回避するために、App Service リソースも検索して削除してください。