import
ステートメントの直後に、アプリのスタートアップ コードによって、要求処理関数全体で使用されるキー変数が初期化されます。
最初に、アプリケーションによって Flask アプリ オブジェクトが作成されます。これは、ルートを定義し、受信 HTTP 要求を処理するための基礎として機能します。 次に、環境変数からサードパーティの API エンドポイント URL を取得します。 これにより、コードベースを変更せずにエンドポイントを簡単に構成できます。
app = Flask(__name__)
app.config["DEBUG"] = True
number_url = os.environ["THIRD_PARTY_API_ENDPOINT"]
次に、DefaultAzureCredential
オブジェクトを取得します。これは、Azure サービスで認証するときに使用する推奨される資格情報です。 DefaultAzureCredential を使用して Azure でホストされるアプリケーションを認証するを参照してください。
credential = DefaultAzureCredential()
ローカルで実行すると、DefaultAzureCredential
は、ローカル開発に使用しているサービス プリンシパルの情報を含む AZURE_TENANT_ID
、AZURE_CLIENT_ID
、および AZURE_CLIENT_SECRET
環境変数を検索します。 Azure で実行すると、DefaultAzureCredential
既定では、アプリで有効になっているシステム割り当てマネージド ID が使用されます。 既定の動作をアプリケーション設定でオーバーライドすることもできますが、この例のシナリオでは既定の動作を使用します。
次のコードでは、Azure Key Vault からサード パーティの API のアクセス キーを取得します。 プロビジョニング スクリプトでは、key Vault は az keyvault create
を使用して作成され、シークレットは az keyvault secret set
と共に格納されます。
Key Vault リソース自体は URL を介してアクセスされ、KEY_VAULT_URL
環境変数から読み込まれます。
key_vault_url = os.environ["KEY_VAULT_URL"]
Azure Key Vault からシークレットを取得するには、アプリケーションで Key Vault サービスと通信するクライアント オブジェクトを作成する必要があります。 目的はシークレットの読み取りであるため、アプリは SecretClient
ライブラリの azure.keyvault.secrets
クラスを使用します。 このクライアントには、次の 2 つの入力が必要です。
- Key Vault の URL – 通常は環境変数から取得されます
- 資格情報オブジェクト - 前に作成した
DefaultAzureCredential
インスタンスなど、アプリが実行されている ID を表します。
keyvault_client = SecretClient(vault_url=key_vault_url, credential=credential)
SecretClient
オブジェクトを作成しても、アプリケーションは直ちに認証されません。 クライアントは、Key Vault の URL と資格情報オブジェクトを格納する単なるローカル コンストラクトです。 認証と承認は、Azure リソースへの REST API 呼び出しを生成する get_secret
などのクライアントを介して操作を呼び出す場合にのみ行われます。
api_secret_name = os.environ["THIRD_PARTY_API_SECRET_NAME"]
vault_secret = keyvault_client.get_secret(api_secret_name)
# The "secret" from Key Vault is an object with multiple properties. The key we
# want for the third-party API is in the value property.
access_key = vault_secret.value
アプリケーションの ID が Azure Key Vault へのアクセスを承認されている場合でも、シークレットの読み取りなど、特定の操作を実行する権限も明示的に付与する必要があります。 このアクセス許可がないと、ID が有効な場合でも、 get_secret()
の呼び出しは失敗します。 これに対処するために、プロビジョニング スクリプトは、Azure CLI コマンド az keyvault set-policy
を使用して、アプリの "シークレットの取得" アクセス ポリシーを設定します。 詳細については、「Key Vault 認証」と「Key Vaultへのアクセス権をアプリに付与する」を参照してください。 後者の記事では、Azure portal を使用してアクセス ポリシーを設定する方法を示します。 (この記事はマネージド ID 用にも記述されていますが、ローカル開発で使用されるサービス 原則にも同様に適用されます)。
最後に、アプリ コードは、Azure Storage キューにメッセージを書き込むことができるクライアント オブジェクトを設定します。 キューの URL は環境変数 STORAGE_QUEUE_URL
にあります。
queue_url = os.environ["STORAGE_QUEUE_URL"]
queue_client = QueueClient.from_queue_url(queue_url=queue_url, credential=credential)
Azure Key Vault と同様に、アプリケーションは Azure SDK の特定のクライアント オブジェクトを使用して Azure Queue Storage と対話します。 この場合、azure-storage-queue ライブラリの QueueClient
クラスが使用されます。
クライアントを初期化するために、アプリは from_queue_url
メソッドを使用して、キューの完全修飾 URL と資格情報オブジェクトを提供します。 この資格情報オブジェクトは、前に作成した DefaultAzureCredential
インスタンスです。これは、アプリが実行されている ID を表します。
このガイドで前述したように、その承認は、アプリケーションの ID (Azure のマネージド ID またはローカル開発中のサービス プリンシパル) に "ストレージ キュー データ共同作成者" ロールを割り当てることによって付与されます。
このロールの割り当ては、Azure CLI コマンド az role assignment create
を使用してプロビジョニング スクリプトで行われます。
このスタートアップ コードがすべて成功したと仮定すると、アプリには、api エンドポイント /api/v1/getcode をサポートするために、すべての内部変数が用意されています。