次の方法で共有


サービス プリンシパルを使用して、ローカル開発中にPythonアプリをAzureサービスに認証する

ローカル開発時に、アプリケーションは、さまざまなAzure サービスにアクセスするためにAzureに対して認証を行う必要があります。 この記事では、アプリケーション サービス プリンシパルをローカル認証の 2 つの一般的な方法の 1 つとして使用する方法について説明します。

  • サービス プリンシパルを作成するためにアプリケーションをMicrosoft Entraに登録する方法
  • Microsoft Entra グループを使用してアクセス許可を効率的に管理する方法
  • スコープのアクセス許可にロールを割り当てる方法
  • アプリ コードからサービス プリンシパルを使用して認証する方法

専用のアプリケーション サービス プリンシパルを使用すると、Azure リソースにアクセスするときに最小特権の原則に従うことができます。 アクセス許可は開発中のアプリの特定の要件に限定されるため、他のアプリやサービスを対象としたAzure リソースに誤ってアクセスするのを防ぐことができます。 この方法は、開発環境でアプリが過剰に特権を持たないようにすることで、アプリが運用環境に移行されたときの問題を回避するのにも役立ちます。

ローカル開発環境で実行されているアプリが .env ファイルからアプリケーション サービス プリンシパルを取得し、その ID を利用して Azure リソースに接続する方法を示す図

アプリがAzureに登録されると、アプリケーション サービス プリンシパルが作成されます。 ローカル開発の場合:

  • アプリで作業する開発者ごとに個別のアプリ登録を作成して、各開発者が独自のアプリケーション サービス プリンシパルを持っていることを確認し、資格情報を共有する必要がなくなります。
  • アプリのアクセス許可を必要なもののみに制限するには、アプリごとに個別のアプリ登録を作成します。

ローカル開発時に、環境変数はアプリケーション サービス プリンシパルの ID で設定されます。 Azure ID ライブラリは、これらの環境変数を読み取って、必要なAzure リソースに対してアプリを認証します。

Azureにアプリを登録する

アプリケーション サービス プリンシパル オブジェクトは、Azure ポータルまたはAzure CLIを使用して、Azureのアプリ登録によって作成されます。

  1. Azure ポータルで、検索バーを使用して アプリの登録 ページに移動します。

  2. アプリの登録 ページで、+ 新規登録を選択します。

  3. 「アプリケーションの登録ページ」で、次の手順を実行します。

    • [名] フィールドに、アプリ名とターゲット環境を含むわかりやすい値を入力します。
    • [サポートされているアカウントの種類] で、この組織のディレクトリ内のアカウントのみ (Microsoft Customer Led only - Single tenant (Microsoft カスタマー主導の場合のみ - シングル テナント)) を選択するか、要件に最も適したオプションを選択します。
  4. [登録] を選択してアプリを登録し、サービス プリンシパルを作成します。

    Azure portal でアプリ登録を作成する方法を示すスクリーンショット。

  5. アプリの [アプリ登録] ページで、アプリケーション (クライアント) ID と Directory (テナント) ID コピーし、後でアプリ コード構成で使用できるように一時的な場所に貼り付けます。

  6. [証明書またはシークレットの追加] を選択して、アプリの資格情報を設定します。

  7. [証明書 & シークレット] ページで、[+ 新しいクライアント シークレット] を選択します。

  8. 開いた [クライアント シークレットの追加] ポップアップ パネルで次の操作を実行します。

    • [説明] に、Current の値を入力します。
    • の [有効期限] の値は、既定値の 180 日間のままにします。
    • [追加] を選択してシークレットを追加します。
  9. 証明書 & シークレット ページで、クライアント シークレットの Value プロパティをコピーして、今後の手順で使用してください。

    クライアント シークレットの値は、アプリの登録が作成された後に 1 回だけ表示されます。 このクライアント シークレットを無効にすることなく、クライアント シークレットをさらに追加できますが、この値を再度表示する方法はありません。

ローカル開発用のMicrosoft Entra グループを作成する

個々のサービス プリンシパル オブジェクトにロールを割り当てるのではなく、アプリがローカル開発で必要とするロール (アクセス許可) をカプセル化するMicrosoft Entra グループを作成します。 この方法には、次の利点があります。

  • すべての開発者には、グループ レベルで同じロールが割り当てられます。
  • アプリに新しいロールが必要な場合は、アプリのグループにのみ追加する必要があります。
  • 新しい開発者がチームに参加すると、開発者用に新しいアプリケーション サービス プリンシパルが作成され、グループに追加され、開発者がアプリで作業するための適切なアクセス許可を持っている必要があります。
  1. Azure ポータルの Microsoft Entra ID 概要ページに移動します。

  2. 左側のメニューから [すべてのグループ ] を選択します。

  3. [ グループ ] ページで、[ 新しいグループ] を選択します。

  4. [ 新しいグループ ] ページで、次のフォーム フィールドに入力します。

    • グループの種類: [セキュリティ] を選択します。
    • グループ名: アプリ名または環境名への参照を含むグループの名前を入力します。
    • グループの説明: グループの目的を説明する説明を入力します。

    Azure portal でグループを作成する方法を示すスクリーンショット。

  5. [メンバー] の下の [メンバーが選択されていません] リンクを選択して、グループにメンバーを追加します。

  6. 開いたポップアップ パネルで、先ほど作成したサービス プリンシパルを検索し、フィルター処理された結果から選択します。 パネルの下部にある [選択 ] ボタンを選択して、選択内容を確認します。

  7. [新しいグループ] ページの下部にある [作成] を選択してグループを作成し、[すべてのグループ] ページに戻ります。 新しいグループが表示されない場合は、しばらく待ってからページを更新してください。

