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

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

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

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

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

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.

Первый метод (с проверкой подлинности) выполняет проверку подлинности приложения, DefaultAzureCredential как описано в разделе "Проверка подлинности приложений Python в службах Azure" во время локальной разработки с помощью субъектов-служб. С помощью этого метода необходимо сначала назначить соответствующие разрешения удостоверениям приложения, что является рекомендуемой практикой.

Второй метод (с строка подключения) использует строка подключения для прямого доступа к учетной записи хранения. Этот метод кажется проще. Но он имеет два существенных недостатка:

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

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

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

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

  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": "00000000-0000-0000-0000-000000000000",
      "displayName": "{service-principal-name}",
      "password": "abcdefghijklmnopqrstuvwxyz",
      "tenant": "11111111-1111-1111-1111-111111111111"
    }
    

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

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

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

    • AZURE_CLIENT_ID → значение идентификатора приложения.
    • AZURE_TENANT_ID → Значение идентификатора клиента.
    • AZURE_CLIENT_SECRET → пароль или учетные данные, созданные для приложения.
    set AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
    set AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
    set AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
    
  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-объектов. Если вы неправильно укажите имя, то получите сообщение об ошибке "Cannot perform requested operation on nested resource. 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.

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

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

    import os
    import uuid
    
    # Import the client object from the SDK library
    from azure.storage.blob import BlobClient
    
    # Retrieve the connection string from an environment variable. Note that a
    # connection string grants all permissions to the caller, making it less
    # secure than obtaining a BlobClient object using credentials.
    conn_string = os.environ["AZURE_STORAGE_CONNECTION_STRING"]
    
    # Create the client object for the resource identified by the connection
    # string, indicating also the blob container and the name of the specific
    # blob we want.
    blob_client = BlobClient.from_connection_string(
        conn_string,
        container_name="blob-container-01",
        blob_name=f"sample-blob-{str(uuid.uuid4())[0:5]}.txt",
    )
    
    # 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_CONNECTION_STRING, значением которой является полная строка подключения для учетной записи хранения. (Эта переменная среды также используется различными комментариями Azure CLI.) Вы можете получить строка подключения для учетной записи хранения, выполнив команду az storage account show-connection-string.

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

    Замените PythonAzureExample-Storage-rg и pythonazurestorage12345 на группу ресурсов, содержащую учетную запись хранения и точное имя учетной записи хранения.

    При установке переменной среды используйте все значение connectionString свойства в выходных данных, включая кавычки.

  3. Выполните код.

    python use_blob_conn_string.py
    

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

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

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

Azure portal page for the blob container, showing the uploaded file

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

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

Если вы выполнили инструкции по использованию хранилища BLOB-объектов с проверкой подлинности, можно добавить --connection-string параметр в предыдущую команду с помощью строка подключения для учетной записи хранения. Чтобы узнать, как получить строка подключения, см. инструкции в 4b. Использование хранилища BLOB-объектов с строка подключения. Используйте всю строка подключения включая кавычки.

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

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

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

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

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

az ad app delete --id <AZURE_CLIENT_ID>

См. также