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


Удалите и восстановите объект Blob с помощью Python

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

Сведения об удалении большого двоичного объекта с помощью асинхронных API см. в статье "Удаление большого двоичного объекта" асинхронно.

Prerequisites

Настройка среды

Если у вас нет существующего проекта, в этом разделе показано, как настроить проект для работы с клиентской библиотекой хранилища BLOB-объектов Azure для Python. Дополнительные сведения см. в статье "Начало работы с хранилищем BLOB-объектов Azure" и Python.

Чтобы работать с примерами кода в этой статье, выполните следующие действия, чтобы настроить проект.

Установка пакетов

Установите следующие пакеты с помощью pip install:

pip install azure-storage-blob azure-identity

Добавьте инструкции импорта

Добавьте следующие import инструкции:

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

Authorization

Механизм авторизации должен иметь необходимые разрешения для удаления объекта blob или восстановления мягко удаленного объекта blob. Для авторизации с помощью Microsoft Entra ID (рекомендуется) требуется встроенная роль Сотрудник по данным объектов хранилища BLOB или выше. Чтобы узнать больше, ознакомьтесь с рекомендациями по авторизации для операций Удаление Blob (REST API) и Восстановление Blob (REST API).

Создание клиентского объекта

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

# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.windows.net"
credential = DefaultAzureCredential()

# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential=credential)

Можно также создавать клиентские объекты для конкретных контейнеров или объектов BLOB, как напрямую, так и из объекта BlobServiceClient. Дополнительные сведения о создании клиентских объектов и управлении ими см. в статье "Создание клиентских объектов и управление ими", взаимодействующих с ресурсами данных.

Удалить BLOB

Note

Если мягкое удаление BLOB-объектов включено для учетной записи хранения, невозможно выполнить постоянное удаление с помощью методов клиентской библиотеки. Используя методы, приведенные в этой статье, мягко удаленный большой двоичный объект, его версия или моментальный снимок остаются доступными до истечения срока хранения, после чего он будет окончательно удален. Дополнительные сведения о базовой операции REST API см. в статье "Удаление BLOB-объектов (REST API)".

Чтобы удалить BLOB, вызовите следующий метод:

В следующем примере удаляется blob:

def delete_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.delete_blob()

Если блоб имеет связанные с ним моментальные снимки, необходимо удалить все его моментальные снимки, чтобы удалить сам блоб. В следующем примере удаляются объект BLOB и его снимки:

def delete_blob_snapshots(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.delete_blob(delete_snapshots="include")

Чтобы удалить только моментальные снимки, а не сам блоб, можно передать параметр delete_snapshots="only".

Восстановите удаленный блоб

Мягкое удаление объекта BLOB защищает отдельный объект BLOB и его версии, моментальные снимки и метаданные от случайного удаления или перезаписи, сохраняя удаленные данные в системе в течение заданного периода времени. В течение периода хранения, можно восстановить блоб в состоянии, в котором он находился на момент удаления. После истечения срока хранения, blob окончательно удаляется. Дополнительные сведения об обратимом удалении BLOBs см. раздел "Обратимое удаление для BLOBs".

Можно использовать клиентские библиотеки Azure Storage для восстановления мягко удаленного большого двоичного объекта или моментального снимка.

Восстановление мягко удаленного BLOB зависит от того, включено ли у вашей учетной записи хранения версионирование BLOB. Дополнительные сведения об управлении версиями BLOB-объектов см. в статье Управление версиями BLOB-объектов. См. один из следующих разделов в зависимости от вашего сценария:

Восстановление временно удаленных объектов, когда отключено управление версиями.

Чтобы восстановить удаленные блобы при отключенном управлении версиями, вызовите следующий метод:

Этот метод восстанавливает содержимое и метаданные мягко удаленного объекта BLOB и всех связанных мягко удаленных моментальных снимков. Вызов этого метода для BLOB, который не был удалён, не имеет никакого эффекта.

def restore_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.undelete_blob()

Восстановление мягко удаленных объектов при включении версионирования

Если учетная запись хранения настроена для включения версионирования BLOB-объектов, удаление объекта BLOB приводит к тому, что текущая версия становится предыдущей версией. Чтобы восстановить мягко удаленный двоичный объект, когда управление версиями включено, скопируйте предыдущую версию поверх базового двоичного объекта. Можно использовать следующий метод:

Следующий пример кода получает последнюю версию удаленного большого двоичного объекта и восстанавливает последнюю версию, скопировав его в базовый большой двоичный объект:

def restore_blob_version(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    container_client = blob_service_client.get_container_client(container=container_name)

    # Get a reference to the soft-deleted base blob and list all the blob versions
    blob_client = container_client.get_blob_client(blob=blob_name)
    blob_list = container_client.list_blobs(name_starts_with=blob_name, include=['deleted','versions'])
    blob_versions = []
    for blob in blob_list:
        blob_versions.append(blob.version_id)
    
    # Get the latest version of the soft-deleted blob
    blob_versions.sort(reverse=True)
    latest_version = blob_versions[0]

    # Build the blob URI and add the version ID as a query string
    versioned_blob_url = f"{blob_client.url}?versionId={latest_version}"

    # Restore the latest version by copying it to the base blob
    blob_client.start_copy_from_url(versioned_blob_url)

Асинхронное удаление объекта BLOB

Клиентская библиотека Azure Blob Storage для Python поддерживает асинхронное удаление облака. Дополнительные сведения о требованиях к настройке проекта см. в статье асинхронное программирование.

Выполните следующие действия, чтобы удалить большой двоичный объект с помощью асинхронных API:

  1. Добавьте в файл следующие операторы импорта:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient
    
  2. Добавьте код для запуска программы с помощью asyncio.run. Эта функция запускает переданную корутину, в нашем примере, main(), и управляет циклом событий asyncio. Корутины объявляются с помощью синтаксиса async/await. В этом примере main() корутина сначала создает топ-уровень BlobServiceClient с помощью async with, а затем вызывает метод, который удаляет blob. Обратите внимание, что только клиент верхнего уровня должен использовать async with, так как другие клиенты, созданные из него, используют тот же пул подключений.

    async def main():
        sample = BlobSamples()
    
        # TODO: Replace <storage-account-name> with your actual storage account name
        account_url = "https://<storage-account-name>.blob.core.windows.net"
        credential = DefaultAzureCredential()
    
        async with BlobServiceClient(account_url, credential=credential) as blob_service_client:
            await sample.delete_blob(blob_service_client, "sample-container", "sample-blob.txt")
    
    if __name__ == '__main__':
        asyncio.run(main())
    
  3. Добавьте код для удаления объекта blob. Код совпадает с синхронным примером, за исключением того, что метод объявляется с async ключевым словом, а await ключевое слово используется при вызове delete_blob метода.

    async def delete_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
        blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
        await blob_client.delete_blob()
    

С помощью этой базовой настройки вы можете реализовать другие примеры в этой статье в качестве корутин с помощью синтаксиса async/await.

Resources

Дополнительные сведения об удалении BLOB-объектов и восстановлении обратимо удаленных BLOB-объектов с помощью клиентской библиотеки хранилища BLOB-объектов Azure для Python см. в следующих ресурсах.

Примеры кода

Операции REST API

Пакет SDK Azure для Python содержит библиотеки, которые создаются на основе REST API Azure, что позволяет взаимодействовать с операциями REST API с помощью знакомых парадигм Python. Методы клиентской библиотеки для удаления BLOB-объектов и восстановления удаленных BLOB-объектов используют следующие операции REST API:

Ресурсы клиентской библиотеки

См. также

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