次の方法で共有


チュートリアル: マネージド ID を使用してシークレットなしで App Service からAzure データベースに接続する

App Service は、Azureで高度にスケーラブルな自己修正プログラムを適用する Web ホスティング サービスを提供します。 また、アプリの管理 ID も提供します。これは、次のようなAzure データベースへのアクセスをセキュリティで保護するためのターンキー ソリューションです。

このチュートリアルには、Microsoft Entra認証を異なる方法でサポートする Azure Cosmos DB のガイダンスは含まれていません。 詳細については、システム割り当てマネージド ID を使用してAzure Cosmos DBデータにアクセスするなどのAzure Cosmos DBドキュメントを参照してください。

App Service のマネージド ID を使用すると、接続文字列内の資格情報などのシークレットをアプリから排除することで、アプリのセキュリティを強化できます。 このチュートリアルでは、マネージド ID を使用して App Service から上記のデータベースに接続する方法について説明します。

学習内容

  • Azure データベースの管理者としてMicrosoft Entra ユーザーを構成します。
  • Microsoft Entra ユーザーとしてデータベースに接続します。
  • App Service アプリのシステム割り当てまたはユーザー割り当てマネージド ID を構成します。
  • データベースへのアクセスをマネージド ID に付与します。
  • マネージド ID を使用して、コード (.NET Framework 4.8、.NET 6、Node.js、Python、Java) からAzure データベースに接続します。
  • Microsoft Entra ユーザーを使用して、開発環境からAzure データベースに接続します。

Azure アカウントがない場合は、開始する前に free アカウントを作成します。

前提条件

  • .NET、Node.js、Python、またはJavaに基づいて App Service でアプリを作成します。
  • Azure SQL Database、Azure Database for MySQL、またはAzure Database for PostgreSQLを使用してデータベース サーバーを作成します。
  • 標準的な接続パターン (ユーザー名とパスワード) を熟知し、App Service アプリから選択したデータベースに正常に接続できるようになる必要があります。

Azure CLI用に環境を準備します。

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Get started with Azure Cloud Shell」を参照してください。

  • CLI 参照コマンドをローカルで実行する場合は、Azure CLIinstallします。 Windowsまたは macOS で実行している場合は、Docker コンテナーでAzure CLIを実行することを検討してください。 詳細については、「 Docker コンテナーでAzure CLIを実行する方法を参照してください。

    • ローカル インストールを使用している場合は、az login コマンドを使用してAzure CLIにサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「Azure CLI を使用して Azure に認証する」を参照してください。

    • メッセージが表示されたら、最初に使用するときにAzure CLI拡張機能をインストールします。 拡張機能の詳細については、「Azure CLIを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

1.サービス コネクタ パスワードレス拡張機能をインストールする

Azure CLIの最新の Service Connector パスワードレス拡張機能をインストールします。

az extension add --name serviceconnector-passwordless --upgrade

を実行して、拡張機能 "serviceconnector-passwordless" バージョンが "2.0.2" 以降であることを確認してください。 拡張機能のバージョンをアップグレードするには、まずAzure CLIアップグレードする必要があります。

2.パスワードレス接続を作成する

次に、サービス コネクタを使用してパスワードレス接続を作成します。

ヒント

Azure ポータルは、以下のコマンドの作成に役立ちます。 Azure ポータルで、Azure App Service リソースに移動し、左側のメニューから Service Connector を選択し、Create を選択します。 フォームに必要なすべてのパラメーターを入力します。 Azure接続作成コマンドが自動的に生成されます。このコマンドは、CLI で使用するためにコピーしたり、Azure Cloud Shellで実行したりできます。

次のAzure CLI コマンドでは、--client-type パラメーターを使用します。

  1. 必要に応じて、 を実行してサポートされているクライアントの種類を取得します。

  2. クライアントの種類を選択し、対応するコマンドを実行します。 次のプレースホルダーを実際の情報に置き換えてください。

    • ユーザー割り当てマネージド ID
    • システム割り当てマネージド ID
    az webapp connection create sql \
        --resource-group <group-name> \
        --name <server-name> \
        --target-resource-group <sql-group-name> \
        --server <sql-name> \
        --database <database-name> \
        --user-identity client-id=<client-id> subs-id=<subscription-id> \
        --client-type <client-type>
    

このサービス コネクタ コマンドは、バックグラウンドで次のタスクを完了します。

  • システム割り当てマネージド ID を有効にするか、Azure App Serviceによってホストされるアプリ <server-name> のユーザー ID を割り当てます。
  • Microsoft Entra管理者を現在サインインしているユーザーに設定します。
  • システム割り当てマネージド ID またはユーザー割り当てマネージド ID のデータベース ユーザーを追加します。 データベース のすべての特権をこのユーザーに付与します。 ユーザー名は、上記のコマンド出力の接続文字列にあります。
  • AZURE_MYSQL_CONNECTIONSTRINGAZURE_POSTGRESQL_CONNECTIONSTRING、または AZURE_SQL_CONNECTIONSTRING という名前の構成を、データベースの種類に基づいてAzure リソースに設定します。
  • App Service の場合、構成は [アプリの設定] ブレードで設定されます。

接続の作成時に問題が発生した場合は、「トラブルシューティング」を参照してください。

3.コードを変更する

  1. 依存関係をインストールします。

    dotnet add package Microsoft.Data.SqlClient
    
  2. Service Connector によって追加された環境変数からAzure SQL Database 接続文字列を取得します。

    using Microsoft.Data.SqlClient;
    
    // AZURE_SQL_CONNECTIONSTRING should be one of the following:
    // For system-assigned managed identity:"Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;TrustServerCertificate=True"
    // For user-assigned managed identity: "Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;User Id=<client-id-of-user-assigned-identity>;TrustServerCertificate=True"
    
    string connectionString = 
        Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

    詳細については、「マネージド ID 認証の使用Active Directoryを参照してください。

