このチュートリアルでは、データ ドリブン ASP.NET Core アプリをデプロイしてAzure App Serviceし、Azure SQL Databaseに接続する方法について説明します。 また、アプリケーションでキャッシュ コードを有効にするAzure Cache for Redisをデプロイします。 Azure App Serviceは、Windowsまたは Linux にアプリを簡単にデプロイできる、高度にスケーラブルで自己修正可能な Web ホスティング サービスです。 このチュートリアルでは、ASP.NET Core 8.0 アプリを使用しますが、プロセスは他のバージョンの ASP.NET Coreでも同じです。
このチュートリアルでは、次の作業を行う方法について説明します。
- 既定でセキュリティ保護された App Service、SQL Database、Redis Cache アーキテクチャを作成します。
- マネージド ID とKey Vault参照を使用して接続シークレットをセキュリティで保護する。
- GitHub リポジトリから App Service にサンプル ASP.NET Core アプリをデプロイします。
- アプリケーション コードで App Service の接続文字列とアプリ設定にアクセスします。
- アプリケーション コードを更新して再デプロイする。
- 移行バンドルをアップロードしてデータベース スキーマを生成する。
- Azureから診断ログをストリーム配信します。
- Azure ポータルでアプリを管理します。
- 同じアーキテクチャをプロビジョニングし、Azure Developer CLI を使用してデプロイします。
- GitHub Codespaces とGitHub Copilotを使用して開発ワークフローを最適化します。
前提条件
- アクティブなサブスクリプションを持つAzure アカウント。 Azureアカウントをお持ちでない場合は、無料で作成できます。
- GitHub アカウント。 無料 で入手することもできます。
- ASP.NET Core開発に関する知識。
- (省略可能) GitHub Copilotを試すには、GitHub Copilot アカウント。 30 日間の無料試用版が提供されています。
- アクティブなサブスクリプションを持つAzure アカウント。 Azureアカウントをお持ちでない場合は、無料で作成できます。
- Azure Developer CLI がインストールされています。 Azure Cloud Shell には既に Azure Developer CLI がインストールされているため、手順を実行できます。
- ASP.NET Core開発に関する知識。
- (省略可能) GitHub Copilotを試すには、GitHub Copilot アカウント。 30 日間の無料試用版が提供されています。
最後までスキップする
このチュートリアルのサンプル アプリを Azure で実行するだけの場合は、Azure Cloud Shell で次のコマンドを実行し、プロンプトに従います。
dotnet tool install --global dotnet-ef
mkdir msdocs-app-service-sqldb-dotnetcore
cd msdocs-app-service-sqldb-dotnetcore
azd init --template msdocs-app-service-sqldb-dotnetcore
azd up
1.サンプルを実行する
最初に、開始点としてサンプルのデータ駆動型アプリを設定します。 便宜上、サンプル リポジトリには、dev コンテナー構成が含まれています。 開発コンテナーには、データベース、キャッシュ、サンプル アプリケーションに必要なすべての環境変数など、アプリケーションの開発に必要なすべてのものが含まれています。 開発コンテナーは、GitHub codespace で実行できます。つまり、Web ブラウザーを使用して任意のコンピューターでサンプルを実行できます。
手順 1: 新しいブラウザー ウィンドウ内で次を実行します。
- GitHub アカウントにサインインします。
- https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore/fork に移動します。
- [メイン ブランチのみをコピーする] の選択を解除します。 すべてのブランチが必要です。
- [Create fork] (フォークの作成) を選択します。
Step 2: GitHub フォーク内:
- スターターブランチでは、main>starter-no-infra を選択します。 このブランチにはサンプル プロジェクトだけが含まれており、Azure関連のファイルや構成はありません。
- 次を選択します: Code>Codespaces>starter-no-infra でコードスペースを作成。 codespace の設定には数分かかります。
手順 3: codespace ターミナルで次のことを行います。
-
dotnet ef database updateを使用して、データベースの移行を実行します。 -
dotnet runを使用してアプリを実行します。 - ''
Your application running on port 5093 is available.'' という通知が表示されたら、[ブラウザーで開く] を選択します。 新しいブラウザー タブにサンプル アプリケーションが表示されるはずです。アプリケーションを停止するには、Ctrl+Cと入力します。
ヒント
このリポジトリについてGitHub Copilotに問い合わせることができます。 次に例を示します。
- @workspace このプロジェクトは何を行いますか?
- @workspace .devcontainer フォルダーは何を行いますか?
問題がありますか? 「トラブルシューティング」セクションを確認してください。
2. App Service、データベース、キャッシュを作成する
この手順では、Azure リソースを作成します。 このチュートリアルで使用する手順では、App Service、Azure SQL Database、および Azure Cache を含む一連のセキュリティで保護された既定のリソースを作成します。 作成手順では、次のように指定します。
- 名前: Web アプリの名前。 アプリの DNS 名の一部として使用されます。
- 世界でアプリを物理的に実行するためのリージョン。 これは、アプリの DNS 名の一部としても使用されます。
- アプリのランタイム スタック。 ここで、アプリに使用する.NETバージョンを選択します。
- アプリのホスティング プラン。 これは、アプリの一連の機能と容量のスケーリングを含む価格レベルです。
- アプリのリソース グループ。 リソース グループを使用すると、アプリケーションに必要なすべてのAzure リソースを (論理コンテナー内で) グループ化できます。
Azure ポータルにサインインし、次の手順に従ってAzure App Service リソースを作成します。
Step 1: Azure ポータルで次の手順を実行します。
- 上部の検索バーに「app service」と入力します。
- [サービス] の見出しの下にある [App Service] というラベルの付いた項目を選びます。
- [作成]>[Web アプリ] を選びます。 作成ウィザードに直接移動することもできます。
手順 2:[Web アプリの作成] ページで、フォームに次のように入力します。
- 名前: msdocs-core-sql-XYZ。 msdocs-core-sql-XYZ_group という名前のリソース グループが自動的に生成されます。
- Runtime stack: .NET 8 (LTS)。
- オペレーティング システム: Linux。
- リージョン: お好みのリージョン。
- Linux プラン: 新規作成 し、 msdocs-core-sql-XYZ という名前を使用します。
- 価格プラン: 基本 B1。 準備ができたら、別の価格レベルにスケールアップできます。
ステップ 3:
- [ データベース ] タブを選択します。
- [ データベースの作成] を選択します。
- エンジンで、SQLAzure を選択します。
- Azure Cache for Redis を作成を選択します。
- [ 名前] ([キャッシュ] の下) に、キャッシュの名前を入力します。
- [SKU] で [Basic] を選択します。
手順 4:
- [ デプロイ ] タブを選択します。
- 継続的デプロイを有効にします。
- Organization で、GitHubエイリアスを選択します。
- [リポジトリ] で、[msdocs-app-service-sqldb-dotnetcore] を選びます。
- [ブランチ] で、[starter-no-infra] を選択します。
- 基本認証が無効になっていることを確認します。
- [Review + create](レビュー + 作成) を選択します。
- 検証が完了した後、 [作成] を選択します。
手順 5: デプロイが完了するまでに数分かかります。 デプロイが完了したら、[リソースに移動] ボタンを選択します。 App Service アプリに直接移動しますが、次のリソースが作成されます。
- [リソース グループ]: 作成されたすべてのリソースのコンテナー。
- [App Service プラン]: App Service のコンピューティング リソースを定義します。 Basic レベルの Linux プランが作成されます。
- [App Service]: アプリを表し、App Service プランで実行されます。
- [仮想ネットワーク]: App Service アプリと統合され、バックエンド ネットワーク トラフィックを分離します。
- プライベート エンドポイント: 仮想ネットワーク内のキー コンテナー、データベース サーバー、Redis キャッシュのアクセス エンドポイント。
- ネットワーク インターフェイス: プライベート エンドポイントごとに 1 つのプライベート IP アドレスを表します。
- Azure SQL Database server: プライベート エンドポイントの背後からのみアクセスできます。
- Azure SQL Database: データベースとユーザーがサーバー上に自動的に作成されます。
- Azure Cache for Redis: プライベート エンドポイントの背後からのみアクセスできます。
- キー コンテナー: プライベート エンドポイントの背後からのみアクセスできます。 App Service アプリのシークレットを管理するために使用されます。
- プライベート DNS ゾーン: 仮想ネットワーク内のキー コンテナー、データベース サーバー、および Redis キャッシュの DNS 解決を有効にします。
3.セキュリティで保護された接続のシークレット
作成ウィザードでは、接続変数は既に .NET 接続文字列 および app settings として生成されています。 ただし、セキュリティのベスト プラクティスは、App Service からシークレットを完全に排除することです。 シークレットをkey vaultに移動し、Service Connectors を使用してアプリ設定を Key Vault 参照に変更します。
ヒント
パスワードレス認証を使用するには、「代わりにマネージド ID を使用するように SQL Database 接続を変更するにはどうすればよいですか?」を参照してください。
- App Service ページの左側のメニューで、[設定] > [環境変数] > [接続文字列] を選択します。
- AZURE_SQL_CONNECTIONSTRING を選択します。
- Add/Edit 接続文字列 の Value フィールドで、文字列の末尾にある Password= 部分を見つけます。
- 後で使用するために、Password= の後のパスワード文字列をコピーしておきます。 この接続文字列を使用すると、プライベート エンドポイントの背後でセキュリティで保護された SQL データベースに接続できます。 ただし、シークレットは App Service アプリに直接保存されますが、これは最適ではありません。 同様に、redis cache 接続文字列 App settings タブにはシークレットが含まれています。 これを変更します。
手順 2: シークレットを安全に管理するためのキー コンテナーを作成する
- 上部の検索バーに「key vault」と入力し、Marketplace>Key Vault を選択します。
- リソース グループで、msdocs-core-sql-XYZ_group を選択します。
- [キー コンテナー名] に、文字と数字のみで構成される名前を入力します。
- [リージョン] をリソース グループと同じ場所に設定します。
手順 3: プライベート エンドポイントを使用してキー コンテナーをセキュリティ保護する
- [ネットワーク] タブを選択します。
- [パブリック アクセスを有効にする] の選択を解除します。
- [プライベート エンドポイントを作成する] を選択します。
- リソース グループで、msdocs-core-sql-XYZ_group を選択します。
- ダイアログの [場所] で、App Service アプリと同じ場所を選択します。
- [名前] に「msdocs-core-sql-XYZVvaultEndpoint」と入力します。
- [仮想ネットワーク] で、msdocs-core-sql-XYZ_group グループ内の仮想ネットワークを選択します。
- [ サブネット] で、使用可能な互換性のあるサブネットを選択します。 Web アプリ ウィザードが、あなたのために便利に作成しました。
- [OK] を選択します。
- [Review + create](確認と作成) を選択し、次に [作成] を選択します。 キー ボールトのデプロイが完了するのを待ちます。 "デプロイが完了しました" と表示されます。
手順 4:
- 上部の検索バーに「msdocs-core-sql」と入力し、次に msdocs-core-sql-XYZ という App Service リソースを選択します。
- [App Service] ページの左側にあるメニューで、[設定] > [サービス コネクタ] を選択します。 既に 2 つのコネクタが存在していますが、これらはアプリ作成ウィザードによって作成されたものです。
- SQL データベースのコネクタの横にあるチェックボックスをオンにし、[編集] を選択します。
- 認証 タブを選択します。
- [パスワード] に、先ほどコピーしたパスワードを貼り付けます。
Store Secret in Key Vault を選択します。- Key Vault接続で、新規作成を選択します。 [接続の作成] ダイアログが編集ダイアログの上に開きます。
手順 5: Key Vault接続を確立します
- Key Vault接続の Create connection ダイアログで、Key Vault で、前に作成したkey vaultを選択します。
- [確認および作成] を選択します。
- 検証が完了したら、[作成] を選択します。
手順 6: SQL データベース コネクタの設定を完了する
- defaultConnector の編集ダイアログに戻ります。 [認証] タブで、キー コンテナー コネクタが作成されるまで待ちます。 完了すると、Key Vault接続 ドロップダウンで自動的に選択されます。
- [次へ: ネットワーク] を選択します。
- [ターゲット サービスへのアクセスを有効にするようにファイアウォール規則を構成する] を選択します。 アプリ作成ウィザードでは、プライベート エンドポイントを使用して SQL データベースが既にセキュリティで保護されています。
- [保存] を選択します。 "更新に成功しました" という通知が表示されるまで待ちます。
手順 7: Key Vault シークレットを使用するように Redis コネクタを構成します
- [Service Connector] ページで、Cache for Redis コネクタの横にあるチェック ボックスをオンにし、[ 編集] を選択します。
- 認証 タブを選択します。
Store Secret in Key Vault を選択します。- [Key Vault接続] で、作成したKey Vaultを選択します。
- [次へ: ネットワーク] を選択します。
- [ターゲット サービスへのアクセスを有効にするようにファイアウォール規則を構成する] を選択します。
- [保存] を選択します。 "更新に成功しました" という通知が表示されるまで待ちます。
手順 8: Key Vault統合を確認します
- 左側のメニューで、[設定] > [環境変数] > [接続文字列] をもう一度選択します。
-
[AZURE_SQL_CONNECTIONSTRING] の横にある [値を表示] を選択します。 値は
@Microsoft.KeyVault(...)にする必要があります。これは、シークレットがキー コンテナーで管理されるようになったため、key コンテナー参照であることを意味します。 - Redis 接続文字列を確認するには、App settings タブを選択します。AZURE_REDIS_CONNECTIONSTRING の横にある Show 値 を選択します。 値も
@Microsoft.KeyVault(...)にする必要があります。
まとめると、接続シークレットをセキュリティで保護するためのプロセスには次の作業が含まれます。
- App Service アプリの環境変数から接続シークレットを取得する。
- キー ボールトを作成する。
- システム割り当てマネージド ID を使用したKey Vault接続の作成。
- キー コンテナーにシークレットを格納するようにサービス コネクタを更新する。
4.サンプル コードをデプロイする
この手順では、GitHub Actionsを使用してGitHubデプロイを構成します。 これは、App Service にデプロイする多くの方法の 1 つにすぎませんが、デプロイ プロセスで継続的インテグレーションを実現する優れた方法でもあります。 既定では、GitHub リポジトリに対するすべてのgit pushによって、ビルドとデプロイのアクションが開始されます。
Step 1: サンプル フォークのGitHubコード空間に戻り、git pull origin starter-no-infra を実行します。
これにより、新しくコミットされたワークフロー ファイルが codespace にプルされます。
&
手順 2 (オプション 1: GitHub Copilot):
- [チャット] ビューを選択し、+ を選択して、新しいチャット セッションを開始します。
- "
@workspace アプリはデータベースとキャッシュにどのように接続しますか? " とCopilotクラスと、 Program.cs 。 - 「運用モードでは、データベース用に AZURE_SQL_CONNECTIONSTRING と呼ばれる接続文字列を使用し、アプリの設定として AZURE_REDIS_CONNECTIONSTRING を使用したい」と尋ねると、CopilotがOption 2: without GitHub Copilotの手順に似たコードを提案してくれるかもしれません。その際、Program.csファイルを変更するよう指示されることもあります。
- エクスプローラーで "Program.cs" を開き、コード候補を追加します。 GitHub Copilotは毎回同じ応答を返すわけではなく、常に正しいとは限りません。 その応答を微調整するために、さらに質問をする必要があるかもしれません。 ヒントについては、「 codespace のGitHub Copilotでできること」を参照>。
手順 2 (オプション 2: GitHub Copilotなし):
- エクスプローラーで "Program.cs" を開きます。
- コメント化されたコード (行 12-21) を見つけ、それをコメント解除します。
このコードは、
AZURE_SQL_CONNECTIONSTRINGを使用してデータベースに接続し、アプリ設定AZURE_REDIS_CONNECTIONSTRINGを使用して Redis Cache に接続します。
手順 3 (オプション 1: GitHub Copilot):
- エクスプローラーで ".github/workflows/starter-no-infra_msdocs-core-sql-XYZ" を開きます。 App Service 作成ウィザードでこのファイルが作成されました。
-
dotnet publishステップを強調表示し、
を選択します。 - Copilot に質問、" dotnet ef をインストールし、同じ出力フォルダーに移行バンドルを作成します。"
- 提案を受け入れる場合は、[Accept] を選択します。 GitHub Copilotは毎回同じ応答を返すわけではなく、常に正しいとは限りません。 その応答を微調整するために、さらに質問をする必要があるかもしれません。 ヒントについては、「 codespace のGitHub Copilotでできること」を参照>。
手順 3 (オプション 2: GitHub Copilotなし):
- エクスプローラーで ".github/workflows/starter-no-infra_msdocs-core-sql-XYZ" を開きます。 App Service 作成ウィザードでこのファイルが作成されました
-
dotnet publishステップで、コマンド を使用して、dotnet tool install -g dotnet-ef --version 8.*をインストールする手順を追加します。 - 新しいステップで、デプロイ パッケージにデータベース移行バンドル (
dotnet ef migrations bundle --runtime linux-x64 -o ${{env.DOTNET_ROOT}}/myapp/migrationsbundle) を生成するための別のステップを追加します。 移行バンドルは自己完結型の実行可能ファイルであり、.NET SDK を必要とせずに運用環境で実行できます。 App Service Linux コンテナーには .NET ランタイムのみが含まれており、.NET SDK は含まれません。
手順 4:
- [ソース管理] 拡張機能を選びます。
- テキスト ボックスに、
Configure Azure database and cache connectionsなどのコミット メッセージを入力します。 または、
を選択して、GitHub Copilotにコミットメッセージの生成を任せてください。 - [コミット] を選択し、[はい] で確定します。
- [変更の同期 1] を選択し、[OK] で確認します。
手順 5: Azure ポータルの [デプロイ センター] ページに戻ります。
- [ログ] タブを選択し、[最新の情報に更新] を選択して、新しいデプロイの実行を確認します。
- デプロイの実行のログ項目で、最新のタイムスタンプを持つ [ビルドまたはデプロイ ログ] エントリを選びます。
手順 6: GitHub リポジトリにアクセスし、GitHubアクションが実行されていることを確認します。 ワークフロー ファイルでは、ビルドとデプロイという 2 つの異なるステージを定義します。 GitHubが実行され、Success の状態が表示されるまで待ちます。 所要時間は約 5 分です。
問題がありますか? 「トラブルシューティング」セクションを確認してください。
5.データベース スキーマを生成する
SQL Database が仮想ネットワークによって保護されている場合、dotnet データベースの移行を実行する最も簡単な方法は、SSH セッション内で App Service の Linux コンテナーを使用する方法です。
手順 1: [App Service] ページに戻り、左側のメニューで
- [開発ツール]>[SSH] を選択します。
- [Go] \(移動) を選択します。 (起動には数分かかります)。
手順 2: SSH セッション内で次を実行します。
-
cd /home/site/wwwrootを実行します。 デプロイされたすべてのファイルがここにあります。 - コマンド
./migrationsbundle -- --environment Productionを使用して、GitHub ワークフローによって生成された移行バンドルを実行します。 それに成功すると、App Service は SQL Database に正常に接続した状態になります。--environment Productionは、"Program.cs" で行ったコードの変更に対応します。
SSH セッションでは、 /home 内のファイルに対する変更のみが、アプリの再起動後も保持されます。
/home の外部の変更は永続化されません。
お困りですか? 「トラブルシューティング」セクションを確認してください。
6. アプリにアクセスする
手順 1: [App Service] ページ内で、次を実行します。
- 左側のメニューから [概要] を選びます。
- アプリの URL を選びます。
手順 2: この一覧にいくつかのタスクを追加します。 おめでとうございます。これで、Azure SQL Databaseへの安全な接続を確立し、Azure App ServiceでWebアプリを実行しています。
ヒント
サンプル アプリケーションでは、キャッシュ アサイド パターンが実装されています。 2 回目にデータ ビューにアクセスしたとき、またはデータを変更した後に同じページを再読み込みすると、Web ページの 処理時間 は、データベースではなくキャッシュからデータを読み込むため、より高速に表示されます。
7.診断ログをストリーミングする
Azure App Serviceは、アプリケーションに関する問題の診断に役立つすべてのコンソール ログをキャプチャします。 サンプル アプリには、この機能を示すために、各エンドポイントのログ コードが含まれています。
手順 1: [App Service] ページ内で、次を実行します。
- 左側のメニューから [監視]>[App Service ログ] を選択します。
- [アプリケーション ログ記録] で [ファイル システム] を選びます。
- 上部のメニューから、[保存] を選択します。
手順 2:左側のメニューから [ログ ストリーム] を選択します。 プラットフォーム ログとコンテナー内のログを含む、アプリのログが表示されます。
8.リソースをクリーンアップする
完了したら、リソース グループを削除することで、Azure サブスクリプションからすべてのリソースを削除できます。
手順 1: Azure ポータルの上部にある検索バーで、次の手順を実行します。
- リソース グループ名を入力します。
- リソース グループを選択します。
&
手順 2: [リソース グループ] ページ内で、[リソース グループの削除] を選びます。
ステップ 3:
- リソース グループの名前を入力して、削除を確定します。
- [削除] を選択します。
2.Azure リソースを作成し、サンプル アプリをデプロイする
この手順では、Azure リソースを作成し、App Service on Linuxにサンプル アプリをデプロイします。 このチュートリアルで使用する手順では、App Service、Azure SQL Database、Azure Cache for Redisを含む、既定でセキュリティで保護された一連のリソースを作成します。
開発コンテナーには既に Azure Developer CLI (AZD) があります。
リポジトリのルートから、
azd initを実行します。azd init --template dotnet-app-service-sqldb-infraメッセージが表示されたら、次の回答を入力します。
質問 答え 現在のディレクトリが空ではありません。 Would you like to initialize a project here in '<your-directory>'? ('<ディレクトリ>' でプロジェクトを初期化しますか?) Y What would you like to do with these files? (これらのファイルをどうしますか?) Keep my existing files unchanged (既存のファイルを変更しないでそのままにする) Enter a new environment name (新しい環境の名前を入力してください) 一意の名前を入力します。 AZD テンプレートは、Azure ( <app-name>-<hash>.azurewebsites.net) の Web アプリの DNS 名の一部としてこの名前を使用します。 英数字とハイフンを使用できます。azd auth loginコマンドを実行し、プロンプトに従って、Azureにサインインします。azd auth login必要なAzure リソースを作成し、
azd upコマンドを使用してアプリ コードをデプロイします。 プロンプトに従って、Azure リソースの目的のサブスクリプションと場所を選択します。azd upazd upコマンドが完了するまで約 15 分かかります (大部分の時間は Redis キャッシュに費やされます)。 また、アプリケーション コードのコンパイルとデプロイも行われますが、後でコードを変更して App Service で動作するようにします。 実行中、このコマンドは、プロビジョニングとデプロイプロセスに関するメッセージ (Azureのデプロイへのリンクを含む) を提供します。 完了すると、コマンドはデプロイ アプリケーションへのリンクも表示します。この AZD テンプレートには、ファイル (azure.yaml と infra ディレクトリ) が含まれており、次のAzure リソースを使用して既定でセキュリティで保護されたアーキテクチャを生成します。
- [リソース グループ]: 作成されたすべてのリソースのコンテナー。
- [App Service プラン]: App Service のコンピューティング リソースを定義します。 Basic レベルの Linux プランが作成されます。
- [App Service]: アプリを表し、App Service プランで実行されます。
- [仮想ネットワーク]: App Service アプリと統合され、バックエンド ネットワーク トラフィックを分離します。
- プライベート エンドポイント: 仮想ネットワーク内のキー コンテナー、データベース サーバー、Redis キャッシュのアクセス エンドポイント。
- ネットワーク インターフェイス: プライベート エンドポイントごとに 1 つのプライベート IP アドレスを表します。
- Azure SQL Database server: プライベート エンドポイントの背後からのみアクセスできます。
- Azure SQL Database: データベースとユーザーがサーバー上に自動的に作成されます。
- Azure Cache for Redis: プライベート エンドポイントの背後からのみアクセスできます。
- キー コンテナー: プライベート エンドポイントの背後からのみアクセスできます。 App Service アプリのシークレットを管理するために使用されます。
- プライベート DNS ゾーン: 仮想ネットワーク内のキー コンテナー、データベース サーバー、および Redis キャッシュの DNS 解決を有効にします。
コマンドがリソースの作成とアプリケーション コードのデプロイを初めて完了すると、デプロイされたサンプル アプリは、Azure内のデータベースに接続するために小さな変更を加える必要があるため、まだ機能しません。
問題がありますか? 「トラブルシューティング」セクションを確認してください。
3.接続文字列を確認する
ヒント
既定の SQL データベース 接続文字列では、SQL 認証が使用されます。 より安全なパスワードレス認証については、マネージド ID を使用するように SQL Database 接続を変更する方法に関する記事をご覧ください。
使用している AZD テンプレートにより、接続変数がアプリ設定として既に自動的に生成されており、それらが便宜のためにターミナルに出力されます。 アプリの設定は、接続のシークレットをコード リポジトリに残さないための 1 つの方法です。
AZD の出力で、設定
AZURE_SQL_CONNECTIONSTRINGとAZURE_REDIS_CONNECTIONSTRINGを見つけます。 設定名のみが表示されます。 これらは、AZD の出力では次のようになります。App Service app has the following connection strings: - AZURE_SQL_CONNECTIONSTRING - AZURE_REDIS_CONNECTIONSTRING - AZURE_KEYVAULT_RESOURCEENDPOINT - AZURE_KEYVAULT_SCOPEAZURE_SQL_CONNECTIONSTRINGにはAzureの SQL Database への接続文字列が含まれており、AZURE_REDIS_CONNECTIONSTRINGにはAzure Redis キャッシュへの接続文字列が含まれています。 これは、後でコードで使用する必要があります。便宜のために、AZD テンプレートでは、アプリのアプリ設定ページへの直接リンクが示されます。 そのリンクを見つけ、それを新しいブラウザー タブで開きます。
問題がありますか? 「トラブルシューティング」セクションを確認してください。
4.サンプル コードを変更して再デプロイする
GitHub codespace で、Chat ビューを選択し、+ を選択して、新しいチャット セッションを開始します。
"
@workspace アプリはデータベースとキャッシュにどのように接続しますか? " とCopilotクラスと、 Program.cs 。運用モードでは、データベース用に AZURE_SQL_CONNECTIONSTRING と呼ばれる接続文字列をアプリで使用し、AZURE_REDIS_CONNECTIONSTRING* と呼ばれるアプリ設定を使用するように指示してください。"と依頼すると、Copilot が Option 2: GitHub Copilot なしの手順 に示されるコード候補と似た提案をするかもしれず、さらに Program.cs ファイルを変更するように案内することがあります。
エクスプローラーで "Program.cs" を開き、コード候補を追加します。
GitHub Copilotは毎回同じ応答を返すわけではなく、常に正しいとは限りません。 その応答を微調整するために、さらに質問をする必要があるかもしれません。 ヒントについては、「 codespace のGitHub Copilotでできること」を参照>。
これらの変更をデプロイする前に、移行バンドルを生成する必要があります。
問題がありますか? 「トラブルシューティング」セクションを確認してください。
5.データベース スキーマを生成する
SQL Database は仮想ネットワークによって保護されているため、データベースの移行を実行する最も簡単な方法は、SSH セッション内で App Service コンテナーを使うことです。 ただし、App Service Linux コンテナーには .NET SDK がないため、データベース移行を実行する最も簡単な方法は、自己完結型移行バンドルをアップロードすることです。
次のコマンドを使用して、プロジェクトの移行バンドルを生成します。
dotnet ef migrations bundle --runtime linux-x64 -o migrationsbundleヒント
サンプル アプリケーション (DotNetCoreSqlDb.csproj を参照) は、このmigrationsbundle ファイルを含むように構成されています。
azd packageステージでは、migrationsbundle がデプロイ パッケージに追加されます。azd upを使用してすべての変更をデプロイします。azd upAZD の出力で、SSH セッションの URL を見つけ、ブラウザーでそこに移動します。 出力では次のようになります。
Open SSH session to App Service container at: <URL>
SSH セッションで、次のコマンドを実行します。
cd /home/site/wwwroot ./migrationsbundle -- --environment Productionそれに成功すると、App Service はデータベースに正常に接続した状態になります。
--environment Productionは、"Program.cs" で行ったコードの変更に対応します。注
/home内のファイルへの変更のみが、アプリの再起動後も保持されます。/homeの外部の変更は永続化されません。
問題がありますか? 「トラブルシューティング」セクションを確認してください。
6. アプリを参照する
AZD の出力で、アプリの URL を見つけ、ブラウザーでそこに移動します。 URL は、AZD の出力では次のようになります。
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <URL>
一覧にいくつかのタスクを追加します。
おめでとうございます! Azure SQL Databaseへ安全に接続し、Azure App ServiceでWebアプリを実行しています。
問題がありますか? 「トラブルシューティング」セクションを確認してください。
7.診断ログをストリーミングする
Azure App Serviceは、コンソール ログをキャプチャして、アプリケーションの問題を診断するのに役立ちます。 便宜上、AZD テンプレートはローカル ファイル システムでログ記録を有効にしており、ログを Log Analytics ワークスペースに転送しています。
次のスニペットに示すように、このサンプル アプリケーションには、この機能を示す標準のログ記録ステートメントが含まれています。
public async Task<IActionResult> Index()
{
var todoItems = await _cache.GetAsync(_TodoItemsCacheKey);
if (todoItems != null)
{
_logger.LogInformation("Data from cache.");
var todoList = JsonConvert.DeserializeObject<List<Todo>>(Encoding.UTF8.GetString(todoItems));
return View(todoList);
}
else
{
_logger.LogInformation("Data from database.");
var todoList = await _context.Todo.ToListAsync();
var serializedTodoList = JsonConvert.SerializeObject(todoList);
await _cache.SetAsync(_TodoItemsCacheKey, Encoding.UTF8.GetBytes(serializedTodoList));
return View(todoList);
}
}
AZD の出力で、App Service ログをストリーミングするためのリンクを見つけ、ブラウザーでそこに移動します。 このリンクは、AZD の出力では次のようになります。
Stream App Service logs at: <URL>
.NET アプリにおけるログ取りについては、Azure Monitor OpenTelemetry を.NET、Node.js、Python、および Java アプリケーションで有効にするシリーズをご覧ください。
問題がありますか? 「トラブルシューティング」セクションを確認してください。
8.リソースをクリーンアップする
現在のデプロイ環境のすべてのAzure リソースを削除するには、azd down を実行し、プロンプトに従います。
azd down
トラブルシューティング
- Azure SQL Databaseのポータル展開ビューに競合の状態が表示されます
- Azure ポータルでは、Web アプリのログ ストリーム UI にネットワーク エラーが表示されます
-
ブラウザーの SSH セッションに
SSH CONN CLOSEDが表示される -
ポータルのログ ストリーム ページに
Connected!が表示されるが、ログは表示されない
Azure SQL Databaseのポータル展開ビューに競合状態が表示される
サブスクリプションと選択したリージョンによっては、Azure SQL Databaseのデプロイ状態が Conflict になり、操作の詳細に次のメッセージが表示される場合があります。
Location '<region>' is not accepting creation of new Windows Azure SQL Database servers at this time.
このエラーの原因である可能性が最も高いのは、選択したリージョンのサブスクリプションに対する制限です。 デプロイのために別のリージョンを選択してみてください。
Azure ポータルで、Web アプリのログ ストリーム UI にネットワーク エラーが表示される
また、このエラーが発生することがあります。
Unable to open a connection to your app. This may be due to any network security groups or IP restriction rules that you have placed on your app. To use log streaming, please make sure you are able to access your app directly from your current network.
これは通常、アプリが最初に起動されたときの一時的なエラーです。 数分待ってからもう一度確認します。
ブラウザーの SSH セッションで SSH CONN CLOSED が表示される
Linux コンテナーが起動するまでに数分かかります。 数分待ってからもう一度確認します。
ポータル ログ ストリーム ページには Connected! が表示されますが、ログは表示されません
診断ログを構成すると、アプリが再起動されます。 ブラウザーで変更を有効にするには、ページの更新が必要になる場合があります。
よく寄せられる質問
- この設定にはいくらかかりますか。
- 他のツールを使用して仮想ネットワークの背後で保護されているAzure SQL Database サーバーに接続するにはどうすればよいですか?
- GitHub Actionsを使用したローカルアプリ開発はどのように行われますか。
- GitHub Actionsデプロイ中にエラーをデバッグするにはどうすればよいですか?
- 代わりにマネージド ID を使用するように SQL Database 接続を変更するにはどうすればよいですか?
- ユーザー割り当て ID を作成するためのアクセス許可がありません
- コードスペースのGitHub Copilotで何ができますか?
この設定にはいくらかかりますか。
作成したリソースの価格は次のとおりです。
- App Service プランは Basic レベルで作成され、スケールアップまたはスケールダウンできます。 「App Service の価格」をご覧ください。
- Azure SQL Databaseは、最小コアを備えた Standard シリーズ ハードウェア上の汎用サーバーレス層で作成されます。 コストは少額であり、他のリージョンに配布することもできます。 最大サイズを小さくすることでコストをさらに最小化することも、サービス レベル、コンピューティング レベル、ハードウェア構成、コア数、データベース サイズ、ゾーン冗長性を調整してスケールアップすることもできます。 Azure SQL Database価格を参照してください。
- Azure Cache for Redisは、最小キャッシュ サイズの Basic レベルで作成されます。 このレベルには少ないコストがかかります。 高い可用性、クラスタリング、およびその他の機能のために、より高いパフォーマンス レベルにスケールアップできます。 Azure Cache for Redis価格を参照してください。
- 仮想ネットワークでは、ピアリングなどの追加機能を構成しない限り、料金は発生しません。 Azure Virtual Network価格を参照してください。
- プライベート DNS ゾーンでは、少額の料金が発生します。 Azure DNSの価格を参照してください。
他のツールを使用して、仮想ネットワークの背後でセキュリティ保護されているAzure SQL Database サーバーに接続するにはどうすればよいですか?
- コマンドライン ツールからの基本的なアクセスには、アプリの SSH ターミナルから
sqlcmdを実行できます。 アプリのコンテナーにはsqlcmdが付属していないため、手動でインストールする必要があります。 インストールされたクライアントは、アプリの再起動後は保持されない点に注意してください。 - SQL Server Management Studio クライアントまたはVisual Studioから接続するには、マシンが仮想ネットワーク内にある必要があります。 たとえば、いずれかのサブネットに接続されているAzure VM、Azure仮想ネットワークとの サイト間 VPN 接続を持つオンプレミス ネットワーク内のマシンなどです。
GitHub Actionsでのローカル アプリ開発のしくみ
App Service から自動生成されたワークフロー ファイルを例にとると、git push ごとに新しいビルドとデプロイの実行が起動されます。 GitHub リポジトリのローカル 複製から、必要な更新をGitHubにプッシュします。 次に例を示します。
git add .
git commit -m "<some-message>"
git push origin main
GitHub Actionsデプロイ中にエラーをデバッグするにはどうすればよいですか?
自動生成されたGitHubワークフロー ファイルでステップが失敗した場合は、失敗したコマンドを変更して、より詳細な出力を生成してみてください。 たとえば、dotnet オプションを追加することで、任意の -v コマンドからより多くの出力を取得できます。 変更をコミットおよびプッシュして、App Service への別のデプロイをトリガーします。
ユーザー割り当て ID を作成するためのアクセス許可がありません
「展開センターからGitHub Actions展開を設定するを参照してください。
代わりにマネージド ID を使用するように SQL Database 接続を変更するにはどうすればよいですか?
Service Connector は SQL データベースへの既定の接続文字列を管理します。名前は defaultConnector で、SQL 認証を使用します。 マネージド ID を使用する接続に置き換えるには、プレースホルダーを置き換えた後 cloud shell で次のコマンドを実行します。
az extension add --name serviceconnector-passwordless --upgrade
az sql server update --enable-public-network true
az webapp connection delete sql --connection defaultConnector --resource-group <group-name> --name <app-name>
az webapp connection create sql --connection defaultConnector --resource-group <group-name> --name <app-name> --target-resource-group <group-name> --server <database-server-name> --database <database-name> --client-type dotnet --system-identity --config-connstr true
az sql server update --enable-public-network false
既定では、コマンド az webapp connection create sql --client-type dotnet --system-identity --config-connstr は次の処理を行います。
- SQL データベース サーバーのMicrosoft Entra ID管理者としてユーザーを設定します。
- システム割り当てマネージド ID を作成し、データベースへのアクセスを許可します。
-
AZURE_SQL_CONNECTIONGSTRINGという名前のパスワードなしの接続文字列を生成します。これは、チュートリアルの最後にアプリで既に使用されています。
これで、アプリは SQL データベースに接続できるようになります。 詳細については、「Tutorial: マネージド ID を使用してシークレットなしで App Service からAzure データベースに接続するを参照してください。
ヒント
パブリック ネットワーク接続を有効にしたくない場合はどうすればよいですか? サブスクリプションに
仮想ネットワークによってセキュリティ保護されているデータベースに必要なアクセス権を ID に付与するには、az webapp connection create sql は、データベース サーバーへの認証Entra ID直接接続する必要があります。 既定では、Azure Cloud Shell には、ネットワークで保護されたデータベースへのこのアクセス権がありません。
コードスペース内のGitHub Copilotで何ができますか?
コードスペースを作成したときに、GitHub Copilot チャット ビューが既に存在していることに気付いたかもしれません。 便宜上、コンテナー定義に GitHub Copilot チャット拡張機能が含まれています (
GitHub Copilotに話すときのヒントをいくつか紹介します。
- 1 つのチャット セッションでは、質問と回答は相互に基づいて構築されていくので、質問を調整すると、得られる回答を絞り込むことができます。
- 既定では、GitHub Copilotはリポジトリ内のどのファイルにもアクセスできません。 ファイルに関する質問を問い合わせるには、まず、エディターでファイルを開きます。
- GitHub Copilot答えを準備するときにリポジトリ内のすべてのファイルにアクセスできるようにするには、
@workspaceで質問を開始します。 詳細については、Use the @workspace agentを参照してください。 - チャット セッションでは、GitHub Copilotは変更を提案でき、変更を行う場所でも (
@workspaceを使用して) 変更を行うことができますが、変更を行うことが許可されません。 提案された変更を追加してテストするかどうかは、ご自身が決める必要があります。
次のように、得られる回答を微調整するために役立つことが他にもあります。
- このコードを運用モードのみで実行する必要があります。
- このコードはローカルではなくAzure App Serviceでのみ実行する必要があります。
- --output-path パラメーターはサポートされていないようです。
関連するコンテンツ
次のチュートリアルに進み、カスタム ドメインと証明書を使用してアプリをセキュリティで保護する方法を学習してください。
または、他のリソースを参照してください。