グループにロールを割り当てる

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

  1. Azure ポータルで、アプリを含むリソース グループの Overview ページに移動します。

  2. 左側のナビゲーションから アクセス制御 (IAM) を選択します。

  3. [ アクセス制御 (IAM)] ページで、[ + 追加 ] を選択し、ドロップダウン メニューから [ ロールの割り当ての追加 ] を選択します。 [ ロールの割り当ての追加] ページには、ロールを構成して割り当てるためのタブがいくつか用意されています。

  4. [ ロール ] タブで、検索ボックスを使用して、割り当てるロールを見つけます。 ロールを選択し、[ 次へ] を選択します。

  5. [メンバー] タブで、次の 手順 を実行します。

    • [ 値へのアクセスの割り当て] で、[ ユーザー、グループ、またはサービス プリンシパル ] を選択します。
    • [メンバー] の値で 、[+ メンバーの選択] を選択して、[メンバーの選択] ポップアップ パネルを開きます。
    • 先ほど作成したMicrosoft Entra グループを検索し、フィルター処理された結果から選択します。 [ 選択 ] を選択してグループを選択し、ポップアップ パネルを閉じます。
    • [メンバー] タブの下部にある [確認と割り当て] を選択します。

    Microsoft Entra グループにロールを割り当てる方法を示すスクリーンショット

  6. [ 校閲と割り当て ] タブで、ページの下部にある [校閲と割り当て ] を選択します。

アプリ環境変数を設定する

実行時に、DefaultAzureCredentialEnvironmentCredential など、ClientSecretCredentialの特定の資格情報で、環境変数の規則によってサービス プリンシパル情報を検索します。 ツールと環境に応じて、Pythonを使用するときに環境変数を構成する方法は複数あります。

選択した方法に関係なく、サービス プリンシパルに対して次の環境変数を構成します。

  • AZURE_CLIENT_ID: Azureに登録されているアプリのアプリケーション ID。
  • AZURE_TENANT_ID: Microsoft Entra テナントの ID。
  • : アプリのクライアント シークレット資格情報。

ほとんどの開発者は複数のアプリケーションで作業するため、開発中にアプリケーションのディレクトリに格納されている ファイルから環境変数にアクセスするには、python-dotenv などのパッケージを使用することをお勧めします。 このアプローチでは、このアプリケーションのみが使用できるように、環境変数のスコープを設定します。

.env ファイルには、Azureのアプリケーション シークレット キーが含まれるため、ソース管理にチェックインされることはありません。 Pythonの標準.gitignore ファイルは、チェックインから .env ファイルを自動的に除外します。

パッケージを使用するには、まずアプリケーションにパッケージをインストールします。

pip install python-dotenv

次に、アプリケーションのルート ディレクトリに ファイルを作成します。 アプリ登録プロセスから取得した値を使用して環境変数の値を設定します。

AZURE_CLIENT_ID=<your-client-id>
AZURE_TENANT_ID=<your-tenant-id>
AZURE_CLIENT_SECRET=<your-client-secret>

最後に、アプリケーションのスタートアップ コードで、 ライブラリを使用して、起動時に ファイルから環境変数を読み取ります。

from dotenv import load_dotenv

load_dotenv()

アプリからAzure サービスに対する認証

azure-identity ライブラリには、さまざまなシナリオとMicrosoft Entra認証フローのサポートに適合したさまざまなcredentialsTokenCredentialの実装が用意されています。 この手順では、ローカルおよび運用環境でサービス プリンシパルを操作するときに ClientSecretCredential を使用する方法を示します。

コードを実装する

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

pip install azure-identity

次に、アプリでAzure SDKクライアント オブジェクトを作成するPython コードについては、次の手順を実行する必要があります。

  1. モジュールから クラスをインポートします。
  2. モジュールをインポートして環境変数を読み取ります。
  3. 環境変数を読み取って、クライアント ID、テナント ID、およびクライアント シークレットを取得します。
  4. テナント ID、クライアント ID、クライアント シークレットを渡す オブジェクトを作成します。
  5. ClientSecretCredential オブジェクトを Azure SDK クライアント オブジェクト コンストラクターに渡します。

この方法の例を次のコード セグメントに示します。

import os
from azure.identity import ClientSecretCredential
from azure.storage.blob import BlobServiceClient

tenant_id = os.environ.get("AZURE_TENANT_ID")
client_id = os.environ.get("AZURE_CLIENT_ID")
client_secret = os.environ.get("AZURE_CLIENT_SECRET")

credential = ClientSecretCredential(tenant_id, client_id, client_secret)

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