次の方法で共有


Azure SQL Database との間でパスワードレス接続を使うように Python アプリケーションを移行する

適用対象: Azure SQL Database

Azure SQL Database に対するアプリケーション要求は、認証される必要があります。 Azure SQL Database の認証を受けるオプションは複数ありますが、可能な場合は、アプリケーションでパスワードレス接続を優先することをお勧めします。 パスワードや秘密鍵を使用する従来の認証方法は、セキュリティ リスクと複雑さが生じます。 パスワードレス接続に移行する利点の詳細については、「Azure サービスのパスワードレス接続」ハブを参照してください。 以下のチュートリアルでは、Azure SQL Database に接続する既存の Python アプリケーションを、ユーザー名とパスワードのソリューションではなくパスワードレス接続を使うように移行する方法について説明します。

Azure SQL Database の構成

パスワードレスの接続は、Azure Active Directory (Azure AD) 認証を使って、Azure SQL Database を含む Azure サービスに接続します。 Azure AD 認証を使うと、ID を一元管理して、権限の管理を簡略化できます。 Azure SQL Database の Microsoft Entra 認証の構成の詳細については、こちらをご覧ください。

この移行ガイドでは、Azure SQL Database に Microsoft Entra 管理者が割り当てられていることを確認してください。

  1. 論理サーバーの Microsoft Entra ページに移動します。

  2. [管理者の設定] を選択し、[Microsoft Entra ID] フライアウト メニューを開きます。

  3. Microsoft Entra ID フライアウト メニューで、管理者として割り当てるユーザーを検索します。

  4. ユーザーを選び、[選択] を選びます。

    Microsoft Entra 管理者を有効にする方法を示すスクリーンショット。

ローカルの開発環境を構成する

パスワードレス接続は、ローカル環境と Azure ホステッド環境の両方で機能するように構成できます。 このセクションでは、ローカル開発のために個々のユーザーが Azure SQL Database への認証を行うことができるようにする構成を適用します。

Azure へのサインイン

ローカル開発の場合、Azure SQL Database へのアクセスに使うものと同じ Azure AD アカウントでサインインする必要があります。 Azure CLI や Azure PowerShell などの一般的な開発ツールを使用して認証できます。 認証に使用できる開発ツールは、言語によって異なります。

Azure CLI で次のコマンドを使って Azure にサインインします。

az login

データベース ユーザーを作成してロールを割り当てる

Azure SQL Database でユーザーを作成します。 ユーザーは、「Azure にサインインする」セクションでローカル環境にサインインするために使った Azure アカウントに対応している必要があります。

  1. Azure portal でお使いの SQL データベースに移動し、[クエリ エディター (プレビュー)] を選びます。

  2. 画面の右側にある [<your-username> として続行] を選択し、自分のアカウントを使ってデータベースにサインインします。

  3. クエリ エディター ビューで、次の T-SQL コマンドを実行します。

    CREATE USER [user@domain] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [user@domain];
    ALTER ROLE db_datawriter ADD MEMBER [user@domain];
    ALTER ROLE db_ddladmin ADD MEMBER [user@domain];
    GO
    

    Azure Query エディターの使用方法を示すスクリーンショット。

    これらのコマンドを実行すると、指定したアカウントに SQL DB 共同作成者ロールが割り当てられます。 このロールを割り当てられた ID は、データベースのデータとスキーマの読み取り、書き込み、変更を行うことができます。 割り当てられるロールについて詳しくは、「固定データベース ロール」をご覧ください。

ローカル接続の構成を更新する

Python SQL ドライバー - pyodbc を使って Azure SQL Database に接続する既存のアプリケーション コードは、少し変更するだけで、パスワードレス接続を使って引き続き動作します。 たとえば、次のコードは、ローカル環境で実行されている場合と、Azure App Service にデプロイされている場合は、SQL 認証とパスワードレス接続の両方で機能します。

import os
import pyodbc, struct
from azure.identity import DefaultAzureCredential

