Aracılığıyla paylaş


Python kullanarak zaman uyumsuz zamanlamayla blob kopyalama

Bu makalede, Python için Azure Depolama istemci kitaplığını kullanarak zaman uyumsuz zamanlamayla bir blobu kopyalama işlemi gösterilmektedir. Blobu aynı depolama hesabındaki bir kaynaktan, farklı bir depolama hesabındaki bir kaynaktan veya belirli bir URL'deki HTTP GET isteği aracılığıyla alınan erişilebilir nesnelerden kopyalayabilirsiniz. Bekleyen kopyalama işlemini de durdurabilirsiniz.

Bu makalede ele alınan istemci kitaplığı yöntemleri, Blob REST API'sini Kopyalama işlemini kullanır ve zaman uyumsuz zamanlamayla bir kopyalama gerçekleştirmek istediğinizde kullanılabilir. Verileri depolama hesabına taşımak istediğiniz ve kaynak nesnenin URL'sine sahip olmak istediğiniz çoğu kopyalama senaryosu için bkz . Python ile kaynak nesne URL'sinden blob kopyalama.

Önkoşullar

Ortamınızı ayarlama

Mevcut bir projeniz yoksa, bu bölümde Python için Azure Blob Depolama istemci kitaplığıyla çalışmak üzere bir projenin nasıl ayarlanacağı gösterilir. Diğer ayrıntılar için bkz. Azure Blob Depolama ve Python'ı kullanmaya başlama.

Bu makaledeki kod örnekleriyle çalışmak için projenizi ayarlamak için bu adımları izleyin.

Paketleri yükleme

kullanarak pip installaşağıdaki paketleri yükleyin:

pip install azure-storage-blob azure-identity

İçeri aktarma deyimleri ekleme

Aşağıdaki import deyimlerini ekleyin:

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

Yetkilendirme

Yetkilendirme mekanizması, kopyalama işlemini gerçekleştirmek veya bekleyen bir kopyayı durdurmak için gerekli izinlere sahip olmalıdır. Microsoft Entra Id ile yetkilendirme için (önerilen), en az ayrıcalıklı Azure RBAC yerleşik rolü çeşitli faktörlere göre değişir. Daha fazla bilgi edinmek için Bkz. Blob Kopyalama (REST API) veya Kopyalamayı Durdur Blobu (REST API) için yetkilendirme kılavuzu.

İstemci nesnesi oluşturma

Bir uygulamayı Blob Depolama'ya bağlamak için bir BlobServiceClient örneği oluşturun. Aşağıdaki örnekte yetkilendirme için kullanarak DefaultAzureCredential bir istemci nesnesinin nasıl oluşturulacağı gösterilmektedir:

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

Ayrıca, doğrudan veya nesneden BlobServiceClient belirli kapsayıcılar veya bloblar için istemci nesneleri oluşturabilirsiniz. İstemci nesneleri oluşturma ve yönetme hakkında daha fazla bilgi edinmek için bkz . Veri kaynaklarıyla etkileşim kuran istemci nesneleri oluşturma ve yönetme.

Zaman uyumsuz zamanlamayla blobları kopyalama hakkında

İşlem Copy Blob zaman uyumsuz olarak tamamlanabilir ve en iyi çaba temelinde gerçekleştirilir. Bu, işlemin belirtilen zaman çerçevesi içinde hemen başlatılması veya tamamlanmasının garanti olmadığı anlamına gelir. Kopyalama işlemi arka planda zamanlanır ve sunucuda kullanılabilir kaynaklar olduğundan gerçekleştirilir. Kopyalama aynı depolama hesabında gerçekleşirse işlem zaman uyumlu olarak tamamlanabilir.

Bir Copy Blob işlem aşağıdaki eylemlerden herhangi birini gerçekleştirebilir:

  • Kaynak blobu farklı bir adla hedef bloba kopyalayın. Hedef blob aynı blob türünde (blok, ekleme veya sayfa) var olan bir blob olabileceği gibi, kopyalama işlemi tarafından oluşturulan yeni bir blob da olabilir.
  • Kaynak blobu hedef blob yerine aynı ada sahip bir hedef bloba kopyalayın. Bu tür kopyalama işlemi, kaydedilmemiş blokları kaldırır ve hedef blobun meta verilerinin üzerine yazar.
  • Azure Dosya hizmetindeki bir kaynak dosyayı hedef bloba kopyalayın. Hedef blob mevcut bir blok blobu veya kopyalama işlemi tarafından oluşturulan yeni bir blok blobu olabilir. Dosyalardan sayfa bloblarına veya ekleme bloblarına kopyalama desteklenmez.
  • Bir anlık görüntüyü temel blobu üzerinden kopyalayın. Anlık görüntüyü temel blobun konumuna yükseltme yoluyla blobun önceki bir sürümünü geri yükleyebilirsiniz.
  • Bir anlık görüntüyü farklı bir adla hedef bloba kopyalayın. Sonuçta elde edilen hedef blob, anlık görüntü değil yazılabilir bir blobdur.

Kopyalama işleminin kaynak blobu şu türlerden biri olabilir: blok blobu, ekleme blobu, sayfa blobu, blob anlık görüntüsü veya blob sürümü. Kopyalama işlemi her zaman kaynak blob veya dosyanın tamamını kopyalar. Bayt aralığının veya blok kümesinin kopyalanması desteklenmez.

Hedef blob zaten varsa, kaynak blobla aynı blob türünde olmalıdır ve var olan hedef blobun üzerine yazılır. Bir kopyalama işlemi devam ederken hedef blob değiştirilemez ve hedef blob yalnızca bir bekleyen kopyalama işlemine sahip olabilir.

