Megosztás a következőn keresztül:


Blob másolása aszinkron ütemezéssel a Python használatával

Ez a cikk bemutatja, hogyan másolhat egy blobot aszinkron ütemezéssel a Pythonhoz készült Azure Storage-ügyfélkódtár használatával. Egy blobot másolhat egy forrásból ugyanabban a tárfiókban, egy másik tárfiókban lévő forrásból, vagy bármely akadálymentes objektumból, amely egy adott URL-címen http GET kéréssel kérhető le. A függőben lévő másolási műveletet is megszakíthatja.

A cikkben tárgyalt ügyfélkódtár-metódusok a Blob REST API másolása műveletet használják, és akkor használhatók, ha aszinkron ütemezéssel szeretne másolatot készíteni. A legtöbb olyan másolási forgatókönyv esetében, amikor adatokat szeretne áthelyezni egy tárfiókba, és rendelkezik a forrásobjektum URL-címével, tekintse meg a Blob másolása forrásobjektum URL-címéről a Pythonnal című témakört.

Előfeltételek

Saját környezet beállítása

Ha nem rendelkezik meglévő projekttel, ez a szakasz bemutatja, hogyan állíthat be egy projektet a PythonHoz készült Azure Blob Storage ügyfélkódtár használatához. További részletekért tekintse meg az Azure Blob Storage és a Python használatának első lépéseit.

A jelen cikkben szereplő példakódok használatához kövesse az alábbi lépéseket a projekt beállításához.

Csomagok telepítése

Telepítse a következő csomagokat a következő használatával pip install:

pip install azure-storage-blob azure-identity

Importálási utasítások hozzáadása

Adja hozzá a következő import-utasításokat:

import datetime
from azure.identity import DefaultAzureCredential
from azure.storage.blob import (
    BlobServiceClient,
    BlobClient,
    BlobLeaseClient,
    BlobSasPermissions,
    generate_blob_sas
)

Engedélyezés

Az engedélyezési mechanizmusnak rendelkeznie kell a másolási művelet végrehajtásához vagy a függőben lévő másolat megszakításához szükséges engedélyekkel. A Microsoft Entra-azonosítóval való engedélyezéshez (ajánlott) a legkevésbé kiemelt Azure RBAC beépített szerepkör több tényezőtől függően változik. További információért tekintse meg a Blob másolása (REST API) vagy a Blob másolásának megszakítása (REST API) engedélyezési útmutatóját.

Ügyfélobjektum létrehozása

Ha egy alkalmazást a Blob Storage-hoz szeretne csatlakoztatni, hozzon létre egy BlobServiceClient-példányt. Az alábbi példa bemutatja, hogyan hozhat létre ügyfélobjektumot DefaultAzureCredential engedélyezés céljából:

# 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)

Ügyfélobjektumokat is létrehozhat adott tárolókhoz vagy blobokhoz közvetlenül vagy az BlobServiceClient objektumból. Az ügyfélobjektumok létrehozásáról és kezeléséről további információt az adaterőforrásokat kezelő ügyfélobjektumok létrehozása és kezelése című témakörben talál.

Blobok aszinkron ütemezéssel történő másolása

A Copy Blob művelet aszinkron módon fejeződhet be, és a legjobb munkamennyiség alapján hajtható végre, ami azt jelenti, hogy a művelet nem garantáltan azonnal indul el vagy fejeződik be egy megadott időkereten belül. A másolási művelet a háttérben van ütemezve, és a kiszolgáló rendelkezésre álló erőforrásokkal rendelkezik. A művelet szinkron módon is befejeződhet, ha a másolat ugyanabban a tárfiókban történik.

A Copy Blob művelet a következő műveletek bármelyikét hajthatja végre:

  • Másolja a forrásblobot egy másik nevű célblobba. A célblob lehet ugyanahhoz a blobtípushoz tartozó meglévő blob (blokk, hozzáfűzés vagy oldal), vagy lehet a másolási művelet által létrehozott új blob.
  • Másolja a forrásblobot egy célblobba ugyanazzal a névvel, amely a célblobot helyettesíti. Ez a másolási művelet eltávolítja a nem véglegesített blokkokat, és felülírja a cél blob metaadatait.
  • Másolja a forrásfájlt az Azure File service-ben egy célblobba. A célblob lehet meglévő blokkblob, vagy a másolási művelet által létrehozott új blokkblob. A fájlokról lapblobok vagy hozzáfűző blobok másolása nem támogatott.
  • Pillanatkép másolása az alapblobra. Ha előléptet egy pillanatképet az alapblob helyére, visszaállíthatja a blob egy korábbi verzióját.
  • Pillanatkép másolása másik nevű célblobba. Az eredményként kapott célblob egy írható blob, és nem pillanatkép.

