Поделиться через


Пример: Доступ к хранилищу Azure с использованием библиотек Azure для Python

В этой статье вы узнаете, как использовать клиентские библиотеки Azure в коде приложения Python для отправки файла в контейнер хранилища BLOB-объектов Azure. В статье предполагается, что вы создали ресурсы, показанные в примере: создание службы хранилища Azure.

Все описанные в этой статье команды работают одинаково как в Bash для Linux или macOS, так и в командных оболочках для Windows, если не указано иное.

1. Настройка локальной среды разработки

Если вы еще не сделали этого, настройте среду, в которой можно запустить код. Ниже приведено несколько вариантов:

  • Настройте виртуальную среду Python с помощью venv или выбранного вами инструмента. Чтобы начать использовать виртуальную среду, обязательно активируйте ее. Сведения об установке Python см. в разделе "Установка Python".

    #!/bin/bash
    # Create a virtual environment
    python -m venv .venv
    # Activate the virtual environment
    source .venv/Scripts/activate # only required for Windows (Git Bash)
    
  • Используйте среду conda. Сведения об установке Conda см. в разделе "Установка Miniconda".

  • Используйте Dev Container в Visual Studio Code или GitHub Codespaces.

2. Установка пакетов библиотек

В файле requirements.txt добавьте строки для необходимого пакета клиентской библиотеки и сохраните файл.

azure-storage-blob
azure-identity

Затем в терминале или командной строке установите требования.

pip install -r requirements.txt

3. Создание файла для отправки

Создайте исходный файл с именем sample-source.txt. Это имя файла, который ожидает код.

Hello there, Azure Storage. I'm a friendly file ready to be stored in a blob.

4. Использование хранилища BLOB-объектов из кода приложения

В этом разделе показано два способа доступа к данным в контейнере BLOB, созданном в примере: создание хранилища Azure. Чтобы получить доступ к данным в контейнере BLOB, ваше приложение должно аутентифицироваться в Azure и быть авторизовано для доступа к данным в контейнере. В этом разделе представлено два способа выполнения следующих действий.

  • Метод Без пароля (рекомендуется) проверяет подлинность приложения, используя DefaultAzureCredential DefaultAzureCredential. DefaultAzureCredential — это цепочка учетных данных, которая может пройти проверку подлинности приложения (или пользователя) с помощью последовательности различных учетных данных, включая учетные данные средства разработчика, принципалы услуг приложения и управляемые удостоверения.

  • Метод строка подключения использует строку подключения для прямого доступа к учетной записи хранения.

По следующим причинам и многое другое рекомендуется использовать метод без пароля по возможности:

  • Строка подключения аутентифицирует агента подключения с учетной записью хранения, а не отдельными ресурсами в этой учетной записи. В результате строка подключения предоставляет более широкую авторизацию, чем может потребоваться. С помощью DefaultAzureCredential вы можете предоставить более гранулированные разрешения с наименьшими привилегиями для ваших ресурсов хранилища идентификации, под которой выполняется ваше приложение, используя Azure RBAC.

  • Строка подключения содержит сведения о доступе в виде обычного текста и поэтому представляет потенциальные уязвимости, если они не созданы должным образом или защищены. Если такая строка подключения предоставляется, ее можно использовать для доступа к широкому спектру ресурсов в учетной записи хранения.

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

  • Без пароля (рекомендуется)
  • Строка подключения

DefaultAzureCredential — это заранее сконфигурированная цепочка полномочий. DefaultAzureCredential поддерживает множество сред, а также наиболее распространенные потоки проверки подлинности и средства разработчика. Экземпляр DefaultAzureCredential определяет, какие типы учетных данных использовать для получения токена на основе комбинации среды выполнения, значения определенных известных переменных среды и, при необходимости, параметров, передаваемых в его конструктор.

На следующих шагах вы настроите основной объект службы приложения в качестве идентификатора приложения. Принципы служб приложения подходят для использования как во время локальной разработки, так и для приложений, размещенных в локальной инфраструктуре. Чтобы настроить DefaultAzureCredential для использования учетной записи службы приложения, задайте следующие переменные среды: AZURE_CLIENT_ID, AZURE_TENANT_ID и AZURE_CLIENT_SECRET.

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

