クイックスタート: Python 用 Azure Key Vault シークレット クライアント ライブラリ
Python 用 Azure Key Vault シークレット クライアント ライブラリを使ってみます。 以下の手順に従って、パッケージをインストールし、基本タスクのコード例を試してみましょう。 Key Vault を使用してシークレットを保存することで、シークレットをコードに保存しなくて済むため、アプリのセキュリティが向上します。
API のリファレンスのドキュメント | ライブラリのソース コード | パッケージ (Python Package Index)
前提条件
- Azure サブスクリプション - 無料アカウントを作成します。
- Python 3.7 以上。
- Azure CLI または Azure PowerShell。
このクイックスタートは、Linux ターミナル ウィンドウで Azure CLI または Azure PowerShell を実行していることを前提としています。
ローカル環境を設定する
このクイックスタートでは、Azure CLI または Azure PowerShell で、Azure Identity ライブラリを使用して、Azure サービスに対するユーザーの認証を行います。 開発者は、Visual Studio または Visual Studio Code を使用してその呼び出しを認証することもできます。詳細については、Azure Identity クライアント ライブラリを使用してクライアントを認証する方法に関するページを参照してください。
Azure へのサインイン
az login
コマンドを実行します。az login
CLI で既定のブラウザーを開くことができる場合、開いたブラウザに Azure サインイン ページが読み込まれます。
それ以外の場合は、 https://aka.ms/devicelogin でブラウザー ページを開き、ターミナルに表示されている認証コードを入力します。
ブラウザーでアカウントの資格情報を使用してサインインします。
パッケージのインストール
ターミナルまたはコマンド プロンプトで、適切なプロジェクト フォルダーを作成したら、「Python 仮想環境を使用する」で説明されているように、Python 仮想環境を作成し、アクティブ化します。
Microsoft Entra ID ライブラリをインストールします:
pip install azure-identity
Key Vault シークレット ライブラリをインストールします。
pip install azure-keyvault-secrets
リソース グループとキー コンテナーを作成する
リソース グループを作成するには、
az group create
コマンドを使用します。az group create --name myResourceGroup --location eastus
必要に応じて、"eastus" をお近くの場所に変更することができます。
az keyvault create
を使用して、キー コンテナーを作成します。az keyvault create --name <your-unique-keyvault-name> --resource-group myResourceGroup
<your-unique-keyvault-name>
を Azure 全体で一意の名前に置き換えます。 通常、個人名または会社名は、その他の数字や識別子と併せて使用します。
KEY_VAULT_NAME 環境変数を設定する
このスクリプトでは、KEY_VAULT_NAME
環境変数に割り当てられた値をキー コンテナーの名前として使います。 そのため、次のコマンドを使ってこの値を設定する必要があります。
export KEY_VAULT_NAME=<your-unique-keyvault-name>
キー コンテナーへのアクセス許可を付与する
ロールベースのアクセス制御 (RBAC) を使用してキー コンテナーに対するアクセス許可を取得するには、Azure CLI コマンドの az role assignment create を使用して、"ユーザー プリンシパル名" (UPN) にロールを割り当てます。
az role assignment create --role "Key Vault Secrets Officer" --assignee "<upn>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"
<upn>、<subscription-id>、<resource-group-name>、<your-unique-keyvault-name> は実際の値に置き換えます。 UPN は一般的に、メール アドレスの形式を取ります (例: username@domain.com)。
サンプル コードを作成する
シークレットは、Python 用 Azure Key Vault シークレット クライアント ライブラリを使用して管理できます。 以下のコード サンプルでは、クライアントの作成、シークレットの設定、シークレットの取得、シークレットの削除を行う方法を示します。
このコードを含めた kv_secrets.py という名前のファイルを作成します。
import os
from azure.keyvault.secrets import SecretClient
from azure.identity import DefaultAzureCredential
keyVaultName = os.environ["KEY_VAULT_NAME"]
KVUri = f"https://{keyVaultName}.vault.azure.net"
credential = DefaultAzureCredential()
client = SecretClient(vault_url=KVUri, credential=credential)
secretName = input("Input a name for your secret > ")
secretValue = input("Input a value for your secret > ")
print(f"Creating a secret in {keyVaultName} called '{secretName}' with the value '{secretValue}' ...")
client.set_secret(secretName, secretValue)
print(" done.")
print(f"Retrieving your secret from {keyVaultName}.")
retrieved_secret = client.get_secret(secretName)
print(f"Your secret is '{retrieved_secret.value}'.")
print(f"Deleting your secret from {keyVaultName} ...")
poller = client.begin_delete_secret(secretName)
deleted_secret = poller.result()
print(" done.")
コードの実行
前のセクションのコードが kv_secrets.py という名前のファイルに含まれていることを確認します。 次のコマンドを使用して、コードを実行します。
python kv_secrets.py
- アクセス許可エラーが発生した場合は、
az keyvault set-policy
またはSet-AzKeyVaultAccessPolicy
コマンドを実行したことを確認してください。 - 同じシークレット名を使用してコードを再実行すると、"(競合) シークレット <名前> は現在削除されているが、回復可能な状態です" というエラーが生成されることがあります。別のシークレット名を使用してください。
コードの詳細
クライアントの認証と作成
ほとんどの Azure サービスに対するアプリケーション要求は、認可される必要があります。 Azure Identity クライアント ライブラリによって提供される DefaultAzureCredential クラスを使うことは、コード内の Azure サービスへのパスワードレス接続を実装するための推奨される方法です。 DefaultAzureCredential
は複数の認証方法をサポートしており、実行時に使用する方法が決定されます。 このアプローチを採用すると、環境固有のコードを実装することなく、異なる環境 (ローカルと運用環境) で異なる認証方法をアプリに使用できます。
このクイックスタートでは、DefaultAzureCredential
は Azure CLI にログインしたローカル開発ユーザーの資格情報を使って、キー コンテナーに対して認証されます。 アプリケーションが Azure にデプロイされると、同じDefaultAzureCredential
コードで、App Service、仮想マシン、またはその他のサービスに割り当てられているマネージド ID を自動的に検出して使用できます。 詳細については、マネージド ID の概要に関するページを参照してください。
このコード例では、キー コンテナーの名前は、KVUri
変数の値を使用して、"https://<キー コンテナーの名前>.vault.azure.net" という形式で展開されます。
credential = DefaultAzureCredential()
client = SecretClient(vault_url=KVUri, credential=credential)
シークレットを保存する
キー コンテナーのクライアント オブジェクトを取得したら、set_secret メソッドを使用してシークレットを格納できます。
client.set_secret(secretName, secretValue)
set_secret
を呼び出すと、キー コンテナーに対する Azure REST API への呼び出しが生成されます。
Azure ではこの要求を処理するとき、クライアントに指定した資格情報オブジェクトを使用して、呼び出し元の ID (サービス プリンシパル) を認証します。
シークレットを取得する
Key Vault からシークレットを読み取るには、get_secret メソッドを使用します。
retrieved_secret = client.get_secret(secretName)
シークレット値は retrieved_secret.value
に含まれています。
また、Azure CLI コマンド az keyvault secret show または Azure PowerShell コマンドレット Get-AzKeyVaultSecret を使用してシークレットを取得することもできます。
シークレットを削除します
シークレットを削除するには、begin_delete_secret メソッドを使用します。
poller = client.begin_delete_secret(secretName)
deleted_secret = poller.result()
begin_delete_secret
メソッドは非同期であり、ポーラー オブジェクトを返します。 ポーラーの result
メソッドを呼び出して、その完了を待機します。
シークレットが削除されたことを確認するには、Azure CLI コマンド az keyvault secret show または Azure PowerShell コマンドレット Get-AzKeyVaultSecret を使用します。
削除されると、シークレットは削除されたが回復可能な状態がしばらく維持されます。 コードをもう一度実行する場合は、別のシークレット名を使用します。
リソースをクリーンアップする
証明書とキーも試してみる場合は、この記事で作成した Key Vault を再利用できます。
それ以外の場合は、この記事で作成したリソースが完了したら、次のコマンドを使用して、リソース グループとそれに含まれるすべてのリソースを削除します。
az group delete --resource-group myResourceGroup