Python を使用して BLOB のリースを作成および管理する

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

非同期 API を使って BLOB をリースする方法については、「BLOB を非同期的にリースする」を参照してください。

前提条件

  • この記事では、Python 用の Azure Blob Storage クライアント ライブラリを操作するための設定が済んだプロジェクトが、既にあることを前提としています。 パッケージのインストール、import ステートメントの追加、認可されたクライアント オブジェクトの作成を含むプロジェクトの設定については、「Azure Blob Storage と Python で作業を開始する」を参照してください。
  • 認可メカニズムには、BLOB のリースを操作するためのアクセス許可が必要です。 詳細については、次の REST API 操作の認可ガイダンスを参照してください。

BLOB リースについて

リースは、BLOB での書き込みと削除の操作のロックを作成および管理します。 ロック期間は、15 ~ 60 秒にすることも、無限にすることもできます。 BLOB のリースによって、BLOB への書き込みアクセスと削除アクセスが排他的になります。 アクティブなリースのある BLOB に書き込むには、クライアントはアクティブなリースの ID を書き込み要求に含める必要があります。

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

コンテナーの場合、アクティブなリースを保持する BLOB を格納したコンテナーに対して、Delete Container も含めたすべての操作が許可されます。 したがって、アクティブなリースのある BLOB が含まれている場合であっても、コンテナーが削除される場合があります。 コンテナーを削除する権限を制御するには、Lease Container 操作を使用します。

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

リースを取得する

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

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

BlobClient のインスタンスを作成し、次のメソッドを使用して、BLOB のリースを取得することもできます。

次の例では、BLOB の 30 秒間のリースを取得します。

def acquire_blob_lease(self, blob_service_client: BlobServiceClient, container_name):
    # Instantiate a BlobClient
    blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt")

    # Acquire a 30-second lease on the blob
    lease_client = blob_client.acquire_lease(30)

    return lease_client

リースを更新する

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

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

次の例では、BLOB のリースを更新します。

def renew_blob_lease(self, lease_client: BlobLeaseClient):
    # Renew a lease on a blob
    lease_client.renew()

リースを解放する

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

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

次の例では、BLOB のリースを解放します。

def release_blob_lease(self, lease_client: BlobLeaseClient):
    # Release a lease on a blob
    lease_client.release()

リースを中断する

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

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

次の例では、BLOB のリースを中断します。

def break_blob_lease(self, lease_client: BlobLeaseClient):
    # Break a lease on a blob
    lease_client.break_lease()

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

    async def acquire_blob_lease(self, blob_service_client: BlobServiceClient, container_name):
        # Instantiate a BlobClient
        blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt")
    
        # Acquire a 30-second lease on the blob
        lease_client = await blob_client.acquire_lease(30)
    
        return lease_client
    

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

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

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

A diagram showing blob lease states and state change triggers.

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

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

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

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

スナップショットは読み取り専用であるため、BLOB のスナップショットに対してはリースを取得できません。 スナップショットに対するリースを要求すると、ステータス コード 400 (Bad Request) が返されます。

リソース

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

REST API の操作

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

コード サンプル

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

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

関連項目