Например, в локальной среде разработки, если DefaultAzureCredential не удается получить токен с помощью настроенных переменных окружения, он пытается получить его с помощью пользователя, уже вошедшего в систему таких средств разработки, как Azure CLI; для приложения, размещенного в Azure, DefaultAzureCredential можно настроить для использования управляемой идентичности. Во всех случаях код в приложении остается неизменным, изменяется только конфигурация и (или) среда выполнения.

  1. Создайте файл с именем use_blob_auth.py с указанным ниже кодом. Подробные объяснения даны в комментариях.

    import os
    import uuid
    
    from azure.identity import DefaultAzureCredential
    
    # Import the client object from the SDK library
    from azure.storage.blob import BlobClient
    
    credential = DefaultAzureCredential()
    
    # Retrieve the storage blob service URL, which is of the form
    # https://<your-storage-account-name>.blob.core.windows.net/
    storage_url = os.environ["AZURE_STORAGE_BLOB_URL"]
    
    # Create the client object using the storage URL and the credential
    blob_client = BlobClient(
        storage_url,
        container_name="blob-container-01",
        blob_name=f"sample-blob-{str(uuid.uuid4())[0:5]}.txt",
        credential=credential,
    )
    
    # Open a local file and upload its contents to Blob Storage
    with open("./sample-source.txt", "rb") as data:
        blob_client.upload_blob(data)
        print(f"Uploaded sample-source.txt to {blob_client.url}")
    

    Ссылки для справки:

    • DefaultAzureCredential (azure.identity)
    • BlobClient (azure.storage.blob)
  2. Создайте переменную среды с именем AZURE_STORAGE_BLOB_URL.

    set AZURE_STORAGE_BLOB_URL=https://pythonazurestorage12345.blob.core.windows.net
    

    Замените pythonazurestorage12345 именем учетной записи хранения.

    Переменная AZURE_STORAGE_BLOB_URL среды используется только в этом примере. Он не используется библиотеками Azure.

  3. Используйте команду az ad sp create-for-rbac, чтобы создать новую учетную запись службы для приложения. Команда одновременно создает регистрацию для приложения. Присвойте субъекту-службе имя выбранного объекта.

    az ad sp create-for-rbac --name <service-principal-name>
    

    Выходные данные этой команды выглядят следующим фрагментом КОДА JSON. Запишите эти значения или оставьте это окно открытым, так как вам потребуются они на следующем шаге и вы не сможете снова просмотреть значение пароля (секрет клиента). Однако при необходимости можно добавить новый пароль, не затрагивая удостоверение службы или существующие пароли.

    {
      "appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "displayName": "<service-principal-name>",
      "password": "Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2",
      "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
    }
    

    Команды Azure CLI могут выполняться в Azure Cloud Shell или на рабочей станции с установленным Azure CLI.

  4. Создайте переменные среды для субъекта-службы приложения:

    Создайте следующие переменные среды со значениями из выходных данных предыдущей команды. Эти переменные указывают DefaultAzureCredential на использование главного субъекта службы приложения.

    • AZURE_CLIENT_ID → значение идентификатора приложения.
    • AZURE_TENANT_ID → Значение идентификатора арендатора.
    • AZURE_CLIENT_SECRET → пароль или учетные данные, созданные для приложения.
    set AZURE_CLIENT_ID=00001111-aaaa-2222-bbbb-3333cccc4444
    set AZURE_TENANT_ID=aaaabbbb-0000-cccc-1111-dddd2222eeee
    set AZURE_CLIENT_SECRET=Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2
    
  5. Попробуйте выполнить код (который намеренно завершится сбоем):

    python use_blob_auth.py
    
  6. Обратите внимание на ошибку "Этот запрос не авторизован для выполнения этой операции с помощью этого разрешения". Ожидается ошибка, так как локальный субъект-служба, который вы используете, еще не имеет разрешения на доступ к контейнеру блоб-объектов.

  7. Предоставьте разрешения "Storage Blob Data Contributor" на контейнер объектов BLOB служебному принципалу, используя команду "az role assignment create" Azure CLI.

    az role assignment create --assignee <AZURE_CLIENT_ID> \
        --role "Storage Blob Data Contributor" \
        --scope "/subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/PythonAzureExample-Storage-rg/providers/Microsoft.Storage/storageAccounts/pythonazurestorage12345/blobServices/default/containers/blob-container-01"
    

    Аргумент --assignee определяет учетная запись службы. Замените <AZURE_CLIENT_ID> заполнителем идентификатором приложения субъекта-службы.

    Аргумент --scope определяет, к чему применяется это назначение ролей. В этом примере вы предоставляете роль "Участник данных BLOB-объектов хранилища" служебному принципалу для контейнера с именем "blob-container-01".

    • Замените PythonAzureExample-Storage-rg и pythonazurestorage12345 на группу ресурсов, содержащую вашу учетную запись хранения, и точное имя вашей учетной записи хранения. При необходимости настройте имя контейнера BLOB. Если вы используете неправильное имя, появится сообщение об ошибке "Не удается выполнить запрошенную операцию в вложенном ресурсе. Родительский ресурс 'pythonazurestorage12345' не найден.

    • Замените <AZURE_SUBSCRIPTION_ID> на идентификатор вашей подписки Azure. (Вы можете запустить команду az account show и получить идентификатор подписки из свойства id в выходных данных.)

    Совет

    Если команда назначения ролей возвращает ошибку "Адаптеры подключения не найдены" при использовании Bash, попробуйте установить export MSYS_NO_PATHCONV=1 для того, чтобы избежать преобразования путей. Дополнительные сведения см. в данном вопросе.

  8. Подождите минуту или две, пока разрешения не распространятся, затем снова запустите код, чтобы убедиться, что он теперь работает. Если ошибка прав доступа происходит снова, подождите еще и повторите попытку.