Özellikler, dizin etiketleri, meta veriler ve faturalama gibi işlemler hakkında Copy Blob daha fazla bilgi edinmek için bkz . Blob açıklamalarını kopyalama.

Zaman uyumsuz zamanlamayla blob kopyalama

Bu bölümde, zaman uyumsuz zamanlamayla kopyalama işlemi gerçekleştirmek üzere Python için Azure Depolama istemci kitaplığı tarafından sağlanan yöntemlere genel bir bakış sunulmaktadır.

Aşağıdaki yöntemler Blobu Kopyalama REST API'sini sarmalar ve kaynak blobdan zaman uyumsuz bir veri kopyası başlatır:

copy_status start_copy_from_url ve copy_id içeren bir sözlük döndürür. Copy_status özelliği, kopya zaman uyumlu olarak tamamlandıysa başarılı olur veya kopya zaman uyumsuz olarak başlatıldıysa beklemededir.

Azure'da bir kaynaktan blob kopyalama

Aynı depolama hesabı içindeki bir blobu kopyalıyorsanız işlem zaman uyumlu bir şekilde tamamlanabilir. Kaynak bloba erişim Microsoft Entra Kimliği, paylaşılan erişim imzası (SAS) veya hesap anahtarı aracılığıyla yetkilendirilebilir. Alternatif bir zaman uyumlu kopyalama işlemi için bkz . Python ile kaynak nesne URL'sinden blob kopyalama.

Kopyalama kaynağı farklı bir depolama hesabındaki bir blobsa işlem zaman uyumsuz olarak tamamlanabilir. Kaynak blob genel veya SAS belirteci aracılığıyla yetkilendirilmelidir. SAS belirtecinin Okuma ('r') iznini içermesi gerekir. SAS belirteçleri hakkında daha fazla bilgi edinmek için bkz . Paylaşılan erişim imzalarıyla temsilci erişimi.

Aşağıdaki örnekte, zaman uyumsuz zamanlamayla farklı bir depolama hesabından kaynak blob kopyalamaya yönelik bir senaryo gösterilmektedir. Bu örnekte, eklenen kullanıcı temsilcisi SAS belirteciyle bir kaynak blob URL'si oluşturacağız. Örnekte, istemci kitaplığını kullanarak SAS belirtecinin nasıl oluşturulacağı gösterilmektedir, ancak kendiniz de sağlayabilirsiniz. Örnek ayrıca farklı bir istemciden blobda değişiklik yapılmasını önlemek için kopyalama işlemi sırasında kaynak blobu kiralamayı da gösterir. Kopyalama Copy Blob işlemi başladığında işlem kaynak blobun değerini kaydeder ETag . ETag Kopyalama işlemi tamamlanmadan önce değer değiştirilirse işlem başarısız olur.

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

Not

Kullanıcı temsilcisi SAS belirteçleri, hesap anahtarı yerine Microsoft Entra kimlik bilgileriyle imzalanmış olduğundan daha fazla güvenlik sunar. Kullanıcı temsilcisi SAS belirteci oluşturmak için Microsoft Entra güvenlik sorumlusunun uygun izinlere sahip olması gerekir. Yetkilendirme gereksinimleri için bkz . Kullanıcı Temsilcisi Anahtarı Alma.

Azure dışındaki bir kaynaktan blob kopyalama

Azure dışındaki erişilebilir nesneler de dahil olmak üzere belirli bir URL'de HTTP GET isteği aracılığıyla alınabilen herhangi bir kaynak nesne üzerinde kopyalama işlemi gerçekleştirebilirsiniz. Aşağıdaki örnekte, erişilebilir bir kaynak nesne URL'sinden blob kopyalamaya yönelik bir senaryo gösterilmektedir.

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

Kopyalama işleminin durumunu denetleme

Zaman uyumsuz Copy Blob bir işlemin durumunu denetlemek için get_blob_properties yöntemini yoklayabilir ve kopyalama durumunu devrebilirsiniz.

Aşağıdaki kod örneği, bekleyen kopyalama işleminin durumunu denetlemeyi gösterir:

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

Kopyalama işlemini durdurma

Bekleyen Copy Blob bir işlemin durdurularak sıfır uzunlukta bir hedef blob elde edilir. Ancak hedef blob için meta veriler, kaynak blobdan kopyalanan veya kopyalama işlemi sırasında açıkça ayarlanan yeni değerlere sahiptir. Özgün meta verileri kopyalamadan önce tutmak için, kopyalama yöntemlerinden birini çağırmadan önce hedef blobun anlık görüntüsünü alın.

Bekleyen kopyalama işlemini durdurmak için aşağıdaki işlemi çağırın:

Bu yöntem, Bekleyen Copy Blob işlemi iptal eden Blob Kopyalamayı Durdur REST API işlemini sarmalar. Aşağıdaki kod örneğinde bekleyen Copy Blob bir işlemin nasıl durdurulacakları gösterilmektedir:

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

Kaynaklar

Python için Azure Blob Depolama istemci kitaplığını kullanarak zaman uyumsuz zamanlamayla blobları kopyalama hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın.

Kod örnekleri

REST API işlemleri

Python için Azure SDK, Azure REST API'sinin üzerinde derlenmiş kitaplıklar içerir ve tanıdık Python paradigmalarıyla REST API işlemleriyle etkileşim kurmanızı sağlar. Bu makalede ele alınan istemci kitaplığı yöntemleri aşağıdaki REST API işlemlerini kullanır:

  • Blobu Kopyalama (REST API)
  • Blob Kopyalamayı Durdur (REST API)

İstemci kitaplığı kaynakları

  • Bu makale, Python için Blob Depolama geliştirici kılavuzunun bir parçasıdır. Daha fazla bilgi edinmek için Python uygulamanızı oluşturma makalesinde geliştirici kılavuzu makalelerinin tam listesine bakın.