Python を使用してソース オブジェクト URL から BLOB をコピーする

この記事では、Python 用 Azure Storage クライアント ライブラリを使用してソース オブジェクト URL から BLOB をコピーする方法について説明します。 BLOB は、同じストレージ アカウント内のソースからでも、別のストレージ アカウント内のソースからでも、特定の URL に対する HTTP GET 要求を介して取得されたアクセス可能なオブジェクトからでもコピーできます。

この記事で説明するクライアント ライブラリ メソッドでは、Put Blob From URL および Put Block From URL REST API 操作を使用します。 これらのメソッドは、ストレージ アカウントにデータを移動する必要があり、ソース オブジェクトの URL がわかっているコピー シナリオに適しています。 非同期スケジュールを設定するコピー操作については、「Python を使用して非同期スケジュールを設定して BLOB をコピーする」を参照してください。

非同期 API を使った BLOB のコピーの詳細については、「ソース オブジェクト URL から 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,
    BlobClient,
)

承認

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

ソース オブジェクト URL からの BLOB のコピーについて

Put Blob From URL 操作により、BLOB のコンテンツが特定の URL から読み取られる新しいブロック BLOB が作成されます。 操作は同期的に完了します。

ソースには、指定された URL に対する標準の HTTP GET 要求を介して取得できる任意のオブジェクトを指定できます。 これには、ブロック BLOB、追加 BLOB、ページ BLOB、BLOB スナップショット、BLOB バージョン、または Azure 内外のアクセス可能なオブジェクトが含まれます。

ソース オブジェクトがブロック BLOB の場合、コミットされたすべての BLOB コンテンツがコピーされます。 コピー先 BLOB のコンテンツはソースのコンテンツと同じですが、コミットされたブロックの一覧は保持されず、コミットされていないブロックはコピーされません。

コピー先は常にブロック BLOB であり、既存のブロック BLOB でも、操作で作成される新しいブロック BLOB でもかまいません。 既存の BLOB のコンテンツは、新しい BLOB のコンテンツで上書きされます。

Put Blob From URL 操作では、常にソース BLOB 全体がコピーされます。 バイト範囲またはブロックのセットのコピーはサポートされていません。 ソース URL を使用してブロック BLOB のコンテンツに部分的な更新を実行するには、Put Block List と共に Put Block From URL API を使用します。

BLOB サイズの制限事項や課金に関する考慮事項など Put Blob From URL 操作の詳細については、URL リマークからの BLOB の配置に関するページを参照してください。

ソース オブジェクト URL から BLOB をコピーする

このセクションでは、ソース オブジェクト URL からコピー操作を実行するために、Python 用の Azure Storage クライアント ライブラリによって提供されるメソッドの概要について説明します。

次のメソッドは、Put Blob From URL REST API 操作をラップし、BLOB のコンテンツが特定の URL から読み取られる新しいブロック BLOB を作成します。

これらのメソッドは、ストレージ アカウントにデータを移動する必要があり、ソース オブジェクトの URL がわかっているシナリオに適しています。

大きなオブジェクトの場合は、個々のブロックを操作することもできます。 次のメソッドは、Put Block From URL REST API 操作をラップします。 次のメソッドでは、コンテンツがソース URL から読み取られる BLOB の一部としてコミットされる新しいブロックが作成されます。

Azure 内のソースから BLOB をコピーする

Azure 内のソースから BLOB をコピーする場合、ソース BLOB へのアクセスは、Microsoft Entra ID、共有アクセス署名 (SAS)、またはアカウント キーを使って承認できます。

次の例は、Azure 内でソース BLOB をコピーするシナリオを示しています。 upload_blob_from_url メソッドは、例に示すように、必要に応じてブール型パラメーターを受け入れて、既存の BLOB を上書きするかどうかを示すことができます。

def copy_from_source_in_azure(self, source_blob: BlobClient, destination_blob: BlobClient):
    # Get the source blob URL and create the destination blob
    # set overwrite param to True if you want to overwrite existing blob data
    destination_blob.upload_blob_from_url(source_url=source_blob.url, overwrite=False)

Azure 外部のソースから BLOB をコピーする

Azure 外部にあるアクセス可能なオブジェクトを含め、特定の URL に対する HTTP GET 要求を介して取得できる任意のソース オブジェクトにコピー操作を実行できます。 次の例は、アクセス可能なソース オブジェクト URL から BLOB をコピーするシナリオを示しています。

def copy_from_external_source(self, source_url: str, destination_blob: BlobClient):
    # Create the destination blob from the source URL
    # set overwrite param to True if you want to overwrite existing blob data
    destination_blob.upload_blob_from_url(source_url=source_url, overwrite=False)

ソース オブジェクト URL から BLOB を非同期でコピーする

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

非同期 API を使ってソース オブジェクト URL から BLOB をコピーするには、以下の手順に従います。

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

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

    async def main():
        sample = BlobCopySamples()
    
        # 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:
            # Copy a blob from one container to another in the same storage account
            source = blob_service_client.get_blob_client(container="source-container", blob="sample-blob.txt")
            destination = blob_service_client.get_blob_client(container="destination-container", blob="sample-blob.txt")
            await sample.copy_from_source_in_azure(source_blob=source, destination_blob=destination)
    
    if __name__ == '__main__':
        asyncio.run(main())
    
  3. ソース URL から BLOB をコピーするコードを追加します。 次のコード例は同期の例と同じですが、メソッドが async キーワードで宣言され、upload_blob_from_url メソッドを呼び出すときに await キーワードが使われる点が異なります。

    async def copy_from_source_in_azure(self, source_blob: BlobClient, destination_blob: BlobClient):
        # Get the source blob URL and create the destination blob
        # set overwrite param to True if you want to overwrite existing blob data
        await destination_blob.upload_blob_from_url(source_url=source_blob.url, overwrite=False)
    

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

リソース

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

コード サンプル

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

REST API の操作

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

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

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