Для получения дополнительной информации о назначении ролей см. раздел назначение разрешений для ролей с помощью Azure CLI.

Внимание

В предыдущих шагах ваше приложение запускалось под учетной записью службы приложений. Основной объект службы приложения требует наличия секрета клиента в своей конфигурации. Однако вы можете использовать тот же код для запуска приложения в различных типах учетных данных, которые не требуют явной настройки пароля или секрета в среде. Например, во время разработки может использоваться удостоверение средства разработчика, аналогично учетным данным, которые вы используете для входа через Azure CLI; или для приложений, размещенных в Azure, может использоваться управляемая идентичность. Чтобы узнать больше, см. статью «Аутентификация приложений Python в службах Azure с помощью SDK Azure для Python».

5. Проверка создания BLOB

После выполнения кода любого метода перейдите в портал Azure и перейдите в контейнер BLOB-объектов, чтобы убедиться, что новый BLOB существует с именем sample-blob-{random}.txt и тем же содержимым, что и файл sample-source.txt:

Azure portal page for the blob container, showing the uploaded file Портал Azure, страница Blob-контейнера, на которой отображается загруженный файл

Если вы создали переменную среды с именем `AZURE_STORAGE_CONNECTION_STRING`, вы также можете использовать Azure CLI, чтобы убедиться, что объект BLOB существует с помощью команды az storage blob list.

az storage blob list --container-name blob-container-01

Если вы выполнили инструкции по использованию проверки подлинности без пароля, можно добавить --connection-string параметр в предыдущую команду со строкой подключения для учетной записи хранения. Чтобы получить строку подключения, используйте команду az storage account show-connection-string.

az storage account show-connection-string --resource-group PythonAzureExample-Storage-rg --name pythonazurestorage12345 --output tsv

Используйте всю строку подключения в качестве значения параметра --connection-string.

Примечание.

Если у вашей учетной записи Azure есть роль "Storage Blob Data Contributor" на контейнере, можно использовать следующую команду, чтобы перечислить BLOB-объекты в контейнере:

az storage blob list --container-name blob-container-01 --account-name pythonazurestorage12345 --auth-mode login

6. Очистка ресурсов

Выполните команду az group delete, если вам не нужно сохранять группу ресурсов и ресурсы хранения, использованные в данном примере. Группы ресурсов не несут никаких текущих расходов в вашей подписке, но в группе ресурсов ресурсы, такие как учетные записи хранения, могут продолжать нести расходы. Рекомендуется очистить любую группу, которую вы активно не используете. Аргумент --no-wait позволяет команде выполнить возврат немедленно, вместо того чтобы ожидать завершения операции.

az group delete -n PythonAzureExample-Storage-rg  --no-wait

Для удаления группы ресурсов с помощью кода также можно использовать метод ResourceManagementClient.resource_groups.begin_delete. Код в Пример: создание группы ресурсов демонстрирует использование.

Если вы выполнили инструкции по использованию аутентификации без пароля, рекомендуется удалить основной объект приложения, который вы создали. Можно использовать команду az ad app delete. Замените <AZURE_CLIENT_ID> идентификатором приложения учетной записи службы.

az ad app delete --id <AZURE_CLIENT_ID>

См. также