このチュートリアルでは、Visual Studio と GitHub Actions を使用して、ASP.NET Core アプリと SQL Database を Azure Container Apps にデプロイする方法について説明します。 また、GitHub Actions で Entity Framework の移行とデータベースの更新を管理する方法についても説明しますが、概念は他の CI/CD ツールや環境にも適用できます。
前提 条件
Visual Studio 2022 に ASP.NET および Web 開発 と Azure 開発 ワークロードがインストールされている必要があります。
Visual Studio を既にインストールしている場合:
- [ヘルプ] >[更新プログラムの確認]選択して、Visual Studio に最新の更新プログラムをインストールします。
- [ツール]>[ツールと機能の取得]を選択して、ASP.NET と Web 開発の および Azure 開発の ワークロードがインストールされていることを確認します。
サンプル アプリをローカルに設定する
TODO サンプル アプリを使用して、このチュートリアルに従います。 次のコマンドを使用して、GitHub からアプリを複製します。
git clone https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore.git
cd msdocs-app-service-sqldb-dotnetcore
プロジェクト フォルダーに移動し、Visual Studio で DotNetCoreSqlDb.sln
ソリューションを開きます。
TODO アプリケーションは準備ができていますが、Visual Studio で使用できる localdb
SQL Server への接続を確立する必要があります。 localdb
に接続すると、ローカルで作業中にアプリを実行し、タスクを保管することができます。
- Visual Studio ソリューション エクスプローラーで 接続済みサービス ノードを右クリックし、[ SQL Server データベース> 追加] を選択します。
- [依存関係 への接続] ダイアログで、SQL Server Express LocalDB (ローカル) 選択し、[次 ] を選択します。
- SQL Server Express LocalDB への接続 (ローカル) ダイアログで、次の値を設定します。
- 接続文字列名: 既定値のままにします。
- 接続文字列の値: 既定値のままにします。
- [接続文字列の値を保存する] [選択] [なし]。
- [次へ] を選択します。
- [変更の概要] 画面で、設定を既定値のままにし、[完了] を選択してワークフローを完了します。
Visual Studio には、LocalDB
への接続など、サービスの依存関係の概要が表示されます。
次に、最初の移行を作成し、それを使用して、TODO アプリの正しいスキーマでローカル データベースを更新する必要があります。
LocalDB
接続の横にあるサービス依存関係の一覧の右側にある ... アイコンを選択し、[移行 の追加]選択します。- [Entity Framework Migrations] ダイアログで、Visual Studio がプロジェクトに含まれる
DbContext
クラスを見つけるのをしばらく待ちます。 値が読み込まれたら、[完了] を選択します。 - Visual Studio によってプロジェクトに
Migrations
フォルダーが生成され、初期移行クラスが作成されます。 このクラスを使用して、正しいスキーマでデータベースを更新できます。 LocalDB
サービスの横にある ... アイコンをもう一度選択し、[データベース の更新]選択します。- [Entity Framework Migrations] ダイアログで、Visual Studio が
DbContext
クラスをもう一度見つけるのを少し待ってから、[完了] を選択します。 Visual Studio で移行を実行し、LocalDB
サーバーにデータベースのスキーマを作成します。
Visual Studio の上部にある DotNetCoreSqlDb 実行ボタンを選択して、プロジェクトを起動します。
アプリが読み込まれたら、新しい TODO を入力して、データベースが正常に動作していることを確認します。 TODO は、アプリのホーム ページのメイン リスト ビューに表示されます。
アプリのスタートアップ構成を調べる
サンプル アプリには、Program.cs
ファイルに次のコードが含まれています。
if(builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<MyDatabaseContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
}
else
{
builder.Services.AddDbContext<MyDatabaseContext>(options =>
options.UseSqlServer(Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")));
}
このコードでは、次の構成が適用されます。
- アプリがローカルで実行されると、
localdb
接続文字列がappsettings.json
ファイルからプルされ、Entity Framework に提供されます。 この構成により、他の開発者が開発中にローカル データベースに簡単に接続できるように、localdb
接続文字列をソース管理にチェックインできます。 また、Entity Framework の移行をローカルで実行することもできます。 既定では、Entity Framework では、移行の実行時に環境変数に格納されている接続文字列は検出されません。 - アプリが GitHub Actions ワークフローまたは運用環境で実行されている場合、接続文字列は環境変数から取得されます。 環境変数を使用すると、運用環境のセキュリティで保護された接続文字列がソース管理にチェックインされたり、構成ファイルに含まれるのを防ぐことができます。
Azure サービスを作成する
アプリでは、デプロイを成功させるために、次の Azure サービスを作成する必要があります。
- コンテナー アプリ: デプロイされたアプリケーションをホストして実行するために必要です。
- コンテナー レジストリ: コンテナー化されたアプリのビルドされたイメージ成果物を格納します。
- SQL データベース: アプリのデータを格納する Azure SQL データベースです。
Visual Studio の発行機能では、これらのリソースの作成を処理できます。
Azure Container App と Azure Container Registry を作成する
Visual Studio ソリューション エクスプローラーで、最上位レベルのプロジェクト ノードを右クリックし、[発行]を選択します。
発行ダイアログで、デプロイ ターゲットとして Azure を選択し、「次へ」を選択します。
特定のターゲットについては、Azure Container Apps (Linux)を選択し、次へを選択します。
デプロイする新しいコンテナー アプリを作成します。 [+ 新しい の作成] ボタンを選択して新しいダイアログを開き、次の値を入力します。
- コンテナー アプリ名: 既定値のままにするか、名前を入力します。
- サブスクリプション名: デプロイするサブスクリプションを選択します。
- リソース グループ: 新しい 選択し、msdocs-app-db-efという名前新しいリソース グループを作成します。
- コンテナー アプリ環境:[新しい を選択してコンテナー アプリ環境ダイアログを開き、次の値を入力します。
- 環境名: 既定値のままにします。
- 場所: 近くの場所を選択します。
- Azure Log Analytics ワークスペース: [新規作成] を選択して、Log Analytics ワークスペース ダイアログを開きます。
- 名: 既定値のままにします。
- 場所: 近くの場所を選択し、[OK] 選択してダイアログを閉じます。
- [OK] を選択して、コンテナー アプリ環境ダイアログを閉じます。
- [作成]を選択して、元のコンテナーアプリダイアログを閉じます。 Visual Studio によって、コンテナー アプリ リソースが Azure に作成されます。
リソースが作成されたら、コンテナー アプリの一覧でリソースが選択されていることを確認し、[次へ] 選択します。
アプリの発行済みイメージ成果物を格納するには、Azure コンテナー レジストリを作成する必要があります。 コンテナー レジストリの 画面で、緑色の + アイコンを選択します。
既定値のままにして、[作成] を選択します。
コンテナー レジストリが作成されたら、それが選択されていることを確認し、[次へ] を選択します。
[配置の種類] 画面で、[GitHub Actions ワークフローを使用した CI/CD (yml ファイルが生成されます)] を選択し、[完了] を選択します。 発行された Docker コンテナーへのアクセスを管理者ユーザーに有効にするよう Visual Studio から求められた場合は、[はい] 選択。
Visual Studio によって発行プロファイルが作成され、表示されます。 発行手順と詳細のほとんどは、GitHub Actions .yml
ファイルで説明されています。このファイルは、発行プロファイルの概要ビューの [ワークフロー の編集] ボタンをクリックして表示できます。 このファイルについては、この記事の後半で詳しい説明を行います。
Azure SQL Database を作成する
- ソリューション エクスプローラーで、接続済みサービス ノードを右クリックし、[SQL Server データベース > 追加]選択します。
- [依存関係 への接続] ダイアログで、Azure SQL Database を選択し、[次へ]を選択します。
- + 新しい の作成を選択して、新しいデータベースを追加します。
- Azure SQL Database ダイアログで、次の値を入力します。
- データベース名: 既定値のままにします。
- サブスクリプション名: 以前と同じサブスクリプションを選択します。
- リソース グループ: 先に作成したのと同じ
msdocs-app-db-ef
グループを選択します。 - データベース サーバー: 新規 選択... し、新しい POP アップに次の値を入力します。
- データベース サーバー名: 一意のサーバー名を入力するか、自動生成された名前の末尾に乱数を追加します。
- 場所: 近くの場所を選択します。
- 管理者のユーザー名: 選択した値を入力します。
- 管理者パスワード: 選択した値を入力します。
- 管理者パスワード (確認): 同じパスワードを入力して確認します。 [OK] を選択して [SQL Server] ダイアログを閉じます
- [作成] を選択して、SQL Server とデータベースを作成します。
- 操作が完了したら、一覧からサーバーを選択し、[次へ] 選択
- [Azure SQL Database への接続] ダイアログボックスでは既定値のままにしますが、[接続文字列の値を に保存する] オプションの下部にある [ なし] が選択されていることを確認します。
- [完了] を選択すると、Visual Studio によって SQL リソースが作成されます。
コンテナー アプリを Azure SQL に接続する
作成したコンテナー アプリの概要ページで、左側のナビゲーション Service Connector (プレビュー) を選択します。
[+ の作成] を選択して新しい接続を作成します。
接続の作成 ポップアップで、次の値を入力します。
[次へ: 認証 選択し、次の値を入力します。
- 認証の種類 接続文字列 を選択します。
- ユーザー名: データベース サーバーの作成時に使用したユーザー名を入力します。
- パスワード: データベース サーバーの作成時に使用したパスワードを入力します。
残りの設定は既定値のままにし、[次へ: ネットワーク ]選択します。
既定値を選択したまま、[次へ: 確認と作成]を選択します。
Azure で設定の検証が完了したら、を選択しての作成を行います。
しばらくすると、SQL データベースへの接続が表示されます。 矢印を選択して接続を展開し、AZURE_SQL_CONNECTIONSTRING 値を確認します。 この接続名は、サンプル アプリで定義されている環境変数接続文字列の名前と一致します。
GitHub Actions ワークフローを構成する
Visual Studio によって生成された GitHub Actions ワークフロー ファイルを GitHub で使用して、変更がプッシュされたときにアプリをビルドして Azure にデプロイできます。 現在、このプロセスは機能しますが、デプロイされたアプリは例外を発生します。 Azure SQL データベースが作成されましたが、スキーマを生成するには、GitHub Actions ワークフローにステップを追加する必要があります。 Azure SQL データベースの接続文字列は、GitHub のシークレットとして安全に格納し、実行時にワークフローによって取得できます。
接続文字列を取得して GitHub シークレットに追加する
Azure portal で、メインの検索バーで作成したデータベースを検索し、結果から選択します。
データベースの概要ページで、左側のナビゲーションから 接続文字列 を選択します。
[ADO.NET] タブで、フォーム フィールドから接続文字列をコピーします。
アプリのフォークされた GitHub リポジトリに移動します。
[設定] タブで、左側のナビゲーションから [シークレット] > [アクション] 選択し、[新しいリポジトリ シークレット] 選択します。
新しいシークレットページで、次の値を入力します。
接続文字列は GitHub リポジトリ シークレットに安全に格納され、GitHub ワークフローを使用して取得できるようになりました。
移行を有効にするために GitHub Actions ワークフローを変更する
発行の概要ページの [ワークフロー の編集] ボタンを 選択して、Visual Studio によって生成された GitHub Actions ワークフロー
.yml
ファイルを開きます。ワークフロー ファイルの末尾に次の yaml を追加します。
- name: Run EF run: | dotnet tool install --global dotnet-ef dotnet tool restore dotnet ef database update -p DotNetCoreSqlDb --connection '${{ secrets.DBConnection }}'
このコードは、エンティティ フレームワークのコマンド ライン ツールをインストールし、アプリの移行を実行します。 ワークフローの実行時には、
database update
コマンドのconnection
パラメーターを使用して、appsettings.json
ファイルに格納されているlocaldb
接続文字列を GitHub シークレットに追加された値でオーバーライドします。
GitHub Actions ワークフローを実行し、デプロイをテストする
次のコマンドを使用して、変更をアプリケーションにコミットし、フォークされたリポジトリにプッシュします。
git add --all git commit -m "Added GitHub Actions workflow" git push
GitHub リポジトリに移動し、Actions タブを選択します。プッシュが成功した場合は、ワークフローの実行が自動的にトリガーされるはずです。
アクティブなワークフローを選択して、各ステップの完了時にログの詳細を表示します。 移行は最後に実行され、Azure のデータベースが更新されます。
ワークフローが完了すると、アプリケーションが Azure Container Apps にデプロイされ、更新されたスキーマでデータベースに接続されます。
デプロイをテストするには、ローカルで行ったのと同じように、コンテナー アプリのホーム ページに移動し、TODO を作成します。 コンテナー アプリの URL は、Azure portal のアプリの概要ページでいつでも確認できます。