通过


第 6 部分:主应用启动代码

上一部分:依赖项和环境变量

紧跟在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_IDAZURE_CLIENT_IDAZURE_CLIENT_SECRET 环境变量,其中包含用于本地开发的服务主体的信息。 在 Azure 中运行时,DefaultAzureCredential 默认使用在应用上启用系统分配的托管标识。 可以使用应用程序设置替代默认行为,但在此示例中,我们使用默认行为。

接下来,代码从 Azure Key Vault 检索第三方 API 的访问密钥。 在预配脚本中,Key Vault 是使用 az keyvault create创建的,并且机密随 az keyvault secret set一起存储。

Key Vault 资源本身是通过从 KEY_VAULT_URL 环境变量加载的 URL 访问的。

key_vault_url = os.environ["KEY_VAULT_URL"]

若要从 Azure Key Vault 检索机密,应用程序必须创建与 Key Vault 服务通信的客户端对象。 由于目标是读取机密,因此应用使用 SecretClient 库中的 azure.keyvault.secrets 类。 此客户端需要两个输入:

  • Key Vault URL - 通常从环境变量中检索
  • 凭据对象 (例如 DefaultAzureCredential 之前创建的实例),表示运行应用时所使用的标识。
keyvault_client = SecretClient(vault_url=key_vault_url, credential=credential)

SecretClient创建对象不会立即对应用程序进行身份验证。 客户端只是存储 Key Vault URL 和凭据对象的本地构造。 身份验证和授权仅在通过客户端调用作(例如 get_secret)时发生,这会生成对 Azure 资源的 REST API 调用。

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

即使应用程序的身份被授权访问 Azure Key Vault,也必须显式授权它执行特定操作,例如读取密钥。 如果没有此权限,即使标识是有效的,调用 get_secret() 也会失败。 若要解决此问题,预配脚本使用 Azure CLI 命令 az keyvault set-policy为应用设置“获取机密”访问策略。 有关详细信息,请参阅 Key Vault 身份验证授予应用对 Key Vault的访问权限。 后一篇文章介绍如何使用 Azure 门户设置访问策略。 (本文也是针对托管标识编写的,但同样适用于本地开发中使用的服务原则。)

最后,应用代码设置客户端对象,通过该对象可将消息写入 Azure 存储队列。 队列的 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 队列存储进行交互。 在这种情况下,它使用 QueueClient azure-storage-queue 库中的类。

为了初始化客户端,应用使用 from_queue_url 该方法,提供队列的完全限定 URL 和凭据对象。 此凭据对象仍然是之前创建的 DefaultAzureCredential 实例,该实例表示应用运行时的标识。

如本指南前面所述,通过向应用程序的标识分配“存储队列数据参与者”角色(在本地开发期间为 Azure 中的托管标识或服务主体)授予该授权。 此角色分配是使用 Azure CLI 命令 az role assignment create在预配脚本中完成的。

假设所有启动代码都成功,应用具有其所有内部变量,以支持其 /api/v1/getcode API 终结点。