A másolási művelet forrásblobja a következő típusok egyike lehet: blokkblob, hozzáfűző blob, lapblob, blob pillanatkép vagy blobverzió. A másolási művelet mindig a teljes forrásblobot vagy fájlt másolja. A bájtok vagy blokkok tartományának másolása nem támogatott.

Ha a célblob már létezik, annak a forrásblob típusával megegyező blobtípusúnak kell lennie, és a meglévő célblob felülírva lesz. A célblob nem módosítható másolási művelet közben, és a célblobok csak egy kiugró másolási művelettel rendelkezhetnek.

Ha többet szeretne megtudni a műveletről, beleértve a Copy Blob tulajdonságokra, indexcímkékre, metaadatokra és számlázásra vonatkozó információkat, olvassa el a Blob-megjegyzések másolása című témakört.

Blob másolása aszinkron ütemezéssel

Ez a szakasz áttekintést nyújt a Pythonhoz készült Azure Storage ügyfélkódtár által a másolási művelet aszinkron ütemezéssel történő végrehajtásához biztosított módszerekről.

A következő metódusok burkolják a Blob REST API másolása műveletet, és elindítják az adatok aszinkron másolatát a forrásblobból:

A start_copy_from_url függvény egy copy_status és copy_id tartalmazó szótárt ad vissza. A copy_status tulajdonság akkor sikeres , ha a másolat szinkron módon fejeződött be, vagy függőben van , ha a másolat aszinkron módon lett elindítva.

Blob másolása egy Azure-beli forrásból

Ha egy blobot másol ugyanabban a tárfiókban, a művelet szinkron módon is befejeződhet. A forrásblobhoz való hozzáférés a Microsoft Entra-azonosítón, a közös hozzáférésű jogosultságkódon (SAS) vagy egy fiókkulcson keresztül engedélyezhető. Alternatív szinkron másolási műveletről a Blob másolása forrásobjektum URL-címéről a Pythonnal című témakörben olvashat.

Ha a másolási forrás egy másik tárfiókban lévő blob, a művelet aszinkron módon fejeződhet be. A forrásblobnak nyilvánosnak vagy SAS-jogkivonaton keresztül engedélyezettnek kell lennie. Az SAS-jogkivonatnak tartalmaznia kell az olvasási ('r') engedélyt. Az SAS-jogkivonatokról további információt a Megosztott hozzáférésű jogosultságkódokkal rendelkező hozzáférés delegálása című témakörben talál.

Az alábbi példa egy másik tárfiókból származó forrásblob aszinkron ütemezéssel történő másolásának forgatókönyvét mutatja be. Ebben a példában létrehozunk egy forrás blob URL-címet egy hozzáfűzött felhasználódelegálási SAS-jogkivonattal. A példa bemutatja, hogyan hozhatja létre az SAS-jogkivonatot az ügyfélkódtár használatával, de sajátot is megadhat. A példa azt is bemutatja, hogyan adhatja bérbe a forrásblobot a másolási művelet során, hogy megakadályozza a blob módosítását egy másik ügyféltől. A Copy Blob művelet a másolási művelet indításakor menti ETag a forrásblob értékét. Ha az ETag érték a másolási művelet befejeződése előtt módosul, a művelet meghiúsul.

def copy_from_source_in_azure_async(self, source_blob: BlobClient, destination_blob: BlobClient, blob_service_client: BlobServiceClient):
    # Lease the source blob during copy to prevent other clients from modifying it
    lease = BlobLeaseClient(client=source_blob)

    sas_token = self.generate_user_delegation_sas(blob_service_client=blob_service_client, source_blob=source_blob)
    source_blob_sas_url = source_blob.url + "?" + sas_token

    # Create an infinite lease by passing -1 as the lease duration
    lease.acquire(lease_duration=-1)

    # Start the copy operation - specify False for the requires_sync parameter
    copy_operation = dict()
    copy_operation = destination_blob.start_copy_from_url(source_url=source_blob_sas_url, requires_sync=False)
    
    # If start_copy_from_url returns copy_status of 'pending', the operation has been started asynchronously
    # You can optionally add logic here to wait for the copy operation to complete

    # Release the lease on the source blob
    lease.break_lease()

