次の方法で共有


Python を使用してコンテナーのリースを作成および管理する

この記事では、Python 用 Azure Storage クライアント ライブラリを使用してコンテナーのリースを作成および管理する方法について説明します。 クライアント ライブラリを使用して、コンテナー リースを取得、更新、解放、および中断できます。

非同期 API を使って 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, BlobLeaseClient

承認

認可メカニズムには、コンテナー リースを操作するために必須のアクセス許可が必要です。 Microsoft Entra ID を使用した認可 (推奨) には、Azure RBAC 組み込みロールのストレージ 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 オブジェクトから作成することもできます。 クライアント オブジェクトの作成と管理の詳細については、「データ リソースを操作するクライアント オブジェクトを作成および管理する」を参照してください。

コンテナー リースについて

リースは、コンテナーでの削除操作のロックを設定および管理します。 ロック期間は、15 ~ 60 秒にすることも、無限にすることもできます。 コンテナーのリースによって、コンテナーへの排他的削除アクセスが提供されます。 コンテナー リースでは、Delete Container REST API 操作を使用してコンテナーを削除する機能のみが制御されます。 アクティブなリースを使用してコンテナーを削除するには、クライアントが削除要求に有効なリース ID を含める必要があります。 他のコンテナー操作については、リース ID なしでも、リースされたコンテナーで成功します。 コンテナーの論理的な削除を有効にしている場合は、削除されたコンテナーを復元できます。

リースの状態とリースに対して特定のアクションを実行できるタイミングの詳細については、「リースの状態とアクション」を参照してください。

リース操作は BlobLeaseClient クラスによって処理されます。このクラスでは、BLOB とコンテナーのすべてのリース操作を含むクライアントが提供されます。 クライアント ライブラリを使用した BLOB リースの詳細については、「Python を使用して BLOB のリースを作成および管理する」を参照してください。

リースを取得する

コンテナー リースを取得すると、コードによるコンテナーの操作に使用できるリース ID が取得されます。 コンテナーに既にアクティブなリースがある場合、新しいリースを要求するには、アクティブなリース ID を使用する必要があります。 ただし、新しいリース期間を指定できます。

リースを取得するには、BlobLeaseClient クラスのインスタンスを作成し、次のメソッドを使用します。

また、ContainerClient クラスの次のメソッドを使用してリースを取得することもできます。

次の例では、コンテナーの 30 秒間のリースが取得されます。

def acquire_container_lease(self, blob_service_client: BlobServiceClient, container_name):
    # Instantiate a ContainerClient
    container_client = blob_service_client.get_container_client(container=container_name)

    # Acquire a 30-second lease on the container
    lease_client = container_client.acquire_lease(30)

    return lease_client

リースを更新する

要求で指定したリース ID がコンテナーに関連付けられているリース ID と一致する場合、コンテナー リースを更新できます。 リースの有効期限が切れていても、そのリースの期限切れ以降にコンテナーが変更されたり、再度リースされたりしていなければ、リースを更新できます。 リースを更新すると、リースの期間がリセットされます。

リースを更新するには、次のメソッドを使用します。

次の例では、コンテナーのリースを更新します。

def renew_container_lease(self, lease_client: BlobLeaseClient):
    # Renew a lease on the container
    lease_client.renew()

リースを解放する

要求で指定したリース ID がコンテナーに関連付けられているリース ID と一致する場合、コンテナー リースを解放できます。 リースを解放すると、解放が完了した直後に、別のクライアントがそのコンテナーのリースを取得できるようになります。

リースは、次のメソッドを使用して解放できます。

次の例では、コンテナーのリースを解放します。

def release_container_lease(self, lease_client: BlobLeaseClient):
    # Release a lease on the container
    lease_client.release()

リースを中断する

コンテナーにアクティブなリースが存在する場合、コンテナー リースを中断できます。 すべての認可済みの要求によってリースを中断できます。要求で一致するリース ID を指定する必要はありません。 リースを中断した後にリースを更新することはできず、リースを中断すると、元のリースの有効期限が切れるか、または解放されるまで、新しいリースが一定期間取得されません。

