開発者アカウントを使用したローカル開発時に Azure サービスに対して Python アプリを認証する

開発者がクラウドアプリケーションを作成する場合、通常はローカルワークステーションでアプリケーションをデバッグおよびテストします。 ローカル開発時に開発者のワークステーションでアプリケーションを実行する場合でも、アプリで使用されるすべての Azure サービスに対して認証する必要があります。 この記事では、ローカル開発時に開発者の Azure 資格情報を使用して Azure に対してアプリを認証する方法について説明します。

ローカルで開発中の Python アプリが、開発者の資格情報を使用し、ローカルにインストールされた開発ツールから資格情報を取得することで Azure に接続する方法を示す図。

開発者のAzureクレデンシャルを使用してローカル開発中にAzureに認証するためには、Azure CLI、Azure PowerShell、またはAzure Developer CLIから開発者にサインインする必要があります。 Azure SDK for Python では、開発者がこれらのツールのいずれかからサインインしていることを検出し、サインインしているユーザーとして Azure に対してアプリを認証するために必要な資格情報を資格情報キャッシュから取得できます。

この方法は、開発者の既存の Azure アカウントを利用するため、開発チームに設定するのが最も簡単です。 ただし、開発者のアカウントにアプリケーションで必要とされるよりも多くのアクセス許可が与えられる可能性があるため、運用環境でアプリが実行されるアクセス許可を超えてしまいます。 または、ローカル開発中に使用するアプリケーションサービスプリンシパルを作成することもできます。これは、アプリが必要とするアクセスのみを持つように範囲を設定できます。

1 - ローカル開発用のMicrosoft Entraセキュリティグループの作成

アプリケーションで作業する開発者はほぼ常に複数いるため、まずMicrosoft Entraセキュリティグループを作成して、ローカル開発で必要な役割(権限)をカプセル化することをお勧めします。 このアプローチは、次の利点を提供します。

  • ロールはグループ レベルで割り当てられるため、すべての開発者に同じロールが割り当てられることが保証されます。
  • アプリに新しいロールが必要な場合は、アプリの Microsoft Entra グループに追加するだけで済みます。
  • 新しい開発者がチームに加わる場合、アプリで作業するための適切な権限を得るには、それらを正しいMicrosoft Entraグループに追加する必要があります。

開発チームに既存のMicrosoft Entraセキュリティグループがある場合は、そのグループを使用できます。 それ以外の場合は、次の手順を実行してMicrosoft Entraセキュリティグループを作成します。

Microsoft Entra ID でグループを作成するには、az ad group create コマンドを使用します。 --display-name パラメーターと --main-nickname パラメーターは必須です。 グループに指定する名前は、アプリケーションの名前に基づく必要があります。 また、グループの名前に "local-dev" のような語句を含め、グループの目的も示すと便利です。

az ad group create \
    --display-name MyDisplay \
    --mail-nickname MyDisplay  \
    --description "<group-description>"

コマンド出力のidプロパティ値をコピーします。 これはグループのオブジェクトIDです。 それは後のステップで必要になります。 このプロパティは、az広告グループ表示コマンドを使用して取得することもできます。

グループにメンバーを追加するには、AzureユーザーのオブジェクトIDが必要です。 az ad user list を使用して、使用可能なサービス プリンシパルを一覧表示します。 --filter パラメーター コマンドは OData スタイル フィルターを受け取り、表示されているユーザーの表示名のリストをフィルター処理するために使用できます。 --queryパラメータは、出力を対象カラムに制限します。

az ad user list \
    --filter "startswith(displayName, 'Bob')" \
    --query "[].{objectId:id, displayName:displayName}" \
    --output table

その後、az ad group member add コマンドを使用して、グループにメンバーを追加できます。

az ad group member add \
    --group <group-name> \
    --member-id <object-id>

Note

デフォルトでは、Microsoft Entraセキュリティグループの作成は、ディレクトリ内の特定の特権ロールに制限されます。 グループを作成できない場合は、ディレクトリの管理者に問い合わせてください。 既存のグループにメンバーを追加できない場合は、グループオーナーまたはディレクトリ管理者に問い合わせてください。 詳細については、「Microsoft Entraグループとグループ メンバシップの管理」を参照してください。

2 - Microsoft Entraグループへのロールの割り当て

次に、アプリがどのリソースでどのロール (アクセス許可) を必要としているかを決定し、それらのロールをアプリに割り当てる必要があります。 この例では、手順 1 で作成した Microsoft Entra グループにロールが割り当てられます。 役割は、リソース、リソースグループ、またはサブスクリプションの範囲で割り当てることができます。 次に、ほとんどのアプリケーションがすべてのAzureリソースを1つのリソースグループにグループ化するため、リソースグループスコープでロールを割り当てる例を示します。

azロール割り当て作成コマンドを使用して、Azureでユーザー、グループ、またはアプリケーションサービスのプリンシパルにロールが割り当てられます。 オブジェクトIDでグループを指定できます。

az role assignment create --assignee {objectId} \
    --scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
    --role "{roleName}" 

割り当て可能なロール名を取得するには、azロール定義リストコマンドを使用します。

az role definition list --query "sort_by([].{roleName:roleName, description:description}, &roleName)" --output table

たとえば、ID00000000-0000-0000-0000-000000000000のサブスクリプションのmsdocs-python-sdk-auth-exampleリソースグループのすべてのストレージアカウント内のAzure Storageブロブコンテナとデータへのアクセスを、オブジェクトIDが11111111-1111-1111-1111-111111111111読み取り、書き込み、および削除のグループのメンバーに許可するには、次のコマンドを使用して、グループにストレージブロブデータコントリビュータロールを割り当てます。

az role assignment create --assignee 00000000-0000-0000-0000-000000000000 \
    --scope /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/msdocs-python-sdk-auth-example \
    --role "Storage Blob Data Contributor"

Azure CLI を使用してリソースまたはサブスクリプション レベルでアクセス許可を割り当てる方法については、「Azure CLI を使用して Azure ロールを割り当てる」を参照してください。

3 - Azure CLI、Azure PowerShell、Azure Developer CLI、またはブラウザを使用してAzureにサインイン

開発者のワークステーションでターミナルを開き、Azure CLI から Azure にサインインします。

az login

4 - アプリケーションに DefaultAzureCredential を実装する

Azure SDK クライアント オブジェクトを Azure に対して認証するには、アプリケーションで DefaultAzureCredential パッケージから azure.identity クラスを使用する必要があります。 このシナリオでは、DefaultAzureCredentialは開発者がAzure CLI、Azure PowerShell、またはAzure developer CLIを使用してAzureにサインインしたかどうかを順次確認します。 開発者がこれらのツールのいずれかを使用してAzureにサインインする場合、ツールへのサインインに使用されるクレデンシャルは、アプリによってAzureに対する認証に使用されます。

まず、azure.identity パッケージを アプリケーションに追加します。

pip install azure-identity

次に、アプリで Azure SDK クライアント オブジェクトを作成する Python コードでは、次のことが必要になります。

  1. DefaultAzureCredential モジュールから azure.identity クラスをインポートします。
  2. DefaultAzureCredential オブジェクトを作成します。
  3. Azure SDK クライアント オブジェクト コンストラクターに DefaultAzureCredential オブジェクトを渡します。

これらの手順の例を次のコードセグメントに示します。

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

# Acquire a credential object
token_credential = DefaultAzureCredential()

blob_service_client = BlobServiceClient(
        account_url="https://<my_account_name>.blob.core.windows.net",
        credential=token_credential)