connection_string = os.environ["AZURE_SQL_CONNECTIONSTRING"]

def get_all():
    with get_conn() as conn:
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM Persons")
        # Do something with the data
    return

def get_conn():
    credential = DefaultAzureCredential(exclude_interactive_browser_credential=False)
    token_bytes = credential.get_token("https://database.windows.net/.default").token.encode("UTF-16-LE")
    token_struct = struct.pack(f'<I{len(token_bytes)}s', len(token_bytes), token_bytes)
    SQL_COPT_SS_ACCESS_TOKEN = 1256  # This connection option is defined by microsoft in msodbcsql.h
    conn = pyodbc.connect(connection_string, attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_struct})
    return conn

ヒント

このコード例では、App Service の環境変数 WEBSITE_HOSTNAME を使って、コードが実行されている環境を特定します。 他のデプロイ シナリオでは、他の環境変数を使って環境を特定できます。

ローカル開発用に参照されている接続文字列 (AZURE_SQL_CONNECTIONSTRING) を更新するには、パスワードレス接続文字列形式を使います。

Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30

アプリをテストする

ローカルでアプリを実行し、Azure SQL Database への接続が期待どおりに機能することを確認します。 Azure ユーザーとロールの変更が Azure 環境に反映されるまでに数分かかる場合があることに注意してください。 これで、開発者がアプリケーション内でシークレットを管理しなくても、ローカルで実行できるようにアプリケーションが構成されました。

Azure ホスティング環境を構成する

ローカルでパスワードレス接続を使うようにアプリを構成して、Azure にデプロイすると、同じコードで Azure SQL Database の認証を受けられるようになります。 以下のセクションでは、マネージド ID を使って Azure SQL Database に接続するようにデプロイされたアプリケーションを構成する方法について説明します。 マネージド ID により、Microsoft Entra ID (旧称 Azure Active Directory) 認証をサポートするリソースに接続するときに使用される Microsoft Entra のマネージド ID がアプリケーションに提供されます。 マネージド ID の詳細を確認してください。

マネージド ID を作成する

Azure portal または Azure CLI を使ってユーザー割り当てマネージド ID を作成します。 アプリケーションでは、ID を使用して他のサービスに対する認証が行われます。

  1. Azure portal の上部で、"マネージド ID" を検索します。 [マネージド ID] の結果を選択します。
  2. [マネージド ID] 概要ページの上部にある [+ 作成] を選択します。
  3. [基本] タブで、次の値を入力します。
    • サブスクリプション: 目的のサブスクリプションを選択します。
    • [リソース グループ]: 目的のリソース グループを選びます。
    • リージョン: ご自分の場所に近いリージョンを選びます。
    • 名前: MigrationIdentity など、ID のわかりやすい名前を入力します。
  4. ページ下部にある [確認と作成] を選択します。
  5. 検証チェックが完了したら、[作成] を選択します。 Azure で、新しいユーザー割り当て ID が作成されます。

リソースが作成されたら、[Go to resource] (リソースに移動) を選択して、マネージド ID の詳細を表示します。

Azure portal を使ってマネージド ID を作成する方法を示すスクリーンショット。

マネージド ID を Web アプリに関連付ける

作成したユーザー割り当てマネージド ID を使うように Web アプリを構成します。

ユーザー割り当てマネージド ID をアプリに関連付けるには、Azure portal で次の手順を実行します。 これらの同じ手順は、次の Azure サービスに適用されます。

  • Azure Spring Apps
  • Azure Container Apps
  • Azure の仮想マシン
  • Azure Kubernetes Service
  • Web アプリの概要ページに移動します。
  1. 左側のナビゲーションから、[ID] を選択します。

  2. [ID] ページで、[ユーザー割り当て済み] タブに切り替えます。

  3. [+ 追加] を選択して、[ユーザー割り当てマネージド ID の追加] ポップアップを開きます。

  4. ID を作成するために使用したサブスクリプションを選択します。

  5. 名前で MigrationIdentity を検索し、検索結果から選択します。

  6. [追加] を選択して、ID をアプリに関連付けます。

    マネージド ID の割り当て方法を示すスクリーンショット。