def generate_user_delegation_sas(self, blob_service_client: BlobServiceClient, source_blob: BlobClient):
    # Get a user delegation key
    delegation_key_start_time = datetime.datetime.now(datetime.timezone.utc)
    delegation_key_expiry_time = delegation_key_start_time + datetime.timedelta(hours=1)
    key = blob_service_client.get_user_delegation_key(
        key_start_time=delegation_key_start_time,
        key_expiry_time=delegation_key_expiry_time
    )

    # Create a SAS token that's valid for one hour, as an example
    sas_token = generate_blob_sas(
        account_name=blob_service_client.account_name,
        container_name=source_blob.container_name,
        blob_name=source_blob.blob_name,
        account_key=None,
        user_delegation_key=key,
        permission=BlobSasPermissions(read=True),
        expiry=datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(hours=1),
        start=datetime.datetime.now(datetime.timezone.utc)
    )

    return sas_token

Feljegyzés

A felhasználói delegálási SAS-jogkivonatok nagyobb biztonságot nyújtanak, mivel fiókkulcs helyett Microsoft Entra hitelesítő adatokkal vannak aláírva. Felhasználói delegálási SAS-jogkivonat létrehozásához a Microsoft Entra biztonsági tagnak megfelelő engedélyekre van szüksége. Az engedélyezési követelményekkel kapcsolatban lásd: Felhasználódelegálási kulcs lekérése.

Blob másolása az Azure-on kívüli forrásból

Másolási műveletet bármely olyan forrásobjektumon végrehajthat, amely http GET kéréssel kérhető le egy adott URL-címen, beleértve az Azure-on kívüli akadálymentes objektumokat is. Az alábbi példa egy blob akadálymentes forrásobjektum URL-címéről történő másolásának forgatókönyvét mutatja be.

def copy_from_external_source_async(self, source_url: str, destination_blob: BlobClient):
    # Start the copy operation - specify False for the requires_sync parameter
    copy_operation = dict()
    copy_operation = destination_blob.start_copy_from_url(source_url=source_url, requires_sync=False)
    
    # If start_copy_from_url returns copy_status of 'pending', the operation has been started asynchronously
    # You can optionally add logic here to wait for the copy operation to complete

Másolási művelet állapotának ellenőrzése

Az aszinkron Copy Blob művelet állapotának ellenőrzéséhez lekérdezheti a get_blob_properties metódust, és ellenőrizheti a másolás állapotát.

Az alábbi példakód bemutatja, hogyan ellenőrizheti a függőben lévő másolási művelet állapotát:

def check_copy_status(self, destination_blob: BlobClient):
    # Get the copy status from the destination blob properties
    copy_status = destination_blob.get_blob_properties().copy.status

    return copy_status

Másolási művelet megszakítása

A függőben lévő Copy Blob művelet megszakítása nulla hosszúságú célblobot eredményez. A célblob metaadatai azonban a forrásblobból másolt vagy explicit módon beállított új értékeket tartalmaznak a másolási művelet során. Az eredeti metaadatok másolás előtti megőrzéséhez készítsen pillanatképet a célblobról, mielőtt meghívja az egyik másolási metódust.

Függőben lévő másolási művelet megszakításához hívja meg a következő műveletet:

Ez a metódus körbefuttatja a Blob REST API megszakítása műveletet, amely megszakít egy függőben lévő Copy Blob műveletet. Az alábbi példakód bemutatja, hogyan szakíthat meg függőben lévő Copy Blob műveletet:

def abort_copy(self, destination_blob: BlobClient):
    # Get the copy operation details from the destination blob properties
    copy_status = destination_blob.get_blob_properties().copy.status
    copy_id = destination_blob.get_blob_properties().copy.id

    # Check the copy status and abort if pending
    if copy_status == 'pending':
        destination_blob.abort_copy(copy_id)
        print(f"Copy operation {copy_id} has been aborted")

Források

Ha többet szeretne megtudni a blobok aszinkron ütemezéssel történő másolásáról a PythonHoz készült Azure Blob Storage ügyfélkódtár használatával, tekintse meg az alábbi erőforrásokat.

Kódminták

REST API-műveletek

Az Azure SDK for Python olyan kódtárakat tartalmaz, amelyek az Azure REST API-ra épülnek, lehetővé téve a REST API-műveletek használatát jól ismert Python-paradigmákon keresztül. A cikkben tárgyalt ügyfélkódtár-metódusok a következő REST API-műveleteket használják:

  • Blob másolása (REST API)
  • Blob másolásának megszakítása (REST API)

Ügyfélkódtár erőforrásai