適用対象:Azure SQL Database
このクイックスタートでは、.NET と Entity Framework Core を使用して Azure SQL Database 内のデータベースにアプリケーションを接続し、クエリを実行する方法について説明します。 このクイックスタートでは、データベースに接続するための推奨されるパスワードレス アプローチに従います。 パスワードレス接続について詳しくは、パスワードレス ハブに関する記事を参照してください。
前提条件
- Azure サブスクリプション。
- Microsoft Entra ID (旧称 Azure Active Directory) 認証を使用して構成された SQL Database。 「 クイック スタート: 単一データベースの作成 - Azure SQL Database」を使用して作成できます。
- .NET 9.0 以降。
- ASP.NET と Web 開発ワークロードを含む Visual Studio 以降。
- 最新バージョンの Azure CLI。
- Entity Framework Core ツールの最新バージョン:
- Visual Studio ユーザーは、Entity Framework Core 用のパッケージ マネージャー コンソール ツールをインストールする必要があります。
- .NET CLI ユーザーは、Entity Framework Core 用の .NET CLI ツールをインストールする必要があります。
データベース サーバーを構成する
Azure SQL Database への安全なパスワードレス接続には、特定のデータベース構成が必要です。 Azure の論理サーバーで次の設定を確認し、ローカル環境とホスト環境の両方で Azure SQL Database に適切に接続します。
ローカル開発の接続の場合は、ローカル コンピューターの IP アドレスやその他の Azure サービスで接続できるように論理サーバーが構成されていることを確認します。
お使いのサーバーの [ネットワーク] ページに移動します。
[選択されたネットワーク] ラジオ ボタンを切り替えて、追加の構成オプションを表示します。
[Add your client IPv4 address(xx.xx.xx.xx)] (クライアント IPv4 アドレスの追加 (xx.xx.xx.xx)) を選び、ローカル コンピューターの IPv4 アドレスからの接続を有効にするファイアウォール規則を追加します。 または、[+ Add a firewall rule] (ファイアウォール規則の追加) を選び、選んだ特定の IP アドレスを入力することもできます。
[Azure サービスおよびリソースにこのサーバーへのアクセスを許可する] チェックボックスがオンになっていることを確認します。
警告
[Azure サービスおよびリソースにこのサーバーへのアクセスを許可する] 設定を有効にすることは、運用環境のシナリオでは推奨されるセキュリティ プラクティスではありません。 実際のアプリケーションでは、より強力なファイアウォール制限や仮想ネットワーク構成など、より安全なアプローチを実装する必要があります。
データベース セキュリティの構成について詳しくは、次のリソースを参照してください。
また、サーバーでは Microsoft Entra 認証が有効になっており、Microsoft Entra 管理者アカウントが割り当てられている必要があります。 ローカル開発接続の場合、Microsoft Entra 管理者アカウントは、ローカルで Visual Studio または Azure CLI にログインできるアカウントである必要があります。 論理サーバーの Microsoft Entra ID ページで、サーバーで Microsoft Entra 認証が有効になっているかどうかを確認できます。
個人の Azure アカウントを使用している場合は、アカウントをサーバー管理者として割り当てるために、Microsoft Entra がセットアップされ、Azure SQL Database 用に構成されていることを確認してください。企業アカウントを使用している場合は、Microsoft Entra ID がおそらくすでに構成済みになっています。
プロジェクトを作成する
このセクションの手順では、.NET CLI または Visual Studio 2022 のいずれかを使用して、.NET の最小限の Web API を作成します。
Visual Studio のメニュー バーで、[ファイル]>[新規]>[プロジェクト...] の順に移動します。
ダイアログ ウィンドウで、プロジェクト テンプレートの検索ボックスに「ASP.NET」と入力し、ASP.NET Core Web API の結果を選択します。 ダイアログの下部にある [次へ] を選択します。
[プロジェクト名] に「DotNetSQL」と入力します。 残りのフィールドは既定値のままにし、[次へ] を選択します。
フレームワークの場合は、[.NET 9.0] を選択し、[コントローラーの使用] をオフにします。 このクイックスタートでは、最小限の API テンプレートを使用して、エンドポイントの作成と構成を合理化します。
[作成] を選択します。 新しいプロジェクトが Visual Studio 環境内で開きます。
プロジェクトに Entity Framework Core を追加する
.NET と Entity Framework Core を使用して Azure SQL Database に接続するには、次のいずれかの方法を使用して、3 つの NuGet パッケージをプロジェクトに追加する必要があります。
[ソリューション エクスプローラー] ウィンドウで、プロジェクトの [依存関係] ノードを右クリックし、[NuGet パッケージの管理] を選択します。
表示されたウィンドウで、「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 に接続するには、次の手順を実行します。
次のコードと一致するように、
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 を検出して適用します。これは後で構成します。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 を使用してデータ モデルと一致するようにデータベース スキーマを更新するには、移行を使用する必要があります。 移行により、データベース スキーマを作成して増分更新し、アプリケーションのデータ モデルとの同期を保つことができます。 このパターンの詳細については、「移行の概要」を参照してください。
プロジェクトのルートでターミナル ウィンドウを開きます。
次のコマンドを実行して、データベースを作成できる初期移行を生成します。
Add-Migration InitialCreate
Migrations
フォルダーは、一意の番号が付加されたInitialCreate
というファイルと共に、プロジェクト ディレクトリに表示されます。 次のコマンドを使用して移行を実行し、データベースを作成します。Update-Database
Entity Framework Core ツールは、 PersonDbContext
クラスによって定義されたデータベース スキーマを Azure に作成します。
アプリをローカルでテストする
アプリをローカルでテストする準備ができました。 データベースの管理者として設定したのと同じアカウントを使って、Visual Studio または Azure CLI にサインインしていることを確認します。
Visual Studio の上部にある実行ボタンを押して、API プロジェクトを起動します。
Swagger UI ページで、POST メソッドを展開し、[テスト] を選択します。
サンプル JSON を変更して、名とファミリ名の値を含めます。 [実行] を選択して、新しいレコードをデータベースに追加します。 API は正常な応答を返します。
Swagger UI ページで GET メソッドを展開し、[テスト] を選択します。 [実行] を選択すると、先ほど作成した人物が返されます。
Azure App Service にデプロイする
アプリを Azure にデプロイする準備ができました。 Visual Studio によって、1 つのワークフローで Azure アプリ サービスを作成し、アプリケーションをデプロイできます。
アプリが停止していることと、正常にビルドされていることを確認します。
Visual Studio の [ソリューション エクスプローラー] ウィンドウで、最上位レベルのプロジェクト ノードを右クリックし、[発行] を選択します。
発行ダイアログで、デプロイ ターゲットとして [Azure] を選んでから、[次へ] を選択します。
具体的なターゲットとしては、[Azure App Service (Windows)] を選択し、[次へ] を選択します。
緑色の [+] アイコンを選択して、デプロイ先となる新しいアプリ サービスを作成し、次の値を入力します。
リソースが作成されたら、必ずアプリ サービスの一覧で選択し、[ 次へ] を選択します。
[API Management] の手順で、下部にある [この手順をスキップする] チェックボックスをオンにし、[完了] を選択します。
発行プロファイルの概要の右上にある [発行] を選択して、アプリを Azure にデプロイします。
デプロイが完了すると、Visual Studio によってブラウザーが起動され、ホストされているアプリが表示されます。 既定のエンドポイントからの Hello world
メッセージが表示されます。 ただし、この時点では、データベース エンドポイントは Azure では正しく機能しません。 データを取得するために、App Service と SQL データベースの間にセキュリティで保護された接続を構成する必要があります。
App Service を Azure SQL Database に接続する
App Service インスタンスを Azure SQL Database に接続するには、次の手順が必要です。
- App Service 用のマネージド ID を作成します。 アプリに含まれる
Microsoft.Data.SqlClient
ライブラリは、ローカルの Visual Studio ユーザーを検出した場合と同様に、マネージド ID を自動的に検出します。 - SQL データベース ユーザーを作成し、App Service のマネージド ID に関連付けます。
- 読み取り、書き込み、場合によってはその他のアクセス許可を付与する SQL ロールをデータベース ユーザーに割り当てます。
これらの手順を実施するために使用できるツールは複数あります。
Service Connector は、Azure のさまざまなサービス間の認証された接続を合理化するツールです。 Service Connector では現在、Azure CLI パスワードレス拡張機能を使用した SQL データベースへの App Service の接続がサポートされています。
Service Connector パスワードレス拡張機能をインストールまたはアップグレードします。
az extension add --name serviceconnector-passwordless --upgrade
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 の設定で確認できます。
App Service の [ID] ページに移動します。 [システム割り当て済み] タブで、[状態] が [オン] に設定されているはずです。 この値は、システム割り当てマネージド ID がアプリに対して有効になっていたことを意味します。
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 の操作が完了したら、意図しないコストを回避するためにリソースを削除します。
Azure portal の検索バーで「Azure SQL」を検索し、一致する結果を選択します。
データベースの一覧でデータベースを見つけて選択します。
Azure SQL Database の [概要] ページで、[削除] を選択します。
開かれる [削除しますか...] ページで、データベースの名前を入力して確認し、[削除] を選択します。
注
サンプル アプリを Azure にデプロイした場合は、意図しないコストを回避するために、App Service リソースも検索して削除してください。