オンプレミスでホストされている Python アプリから Azure リソースに対して認証する
Azure の外部 (オンプレミスやサードパーティのデータ センターなど) でホストされているアプリは、Azure リソースにアクセスするときに、アプリケーション サービス プリンシパルを使用して Azure に対する認証を行う必要があります。 アプリケーション サービス プリンシパル オブジェクトは、Azure のアプリ登録プロセスを使用して作成されます。 アプリケーション サービス プリンシパルが作成されると、アプリのクライアント ID とクライアント シークレットが生成されます。 クライアント ID、クライアント シークレット、テナント ID は環境変数に格納されるため、実行時にアプリを Azure に対して認証するために Azure SDK for Python で使用できます。
アプリがホストされている環境ごとに異なるアプリ登録を作成する必要があります。 これにより、各サービス プリンシパルに対して環境固有のリソースアクセス許可を構成でき、ある環境にデプロイされたアプリが、別の環境の一部である Azure リソースと通信しないようにすることができます。
1 - Azure にアプリケーションを登録する
アプリは、Azure portal または Azure CLI を使用して Azure に登録できます。
az ad sp create-for-rbac --name <app-name>
このコマンドの出力は次のように表示されます。 次の手順でこれらの値が必要になり、パスワード (クライアント シークレット) の値を再度表示できなくなるので、これらの値をメモするか、このウィンドウを開いたままにしておきます。
{
"appId": "00000000-0000-0000-0000-000000000000",
"displayName": "msdocs-python-sdk-auth-prod",
"password": "abcdefghijklmnopqrstuvwxyz",
"tenant": "33333333-3333-3333-3333-333333333333"
}
2 - アプリケーション サービス プリンシパルにロールを割り当てる
次に、アプリがどのリソースでどのロール (アクセス許可) を必要としているかを決定し、それらのロールをアプリに割り当てる必要があります。 ロールは、リソース、リソース グループ、またはサブスクリプション スコープで割り当てることができます。 この例では、ほとんどのアプリケーションがすべての Azure リソースを 1 つのリソース グループにグループ化するため、リソース グループ スコープでサービス プリンシパルのロールを割り当てる方法を示します。
サービス プリンシパルには、az role assignment create コマンドを使用して、Azure でロールが割り当てられます。
az role assignment create --assignee {appId} \
--scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
--role "{roleName}"
サービス プリンシパルを割り当てることができるロール名を取得するには、az role definition list コマンドを使用します。
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
たとえば、ID を持つサブスクリプション内の 00000000-0000-0000-0000-000000000000
msdocs-python-sdk-auth-example リソース グループ内のすべてのストレージ アカウント内の Azure Storage BLOB コンテナーとデータへの読み取り、書き込み、削除の appId を持つ11111111-1111-1111-1111-111111111111
サービス プリンシパルにアクセスできるようにするには、次のコマンドを使用して、アプリケーション サービス プリンシパルをストレージ BLOB データ共同作成者ロールに割り当てます。
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 - アプリケーションの環境変数を構成する
Python アプリを実行するプロセスに対して AZURE_CLIENT_ID
、AZURE_TENANT_ID
、AZURE_CLIENT_SECRET
環境変数を設定して、実行時にアプリケーション サービス プリンシパル資格情報をアプリで使用できるようにする必要があります。 DefaultAzureCredential
オブジェクトでは、これらの環境変数でサービス プリンシパル情報を検索します。
Gunicorn を使用して、UNIX サーバー環境で Python Web アプリを実行する場合、アプリの環境変数は、次に示すように gunicorn.server
ファイル内の EnvironmentFile
ディレクティブを使用して指定できます。
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=www-user
Group=www-data
WorkingDirectory=/path/to/python-app
EnvironmentFile=/path/to/python-app/py-env/app-environment-variables
ExecStart=/path/to/python-app/py-env/gunicorn --config config.py wsgi:app
[Install]
WantedBy=multi-user.target
EnvironmentFile
ディレクティブで指定されたファイルには、次に示すように、環境変数とその値の一覧が含まれている必要があります。
AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>
4 - アプリケーションに DefaultAzureCredential を実装する
Azure SDK クライアント オブジェクトを Azure に対して認証するには、アプリケーションで azure.identity
パッケージから DefaultAzureCredential
クラスを使用する必要があります。
まず、azure.identity パッケージを アプリケーションに追加します。
pip install azure-identity
次に、アプリで Azure SDK クライアント オブジェクトを作成する Python コードでは、次のことが必要になります。
azure.identity
モジュールからDefaultAzureCredential
クラスをインポートします。DefaultAzureCredential
オブジェクトを作成します。- 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)
上記のコードでオブジェクトが DefaultAzureCredential
インスタンス化されると、 DefaultAzureCredential
環境変数 AZURE_TENANT_ID
、 AZURE_CLIENT_ID
および AZURE_CLIENT_SECRET
Azure に接続するアプリケーション サービス プリンシパル情報を読み取ります。