次の方法で共有


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

クラウド アプリケーションを開発する場合、開発者は通常、コードを Azure にデプロイする前に、ローカルでコードをビルド、テスト、デバッグします。 ただし、ローカル開発中でも、アプリケーションは、Key Vault、Storage、データベースなど、対話する Azure サービスで認証する必要があります。

この記事では、ローカル開発時に認証に開発者の Azure 資格情報を使用するようにアプリケーションを構成する方法について説明します。 このアプローチにより、シークレットを埋め込んだり、環境固有のロジックを記述したりすることなく、シームレスで安全な開発エクスペリエンスを実現できます。

開発者アカウントを使用したローカル開発認証の概要

Python 用 Azure Identity ライブラリを使用するアプリケーションを開発する場合は、開発者の Azure アカウントを使用して、ローカル開発時に Azure サービスに対して認証を行うことができます。 多くの場合、この方法は、サービス プリンシパルやシークレットを作成および管理する必要がないため、ローカル開発中に Azure サービスに対して認証を行う最も簡単な方法です。

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

開発者独自の Azure 資格情報を使用してローカル開発中にアプリケーションが Azure に対して認証できるようにするには、まず、サポートされているコマンド ライン ツールのいずれかを使用してサインインする必要があります。

  • Azure CLI (az login)
  • Azure Developer CLI (azd login)
  • Azure PowerShell (Connect-AzAccount)

サインインすると、Python 用 Azure Identity ライブラリはアクティブなセッションを自動的に検出し、資格情報キャッシュから必要なトークンを取得できます。 この機能を使用すると、追加の構成やハードコーディングされたシークレットを必要とせずに、サインインしているユーザーとして Azure サービスに対してアプリを認証できます。

この動作は、ローカル環境で CLI ベースの資格情報に透過的にフォールバックする DefaultAzureCredentialを使用する場合に有効になります。

ローカル開発では、開発者のサインインした Azure 資格情報を使用するのが最も簡単なセットアップです。 各チーム メンバーの既存の Azure アカウントを活用し、追加の構成を必要とせずに Azure サービスにシームレスにアクセスできるようにします。

ただし、通常、開発者アカウントには、運用環境で必要なアプリケーションよりも広範なアクセス許可があります。 これらの広範なアクセス許可により、テストの不整合が発生したり、運用環境での実行がアプリに許可されない操作が誤って許可されたりする可能性があります。 運用環境のアクセス許可を厳密にミラーリングし、セキュリティ体制を改善するために、代わりにローカル開発用のアプリケーション固有のサービス プリンシパルを作成できます。 これらのアイデンティティ:

  • アプリケーションに必要なロールとアクセス許可のみを割り当てることができます
  • 最小限の特権のサポート原則
  • 環境間でアクセス関連の動作の一貫したテストを提供する

開発者は環境変数を使用してサービス プリンシパルを利用するようにローカル環境を構成でき、DefaultAzureCredential はそれを自動的に検出します。 詳細については、 サービス プリンシパルを使用したローカル開発時の Azure サービスに対する Python アプリの認証に関する記事を参照してください。

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

ほとんどの開発シナリオでは、複数の開発者が同じアプリケーションに貢献します。 アクセス制御を合理化し、チーム全体で一貫したアクセス許可を確保するには、まず、アプリケーションのローカル開発ニーズに合わせて Microsoft Entra セキュリティ グループを作成することをお勧めします。

個々のユーザーではなく、グループ レベルで Azure ロールを割り当てると、いくつかの主な利点があります。

  • 一貫性のあるロールの割り当て

    グループ内のすべての開発者は、同じロールとアクセス許可を自動的に継承し、開発環境が統一されていることを確認します。

  • 簡素化された役割管理

    アプリケーションに新しいロールが必要な場合は、グループに 1 回だけ追加する必要があります。 個々のユーザーのアクセス許可を更新する必要はありません。

  • 簡単なオンボーディング

    新しい開発者は、グループに追加するだけで、必要なアクセス許可を付与できます。 手動ロールの割り当ては必要ありません。

組織に開発チームに適した Microsoft Entra セキュリティ グループが既にある場合は、それを再利用できます。 それ以外の場合は、アプリ専用の新しいグループを作成できます。

Microsoft Entra ID でセキュリティ グループを作成するには、 az ad group createe Azure CLI コマンドを使用します。

このコマンドには、次のパラメーターが必要です。

--display-name: グループのわかりやすい名前

--mail-nickname: 電子メールと内部参照に使用される一意の識別子

グループ名はアプリケーション名に基づいて作成し、目的を明確に示すために -local-dev などのサフィックスを含めうことをお勧めします。

