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


Пример. Доступ к служба хранилища Azure с помощью библиотек Azure для Python

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

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

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

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

  • Настройте виртуальную среду Python с помощью venv или выбранного средства. Вы можете создать виртуальную среду локально или в Azure Cloud Shell и запустить код там. Обязательно активируйте виртуальную среду, чтобы начать использовать ее.

  • Используйте среду conda.

  • Используйте контейнер разработки в 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 помощью более детализированных разрешений с наименьшими привилегиями для ресурсов хранилища приложение выполняется с помощью Azure RBAC.

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

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

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

В следующих шагах вы настроите субъект-службу приложения в качестве удостоверения приложения. Субъекты-службы приложений подходят для использования как во время локальной разработки, так и для приложений, размещенных в локальной среде. Чтобы настроить DefaultAzureCredential использование субъекта-службы приложений, задайте следующие переменные среды: AZURE_CLIENT_IDи AZURE_TENANT_IDAZURE_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}")
    

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

  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>
    

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

    {
      "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. Обратите внимание на ошибку "Этот запрос не авторизован для выполнения этой операции с помощью этого разрешения". Ожидается ошибка, так как локальный субъект-служба, который вы используете, еще не имеет разрешения на доступ к контейнеру BLOB-объектов.

  7. Предоставьте участникам больших двоичных объектов хранилища разрешения для контейнера 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-объектов. Если вы используете неправильное имя, появится сообщение об ошибке "Не удается выполнить запрошенную операцию в вложенном ресурсе. Parent resource 'pythonazurestorage12345' not found" (Не удается выполнить запрошенную операцию с вложенным ресурсом. Родительский ресурс pythonazurestorage12345 не найден).

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

    Совет

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

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

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

Внимание

На предыдущих шагах приложение выполнялось под субъектом-службой приложений. Субъект-служба приложений требует секрет клиента в конфигурации. Однако вы можете использовать тот же код для запуска приложения в различных типах учетных данных, которые не требуют явной настройки пароля или секрета в среде. Например, во время разработки можно использовать учетные данные средства разработчика, DefaultAzureCredential такие как учетные данные, используемые для входа с помощью Azure CLI, или для приложений, размещенных в Azure, он может использовать управляемое удостоверение. Дополнительные сведения см. в статье "Проверка подлинности приложений Python в службах Azure" с помощью пакета SDK Azure для Python.

5. Проверка создания большого двоичного объекта

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

Портал Azure, страница контейнера больших двоичных объектов с загруженным файлом

Если вы создали переменную среды с именем AZURE_STORAGE_CONNECTION_STRING, вы также можете использовать Azure CLI, чтобы убедиться, что большой двоичный объект существует с помощью команды 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 есть роль "Участник данных 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>

См. также