Часть 6. Основной код запуска приложения

предыдущая часть: зависимости и переменные среды

Сразу после import инструкций код запуска приложения инициализирует ключевые переменные, используемые во всех функциях обработки запросов.

Во-первых, приложение создает объект приложения Flask, который служит основой для определения маршрутов и обработки входящих HTTP-запросов. Затем он извлекает URL-адрес конечной точки API сторонних производителей из переменной среды. Такой подход упрощает настройку конечной точки без изменения базы кода:

app = Flask(__name__)
app.config["DEBUG"] = True

number_url = os.environ["THIRD_PARTY_API_ENDPOINT"]

Затем он получает объект DefaultAzureCredential, который рекомендуется использовать для аутентификации в службах Azure. См. статью Аутентификация размещенных приложений Azure с помощью DefaultAzureCredential.

credential = DefaultAzureCredential()

При локальном запуске DefaultAzureCredential ищет переменные среды AZURE_TENANT_ID, AZURE_CLIENT_IDи AZURE_CLIENT_SECRET, содержащие сведения для учетной записи службы, используемой для локальной разработки. При запуске в Azure DefaultAzureCredential по умолчанию использует управляемое удостоверение, назначаемое системой и включенное в приложении. Поведение по умолчанию можно переопределить с параметрами приложения, но в этом примере используется поведение по умолчанию.

Следующий код извлекает ключ доступа стороннего API из Azure Key Vault. В скрипте подготовки среды 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 . Для этого клиента требуется два входных данных:

  • URL-адрес Key Vault обычно извлекается из переменной окружения.
  • Объект учетных данных, например, экземпляр DefaultAzureCredential, созданный ранее и представляющий удостоверение, под которым выполняется приложение.
keyvault_client = SecretClient(vault_url=key_vault_url, credential=credential)

Создание объекта SecretClient не приводит к немедленной аутентификации приложения. Клиент — это просто локальная конструкция, в которой хранятся URL-адрес Key Vault и объект учетных данных. Проверка подлинности и авторизация происходят только при вызове операции через клиент, например get_secret, которая создает вызов REST API к ресурсу Azure.

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() завершится неудачно, даже если удостоверение является допустимым. Чтобы обеспечить это разрешение, скрипт инициализации задает для приложения политику доступа "get secrets" с помощью команды 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, приложение использует определенный клиентский объект из пакета SDK Azure для взаимодействия с хранилищем очередей Azure. В этом случае он использует QueueClient класс из библиотеки очередей хранилища Azure.

Чтобы инициализировать клиент, приложение использует from_queue_url метод, предоставляя полный URL-адрес очереди и объект учетных данных. Этот объект учетных данных снова является экземпляром DefaultAzureCredential , созданным ранее, который представляет удостоверение, под которым выполняется приложение.

Как отмечалось ранее в этом руководстве, авторизация предоставляется путем назначения роли "Участник данных очереди хранилища" удостоверению приложения — управляемому удостоверению в Azure или служебному принципалу во время локальной разработки. Это назначение роли выполняется в скрипте подготовки с помощью команды Azure CLI az role assignment create.

Если весь код запуска приложения успешно выполнен, приложение имеет все внутренние переменные для поддержки конечной точки API /api/v1/getcode.