#!/bin/bash
az ad group create \
    --display-name MyDisplay \
    --mail-nickname MyDisplay  \
    --description "<group-description>"
# PowerShell syntax
az ad group create `
    --display-name MyDisplay `
    --mail-nickname MyDisplay `
    --description "<group-description>"

az ad group create コマンドを実行した後、コマンド出力から id プロパティの値をコピーします。 この記事の後の手順でロールを割り当てるには、Microsoft Entra セキュリティ グループの Object ID が必要です。 後で Object ID をもう一度取得するには、次の az ad group show コマンドを使用します: az ad group show --group "my-app-local-dev" --query id --output tsv

グループにユーザーを追加するには、まず、追加する Azure ユーザー アカウントの Object ID を取得する必要があります。 az ad user list コマンドと --filter パラメーターを使用して、表示名で特定のユーザーを検索します。 --query パラメーターは、出力を関連するフィールドに制限するのに役立ちます。

#!/bin/bash
az ad user list \
--filter "startswith(displayName, 'Bob')" \
--query "[].{objectId:id, displayName:displayName}" \
--output table
# PowerShell syntax
az ad user list `
    --filter "startswith(displayName, 'Bob')" `
    --query "[].{objectId:id, displayName:displayName}" `
    --output table

ユーザーの Object ID を取得したら、 az ad group member add コマンドを使用してグループに追加できます。

#!/bin/bash
az ad group member add \
    --group <group-name> \
    --member-id <object-id>
# PowerShell syntax
az ad group member add `
    --group <group-name> `
    --member-id <object-id>

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

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

Microsoft Entra セキュリティ グループを作成し、メンバーを追加した後、次の手順では、アプリケーションで必要なロール (アクセス許可) を決定し、適切なスコープでそれらのロールをグループに割り当てます。

  • 必要なロールを決定する

    アプリが機能するために必要なロールを特定します。 たとえば、次のような場合です。

    • Key Vault シークレット ユーザー – Azure Key Vault からシークレットを読み取る
    • ストレージ キュー データ共同作成者 - Azure Queue Storage にメッセージを送信する

    その他のオプションについては、組み込みのロール定義を参照してください。

  • ロールの割り当てのスコープを選択する

    ロールは、さまざまなスコープで割り当てることができます。

    • リソース レベル (1 つの Key Vault またはストレージ アカウントなど)
    • リソース グループ レベル (ほとんどのアプリに推奨)
    • サブスクリプション レベル (注意して使用する —最も広範なアクセス)

この例では、リソース グループ スコープでロールを割り当てます。これは、すべてのアプリケーション リソースが 1 つのリソース グループにグループ化されている場合に一般的です。

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

#!/bin/bash
az role assignment create --assignee <objectId> \
    --scope /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName> \
    --role "<roleName>" 
# PowerShell syntax
az role assignment create `
    --assignee <objectId> `
    --scope /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName> `
    --role "<roleName>"

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

#!/bin/bash
az role definition list --query "sort_by([].{roleName:roleName, description:description}, &roleName)" --output table
# PowerShell syntax
az role definition list --query "sort_by([].{roleName:roleName, description:description}, &roleName)" --output table

特定のリソース グループ内のすべてのストレージ アカウントに対して、Azure Storage BLOB コンテナーとデータへの読み取り、書き込み、削除のアクセス権を付与するには、Microsoft Entra セキュリティ グループにストレージ BLOB データ共同作成者ロールを割り当てます。

#!/bin/bash
az role assignment create --assignee bbbbbbbb-1111-2222-3333-cccccccccccc \
    --scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-python-sdk-auth-example \
    --role "Storage Blob Data Contributor"
# PowerShell syntax
az role assignment create --assignee bbbbbbbb-1111-2222-3333-cccccccccccc `
    --scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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 アカウントで認証するには、次のいずれかの方法を選択します。

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

az login

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

Azure で Azure SDK クライアント オブジェクトを認証するには、アプリケーションで DefaultAzureCredential パッケージの azure-identity クラスを使用する必要があります。 これは、ローカル開発と運用の両方のデプロイに推奨される認証方法です。

ローカル開発シナリオでは、 DefaultAzureCredential は使用可能な認証ソースを順番にチェックすることによって機能します。 具体的には、次のツールでアクティブなセッションを検索します。

  • Azure CLI (az login)
  • Azure PowerShell (Connect-AzAccount)
  • Azure Developer CLI (azd auth login)

開発者がこれらのツールのいずれかを使用して Azure にサインインしている場合、 DefaultAzureCredential はセッションを自動的に検出し、それらの資格情報を使用して 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)