Python を使用して BLOB を削除および復元する

この記事では、Python 用の Azure Storage クライアント ライブラリを使用して BLOB を削除する方法と、保持期間中に論理的に削除された BLOB を復元する方法について説明します。

非同期 API を使用して BLOB を削除する方法については、非同期で BLOB を削除する方法に関するページを参照してください。

前提条件

環境を設定する

既存のプロジェクトがない場合、Python 用 Azure Blob Storage クライアント ライブラリを操作するためのプロジェクトをセットアップする方法についてこのセクションで説明します。 詳細については、「Azure Blob Storage と Python で作業を開始する」を参照してください。

この記事のコード例を使用するには、次の手順に従ってプロジェクトを設定します。

パッケージをインストールする

pip install を使用して次のパッケージをインストールしてください。

pip install azure-storage-blob azure-identity

import ステートメントを追加する

次の import ステートメントを追加します。

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

承認

認可メカニズムには、BLOB の削除、または論理的に削除された BLOB の復元のために必要なアクセス許可が必要です。 Microsoft Entra ID を使用した認可 (推奨) には、Azure RBAC 組み込みロールのストレージ BLOB データ共同作成者以上が必要です。 詳しくは、「Delete Blob (REST API)」と「Undelete Blob (REST API)」の認可のガイダンスを参照してください。

クライアント オブジェクトの作成

アプリを Blob Storage に接続するには、 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 の論理的な削除が有効になっている場合、クライアント ライブラリのメソッドを使用して完全削除を実行することはできません。 この記事の方法では、論理的に削除された BLOB、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 にスナップショットが関連付けられている場合は、そのスナップショットをすべて削除してから 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")

BLOB 自体ではなくスナップショットのみを削除する場合は、パラメーター delete_snapshots="only" を渡します。

削除された BLOB を復元する

BLOB の論理的な削除を使用すると、削除されたデータがシステムに一定の期間保有されることにより、個々の BLOB とその複数バージョン、スナップショット、およびメタデータが誤った削除や上書きから保護されます。 保持期間中は、BLOB を削除時の状態に復元できます。 保持期間が過ぎると、BLOB オブジェクトは完全に削除されます。 BLOB の論理的な削除の詳細については、「BLOB の論理的な削除」を参照してください。

Azure Storage クライアント ライブラリを使用して、論理的に削除された BLOB またはスナップショットを復元できます。

論理的に削除された BLOB を復元する方法は、ストレージ アカウントで 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 を削除すると、BLOB の現在のバージョンが以前のバージョンになります。 バージョン管理が有効になっている場合に論理的に削除された BLOB を復元するには、ベース 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 を削除する

Python 用 Azure Blob Storage クライアント ライブラリでは、BLOB の非同期削除がサポートされています。 プロジェクトのセットアップ要件の詳細については、「非同期プログラミング」を参照してください。

非同期 API を使用して BLOB を削除するには、次の手順に従います。

  1. 次の import ステートメントを追加します。

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient
    
  2. asyncio.run を使ってプログラムを実行するコードを追加します。 この関数では、この例で渡されたコルーチン main() を実行し、asyncio イベント ループを管理します。 コルーチンは、async/await 構文で宣言されます。 この例の main() コルーチンでは、最初に async with を使用して最上位の BlobServiceClient を作成し、次に 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 キーワードを使用してメソッドが宣言され、delete_blob メソッドを呼び出すときに await キーワードが使用される点が異なります。

    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 構文を使用して、この記事の他の例をコルーチンとして実装できます。

リソース

Python 用の Azure Blob Storage クライアント ライブラリを使用して BLOB を削除する方法および論理的に削除した BLOB を復元する方法の詳細については、次のリソースを参照してください。

コード サンプル

  • この記事の同期または非同期のサンプル コードを表示する (GitHub)

REST API の操作

Azure SDK for Python には Azure REST API に基づいて構築されたライブラリが含まれるため、使い慣れた Python パラダイムを通じて REST API 操作を実施できます。 BLOB の削除および削除した BLOB の復元のためのクライアント ライブラリ メソッドでは、次の REST API 操作が使用されます。

クライアント ライブラリのリソース

こちらもご覧ください

次のステップ

  • この記事は、Python の Blob Storage 開発者ガイドの一部です。 「アプリの構築」で開発者ガイドの記事の完全な一覧を参照してください。