リースは、次のメソッドを使用して中断できます。

次の例では、コンテナーのリースを中断します。

def break_container_lease(self, lease_client: BlobLeaseClient):
    # Break a lease on the container
    lease_client.break_lease()

コンテナーを非同期的にリースする

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

非同期 API を使ってコンテナーを作成するには、以下の手順を実行します。

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

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, BlobLeaseClient
    
  2. asyncio.run を使ってプログラムを実行するコードを追加します。 この関数では、この例で渡されたコルーチン main() を実行し、asyncio イベント ループを管理します。 コルーチンは、async/await 構文で宣言されます。 この例の main() コルーチンでは、まず async with を使って最上位レベルの BlobServiceClient を作成し、次にコンテナーのリースを取得するメソッドを呼び出します。 最上位のクライアントのみで async with を使う必要があることに注意してください。ここから作成された他のクライアントでは同じ接続プールを共有するためです。

    async def main():
        sample = ContainerSamples()
    
        # 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:
            lease_client = await sample.acquire_container_lease(blob_service_client, "sample-container")
    
    if __name__ == '__main__':
        asyncio.run(main())
    
  3. コンテナーのリースを取得するコードを追加します。 このコードは同期の例と同じですが、async キーワードを使用してメソッドが宣言され、acquire メソッドを呼び出すときに await キーワードが使用される点が異なります。

    async def acquire_container_lease(self, blob_service_client: BlobServiceClient, container_name):
        # Instantiate a ContainerClient
        container_client = blob_service_client.get_container_client(container=container_name)
    
        # Acquire a 30-second lease on the container
        lease_client = BlobLeaseClient(container_client)
        await lease_client.acquire(lease_duration=30)
    
        return lease_client
    

この基本的なセットアップが実施されている場合、async/await 構文を使用して、この記事の他の例をコルーチンとして実装できます。

リースの状態とアクション

次の図は、リースの 5 つの状態とリースの状態を変えるコマンドまたはイベントを示しています。

コンテナーのリースの状態および状態の変更トリガーを示す図。

次の表に、5 つのリース状態の一覧を表示し、それぞれの簡単な説明を示し、特定の状態で許可されるリース アクションの一覧を表示します。 これらのリース アクションは、図に示すように状態遷移を発生させます。

リース状態 説明 許可されるリース アクション
利用可能 リースはロックが解除されていて、取得できます。 acquire
Leased リースはロックされています。 acquire (同じリース ID のみ)、renewchangerelease、および break
Expired リース期間が終了しています。 acquirerenewrelease、および break
あり リースは中断されていますが、中断期間が終了するまでリースが引き続きロックされます。 release および break
中断 リースは中断されていて、中断期間が終了しました。 acquirereleasebreak

リースの有効期限が切れると、コンテナーが変更されるか再度リースされるまで、リース ID は BLOB service によって維持されます。 クライアントは、期限切れのリース ID を使用してリースを更新または解放しようとする場合があります。 要求が失敗した場合、リースが最後にアクティブだった時点以降にコンテナーが再度リースされたか、コンテナーが削除されたことをクライアントが認識します。

リースを明示的に解放するのではなく、期限切れにした場合、クライアントはそのコンテナーに対する新しいリースを取得する前に、最大 1 分間だけ待つことが必要になる場合があります。 ただし、クライアントは、有効期限切れのリース ID でリースを直ちに更新できます。

リソース

Python 用 Azure Blob Storage クライアント ライブラリを使用したコンテナーのリースについて詳しくは、次のリソースを参照してください。

コード サンプル

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

REST API の操作

Azure SDK for Python には Azure REST API に基づき構築されたライブラリが含まれるため、使い慣れた Python パラダイムを通じて REST API 操作を実施できます。 コンテナーをリースするためのクライアント ライブラリ メソッドでは、次の REST API 操作が使用されます。

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

関連項目

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