Aracılığıyla paylaş


TypeScript kullanarak zaman uyumsuz zamanlamayla blob kopyalama

Bu makalede, JavaScript 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 . TypeScript ile kaynak nesne URL'sinden blob kopyalama.

Ön koşullar

  • Bu makaledeki örneklerde JavaScript için Azure Blob Depolama istemci kitaplığıyla çalışmak üzere ayarlanmış bir projeniz olduğu varsayılır. Paket yükleme, modülleri içeri aktarma ve veri kaynaklarıyla çalışacak yetkili bir istemci nesnesi oluşturma gibi projenizi ayarlama hakkında bilgi edinmek için bkz. Azure Blob Depolama ve TypeScript'i kullanmaya başlama.
  • Yetkilendirme mekanizmasının kopyalama işlemi gerçekleştirme veya bekleyen bir kopyayı durdurma izinleri olmalıdır. Daha fazla bilgi edinmek için aşağıdaki REST API işlemi için yetkilendirme kılavuzuna bakın:

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.

Ö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 JavaScript ve TypeScript 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:

yöntemi, beginCopyFromURL kopya tamamlanana kadar süresiz olarak beklemenize olanak tanıyan uzun süre çalışan bir işlem poller döndürür.

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. Değişiklikli zaman uyumlu kopyalama işlemi için bkz . TypeScript 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.

async function copyAcrossStorageAccountsAsync(
  sourceBlob: BlockBlobClient,
  destinationBlob: BlockBlobClient,
  blobServiceClient: BlobServiceClient
): Promise<void> {
  const sourceBlobLease = new BlobLeaseClient(sourceBlob);

  // Create a SAS token that's valid for 1 hour
  const sasToken = await generateUserDelegationSAS(sourceBlob, blobServiceClient);
  const sourceBlobSASURL: string = sourceBlob.url + '?' + sasToken;

  try {
    await sourceBlobLease.acquireLease(-1);

    const copyPoller = await destinationBlob.beginCopyFromURL(sourceBlobSASURL);
    await copyPoller.pollUntilDone();
  } catch (error) {
    console.log(error);
  } finally {
    await sourceBlobLease.releaseLease();
  }
}

async function generateUserDelegationSAS(
  sourceBlob: BlockBlobClient,
  blobServiceClient: BlobServiceClient
): Promise<string> {
  // Get a user delegation key for the Blob service that's valid for 1 hour, as an example
  const delegationKeyStart = new Date();
  const delegationKeyExpiry = new Date(Date.now() + 3600000);
  const userDelegationKey = await blobServiceClient.getUserDelegationKey(
    delegationKeyStart,
    delegationKeyExpiry
  );

  // Create a SAS token that's valid for 1 hour, as an example
  const sasTokenStart = new Date();
  const sasTokenExpiry = new Date(Date.now() + 3600000);
  const blobName = sourceBlob.name;
  const containerName = sourceBlob.containerName;
  const sasOptions = {
    blobName,
    containerName,
    permissions: BlobSASPermissions.parse("r"),
    startsOn: sasTokenStart,
    expiresOn: sasTokenExpiry,
    protocol: SASProtocol.HttpsAndHttp
  };

  const sasToken = generateBlobSASQueryParameters(
    sasOptions,
    userDelegationKey,
    blobServiceClient.accountName
  ).toString();

  return sasToken.toString();
}

Dekont

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.

async function copyFromExternalSource(sourceURL: string,
  destinationBlob: BlockBlobClient
): Promise<void> {
  try {
    const copyPoller = await destinationBlob.beginCopyFromURL(sourceURL);
    await copyPoller.pollUntilDone();
  } catch (error) {
    console.log(error);
  }
}

Kopyalama işleminin durumunu denetleme

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

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

async function checkCopyStatus(destinationBlob: BlockBlobClient): Promise<void> {
  const properties = await destinationBlob.getProperties();
  console.log(properties.copyStatus);
}

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:

async function abortCopy(destinationBlob: BlockBlobClient): Promise<void> {
  const properties = await destinationBlob.getProperties();

  // Check the copy status and abort if pending
  if (properties.copyStatus === "pending") {
    await destinationBlob.abortCopyFromURL(properties.copyId?.toString()!);
  }
}

Kaynaklar

JavaScript ve TypeScript 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.

REST API işlemleri

JavaScript ve TypeScript için Azure SDK, Azure REST API'sinin üzerinde derlenmiş kitaplıklar içerir ve tanıdık dil 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)

Kod örnekleri

İstemci kitaplığı kaynakları