適用対象:Azure SQL Database
このクイックスタートでは、.NETおよびEntity Framework Coreを使ってアプリケーションをAzure SQL Databaseのデータベースに接続し、クエリを実行する方法を説明します。 このクイックスタートでは、データベースに接続するための推奨されるパスワードレス アプローチに従います。 パスワードレス接続について詳しく知りたい方は、 パスワードレスハブをご覧ください。
前提条件
- Azure サブスクリプション。
- Microsoft Entra ID (旧称 Azure Active Directory) 認証を使用して構成された SQL Database。 Quickstart「Create a single database - Azure SQL Database」を使って作成できます。
- .NET 10.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 サービスが接続できるように Azure SQL 論理サーバーが構成されていることを確認します。
Azure portal のリソース メニューの [ セキュリティ] で、[ ネットワーク] を選択します。
[ 選択したネットワーク ] ボタンを選択して、追加の構成オプションを表示します。
[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メニューバーで「File>New>Projectに行ってください。
ダイアログウィンドウで、プロジェクトテンプレートの検索ボックスに
ASP.NETを入力し、ASP.NET Core Web APIの結果を選択します。 ダイアログの下部にある [次へ] を選択します。Project名には
DotNetSQLを入力してください。 残りのフィールドの既定値をそのまま使用し、[ 次へ] を選択します。フレームワークについては、.NET 10.0を選択し、「コントローラーの使用」のチェックを外してください。 このクイックスタートでは、最小限の API テンプレートを使用して、エンドポイントの作成と構成を合理化します。
[作成] を選択します。 新しいプロジェクトが Visual Studio 環境内で開きます。
プロジェクトに Entity Framework Core を追加する
.NETとEntity Framework Coreを使ってAzure SQL Databaseに接続するには、以下の方法のいずれかを使ってプロジェクトにNuGetパッケージを追加してください。
[ソリューション エクスプローラー] ウィンドウで、プロジェクトの [依存関係] ノードを右クリックし、[NuGet パッケージの管理] を選択します。
表示されたウィンドウで、「EntityFrameworkCore」を検索します。 次のパッケージを見つけてインストールします。
-
Microsoft.EntityFrameworkCore: Entity Framework Core の重要な機能を提供します -
Microsoft.EntityFrameworkCore.SqlServer: 論理サーバーに接続するための追加コンポーネントを提供します -
Microsoft.EntityFrameworkCore.Design: Entity Framework の移行を実行するためのサポートを提供します -
Microsoft.EntityFrameworkCore.Tools: Visual Studio パッケージ マネージャー コンソール ツールのサポートを提供します (PowerShell のみ) -
Microsoft.AspNetCore.OpenApi: オプション - OpenAPIドキュメント生成のサポートを提供します -
Swashbuckle.AspNetCore.SwaggerUI: オプション - アプリエンドポイントとのOpenAPI UIインタラクションを提供します
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.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) => 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(DbContextOptions<PersonDbContext> options) : DbContext(options) { public DbSet<Person> Person { get; set; } }上記のコードは、次の手順を処理します。
- ローカル開発については
appsettings.Development.jsonファイルから、ホストされた運用シナリオについては環境変数から、パスワードレス データベース接続文字列を取得します。 - Entity Framework Core の
DbContextクラスを、.NET 依存関係挿入コンテナーに登録します。DbContextの詳細については、Entity Framework Core の概要ドキュメントを参照してください。 - SwaggerUIで.NET 10.0 OpenAPIのサポートを設定し、アプリのエンドポイントやデータベースとやり取りできるUIを提供します。
- データベース内のエンティティを取得および追加するためのエンドポイントを追加します。
-
Personデータベース テーブル内の 1 つのレコードを表すPersonsクラスと、.NET 依存関係挿入コンテナーに登録されたPersonDbContextクラスを定義します。
- ローカル開発については
移行を実行してデータベースを作成する
Entity Framework Coreを使ってデータモデルに合うようにデータベーススキーマを更新するには、移行を使います。 移行により、データベース スキーマを作成して増分更新し、アプリケーションのデータ モデルとの同期を保つことができます。 このパターンについて詳しく知りたい方は、 渡りの概要をご覧ください。
プロジェクトのルートでターミナル ウィンドウを開きます。
次のコマンドを実行して、データベースを作成できる初期移行を生成します。
Add-Migration InitialCreateMigrationsフォルダーは、一意の番号が付加されたInitialCreateというファイルと共に、プロジェクト ディレクトリに表示されます。 次のコマンドを使用して移行を実行してデータベースを作成すると、Entity Framework Core ツールによって、PersonDbContextクラスによって定義されたデータベース スキーマが Azure に作成されます。Update-Database
アプリをローカルでテストする
アプリはローカルでテストする準備ができています。 Visual StudioまたはAzure CLIに、データベースの管理者として設定した同じアカウントでサインインしていることを確認してください。
Visual Studioの上部にある実行ボタンを選択してAPIプロジェクトを起動します。
Swagger UIのページ(例えば
https://localhost:<port>/swagger)で、POSTメソッドを展開して 「試してみる」を選択します。サンプル JSON を変更して、名とファミリ名の値を含めます。 [実行] を選択して、新しいレコードをデータベースに追加します。 API は正常な応答を返します。
Swagger UI ページで
GETメソッドを展開し、[ 試してみる] を選択します。 [実行] を選択すると、先ほど作成した人物が返されます。
Azure App Service にデプロイする
アプリはAzureへのデプロイ準備ができています。 Visual Studio によって、1 つのワークフローで Azure アプリ サービスを作成し、アプリケーションをデプロイできます。
アプリが停止され、正常に構築されていることを確認してください。
Visual Studio の [ソリューション エクスプローラー] ウィンドウで、最上位レベルのプロジェクト ノードを右クリックし、[発行] を選択します。
発行ダイアログで、デプロイ ターゲットとして [Azure] を選んでから、[次へ] を選択します。
具体的なターゲットとしては、[Azure App Service (Windows)] を選択し、[次へ] を選択します。
緑色の [+] アイコンを選択して、デプロイ先となる新しいアプリ サービスを作成し、次の値を入力します。
- 名前: 既定値のままにします。
- サブスクリプション名: デプロイするサブスクリプションを選択します。
- [リソース グループ]: [新規] を選択し、msdocs-dotnet-sql という名前の新しいリソース グループを作成します。
- [ホスティング プラン]: [新規] を選択して、ホスティング プラン ダイアログを開きます。 既定値のままにして [OK] を選択します。
- [作成] 選択して、元のダイアログを閉じます。 Visual Studio によって、Azure に App Service リソースが作成されます。
リソースが作成されたら、アプリサービスのリストから選択し、 次に選択してください。
[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のパスワードレス拡張機能を使って、App ServiceをSQLデータベースに接続しています。
Service Connector パスワードレス拡張機能をインストールまたはアップグレードします。
az extension add --name serviceconnector-passwordless --upgradeシステムが割り当てた管理IDを使って、ウェブアプリをデータベースに接続するための
az webapp connection create sqlコマンドを実行してください。 プレースホルダーを適切な値に置き換えます。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の Identity ページにアクセスしてください。 [システム割り当て済み] タブで、[状態] が [オン] に設定されているはずです。 この値は、システム割り当てマネージド ID がアプリに対して有効になっていたことを意味します。
App Service の設定ページに 行ってください。 [ 接続文字列 ] タブに、
AZURE_SQL_CONNECTIONSTRINGという接続文字列が表示されます。 [Click to show value] (クリックして値を表示にする) のテキストを選択すると、生成されたパスワードレスの接続文字列が表示されます。 この接続文字列の名前はアプリで構成した接続文字列と一致するため、Azure で実行すると自動的に検出されます。
重要
このソリューションは基本的な開始方法を提供しますが、エンタープライズ本番環境のベストプラクティスとは言えません。 そのような場合、アプリは単一の昇格したアイデンティティですべての操作を行うべきではありません。 特定のタスクに対して特定の権限を持つ複数のアイデンティティを設定することで、最小権限の原則を実装します。 データベース ロールとセキュリティの構成の詳細については、以下を参照してください。
デプロイされたアプリケーションをテストする
アプリの 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リソースも検索して削除してください。