ID のデータベース ユーザーを作成し、ロールを割り当てる

元のユーザー割り当てマネージド ID にマップする SQL データベース ユーザーを作成します。 アプリでデータベースのデータとスキーマの読み取り、書き込み、変更を実行できるように、必要な SQL ロールをユーザーに割り当てます。

  1. Azure portal で、SQL データベースに移動し、[クエリ エディター (プレビュー)] を選択します。

  2. 画面の右側にある [<username> として続行] を選択し、自分のアカウントを使ってデータベースにサインインします。

  3. クエリ エディター ビューで、次の T-SQL コマンドを実行します。

    CREATE USER [user-assigned-identity-name] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [user-assigned-identity-name];
    ALTER ROLE db_datawriter ADD MEMBER [user-assigned-identity-name];
    ALTER ROLE db_ddladmin ADD MEMBER [user-assigned-identity-name];
    GO
    

    Azure クエリ エディターを使ってマネージド ID の SQL ユーザーを作成する方法を示すスクリーンショット。

    これらのコマンドを実行すると、ユーザー割り当てマネージド ID に SQL DB 共同作成者ロールが割り当てられます。 このロールを割り当てられた ID は、データベースのデータとスキーマの読み取り、書き込み、変更を行うことができます。


重要

エンタープライズ運用環境でデータベース ユーザー ロールを割り当てるときには注意が必要です。 それらのシナリオでは、アプリで 1 つの昇格された ID を使用して、すべての操作を実行すべきではありません。 特定のタスクのための特定のアクセス許可を持つ複数の ID を構成することで、最小限の特権の原則を実装してみてください。

データベース ロールとセキュリティの構成について詳しくは、次のリソースを参照してください。

接続文字列を更新する

パスワードレス接続文字列形式を使うように Azure アプリの構成を更新します。 ローカル環境で使われるのと同じ形式にする必要があります。

接続文字列は、アプリのホスティング環境に環境変数として格納できます。 以下の手順では App Service に焦点を当てていますが、他の Azure ホスティング サービスにも同様の構成が用意されています。

Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30

<database-server-name> は Azure SQL Database サーバーの名前で、<database-name> は Azure SQL Database の名前です。

マネージド ID クライアント ID 用のアプリの設定を作成する

ユーザー割り当てマネージド ID を使うには、AZURE_CLIENT_ID 環境変数を作成し、それにマネージド ID のクライアント ID と同じ値を設定します。 この変数は、Azure portal のアプリの [構成] セクションで設定できます。 クライアント ID は、Azure portal のマネージド ID リソースの [概要] セクションで確認できます。

変更を保存して、アプリケーションを再起動します (自動的に行われない場合)。

注意

この移行ガイドで示されている接続コードの例では、デプロイ時に DefaultAzureCredential クラスを使います。 具体的には、ユーザー割り当てマネージド ID のクライアント ID をコンストラクターに渡さずに、DefaultAzureCredential を使います。 このシナリオでのフォールバックは、AZURE_CLIENT_ID 環境変数をチェックすることです。 AZURE_CLIENT_ID 環境変数が存在しない場合は、システム割り当てマネージド ID が構成されていればそれが使われます。

DefaultAzureCredential コンストラクターにマネージド ID のクライアント ID を渡す場合でも、ローカル シナリオでは認証プロセスが対話型認証にフォールバックするため、接続コードをローカルで使ってデプロイできます。 詳しくは、Python 用 Azure ID クライアント ライブラリに関する記事をご覧ください。

アプリケーションをテストする

アプリをテストして、すべてが正常に機能していることを確認します。 すべての変更が Azure 環境に反映されるまで、数分かかることがあります。

次の手順

このチュートリアルでは、アプリケーションをパスワードレス接続に移行する方法について説明しました。

この記事で説明されている概念の詳細については、次のリソースを参照してください。