詳細については、「Homepage for client programming to Microsoft SQL Serverを参照してください。 その他のコード サンプルについては、サービス コネクタを使用したデータベース サービスへのパスワードレス接続の作成に関する記事を参照してください。

4.開発環境を設定する

このサンプル コードでは、DefaultAzureCredential を使用してMicrosoft Entra IDからAzure データベースの使用可能なトークンを取得し、それをデータベース接続に追加します。 はカスタマイズ可能ですが、既に既定で万能で使用できます。 サインインMicrosoft Entraユーザーから、またはマネージド ID からトークンを取得します。これは、開発環境または App Service でローカルに実行するかどうかに応じて異なります。

これ以上変更を加えずに、コードをAzureで実行する準備ができました。 ただし、コードをローカルでデバッグするには、開発環境にサインインMicrosoft Entraユーザーが必要です。 この手順では、Microsoft Entra ユーザーとサインインして、選択した環境を構成します。

  1. WindowsのVisual Studioは、Microsoft Entra認証と統合されています。 Visual Studioで開発とデバッグを有効にするには、メニューから File>Account Settings を選択して、Visual StudioにMicrosoft Entra ユーザーを追加します。 Sign in または Add を選択します。

  2. Azure サービス認証のMicrosoft Entra ユーザーを設定するには、 メニューから Tools>Options を選択し、Azure サービス認証>Account Selection を選択します。 追加したMicrosoft Entraユーザーを選択し、OK を選択します。

Microsoft Entra認証用に開発環境を設定する方法の詳細については、「.NET の Azure Identity クライアント ライブラリ」を参照してください。

これで、Microsoft Entra認証を使用して、SQL Database をバックエンドとして使用してアプリを開発およびデバッグする準備ができました。

5.テストして公開する

  1. コードを開発環境で実行します。 コードでは、環境内のサインインMicrosoft Entraユーザーを使用してバックエンド データベースに接続します。 ユーザーは、データベースのMicrosoft Entra管理者として構成されているため、データベースにアクセスできます。

  2. 推奨される発行方法を使用して、コードをAzureに発行します。 App Service では、コードはアプリのマネージド ID を使用してバックエンド データベースに接続します。

よく寄せられる質問

マネージド ID はSQL Serverをサポートしていますか?

はい。 詳細については、次を参照してください。

エラー が発生します

トークンを要求しようとしているマネージド ID には、Azure データベースへのアクセスが許可されていません。

App Service 認証または関連しているアプリ登録に変更を加えました。 古いトークンをまだ取得するのはなぜですか?

マネージド ID のバックエンド サービスは、トークン キャッシュも管理します。トークン キャッシュでは、有効期限が切れたときにのみターゲット リソースのトークンが更新されます。 アプリでトークンを取得しようとした後に構成を変更すると、キャッシュされたトークンの期限が切れるまで、更新されたアクセス許可で新しいトークンが実際には取得されません。 この問題を回避するには、新しい InPrivate (Edge)/private (Safari)/Incognito (Chrome) ウィンドウで変更をテストするのが最もよい方法です。 そうすれば、新しい認証済みセッションから始めることができます。

マネージド ID を Microsoft Entra グループに追加するにはどうすればよいですか?

必要に応じて、id を Microsoft Entra グループに追加し、ID ではなくMicrosoft Entra グループへのアクセス権を付与できます。 たとえば、次のコマンドは、前の手順のマネージド ID を myAzureSQLDBAccessGroup という名前の新しいグループに追加します。

groupid=$(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
msiobjectid=$(az webapp identity show --resource-group <group-name> --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid

Microsoft Entra グループのデータベース権限を付与するには、それぞれのデータベースの種類のドキュメントを参照してください。

エラー が発生します。

Azure データベースに接続するには、追加の設定が必要であり、このチュートリアルの範囲外です。 詳細については、以下のいずれかのリンクを参照してください。

Azure Database for PostgreSQL - シングル サーバーで TLS 接続を構成するアプリケーションで SSL 接続を構成して、Azure Database for MySQL

Web App + Database テンプレートを使用してアプリを作成しましたが、サービス コネクタ コマンドを使用してマネージド ID 接続を構成できなくなりました。

Service Connector で、アプリ ID にアクセス権を付与するには、データベースへのネットワーク アクセスが必要です。 Web App + データベース テンプレートを使用して Azure ポータルで既定でセキュリティで保護されたアプリとデータベース アーキテクチャを作成すると、アーキテクチャによってデータベースへのネットワーク アクセスがロックされ、仮想ネットワーク内からの接続のみが許可されます。 Azure Cloud Shellにも当てはまります。 ただし、仮想ネットワークにCloud Shellをデプロイ、そのCloud Shellで Service Connector コマンドを実行できます。

次のステップ

ここで学習した内容は次のとおりです。

  • Azure データベースの管理者としてMicrosoft Entra ユーザーを構成します。
  • Microsoft Entra ユーザーとしてデータベースに接続します。
  • App Service アプリのシステム割り当てまたはユーザー割り当てマネージド ID を構成します。
  • データベースへのアクセスをマネージド ID に付与します。
  • マネージド ID を使用して、コード (.NET Framework 4.8、.NET 6、Node.js、Python、Java) からAzure データベースに接続します。
  • Microsoft Entra ユーザーを使用して、開発環境からAzure データベースに接続します。

App Service と Azure Functions